AGENTUTIL

API Reference

Complete API reference for AgentUtil. All tools use the same async pattern.

Quick Start

Base URL

https://api.agentutil.dev

The Pattern

Every tool uses the same async pattern:

# 1. Create a task
POST /v1/tools/{tool}/tasks
{"email": "user@example.com"}
# Response: 202 Accepted
{"task_id": "task_abc123", "poll_url": "/v1/tasks/task_abc123"}
# 2. Poll for result
GET /v1/tasks/task_abc123
# Response when complete
{"status": "complete", "result": {"deliverable": true, ...}}

Payment

Preferred

x402 Micropayments

Just send a request. You'll get a 402 response with payment details. Pay with USDC on Base, then retry with the payment proof.

# 1. Request → 402
POST /v1/tools/email.verify/tasks
← 402 Payment Required
{"x402": {"price": "0.01", "network": "base", "token": "USDC"}}
# 2. Pay + retry
X-Payment-Proof: ...
← 202 Accepted
Alternative

Prepaid API Key

Sign up at agentutil.dev/api-key.

Authorization: Bearer sk_live_...

Tools Reference

Email Verify

email.verify
$0.01
per call

Verify email deliverability and quality

Endpoint
POST /v1/tools/email.verify/tasks
Request
{
  "email": "test@gmail.com"
}
Response
{
  "email": "test@gmail.com",
  "deliverable": true,
  "status": "DELIVERABLE",
  "status_detail": null,
  "quality_score": 0.95,
  "is_format_valid": true,
  "is_smtp_valid": true,
  "is_mx_valid": true,
  "mx_records": [
    "gmail-smtp-in.l.google.com"
  ],
  "is_disposable": false,
  "is_free_email": true,
  "is_role_based": false,
  "is_catchall": false
}
Input Schema
{
  "type": "object",
  "required": [
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "description": "Email address to verify"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "The email address that was verified"
    },
    "deliverable": {
      "type": "boolean",
      "description": "Whether the email is deliverable"
    },
    "status": {
      "type": "string",
      "nullable": true,
      "description": "Deliverability status (DELIVERABLE, UNDELIVERABLE, RISKY, UNKNOWN)"
    },
    "status_detail": {
      "type": "string",
      "nullable": true,
      "description": "Additional detail about the status"
    },
    "quality_score": {
      "type": "number",
      "description": "Quality score from 0 to 1"
    },
    "is_format_valid": {
      "type": "boolean",
      "description": "Whether the email format is valid"
    },
    "is_smtp_valid": {
      "type": "boolean",
      "description": "Whether SMTP validation passed"
    },
    "is_mx_valid": {
      "type": "boolean",
      "description": "Whether MX records exist for the domain"
    },
    "mx_records": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "List of MX records found"
    },
    "is_disposable": {
      "type": "boolean",
      "description": "Whether from a disposable email provider"
    },
    "is_free_email": {
      "type": "boolean",
      "description": "Whether from a free provider (Gmail, Yahoo, etc.)"
    },
    "is_role_based": {
      "type": "boolean",
      "description": "Whether role-based (info@, support@, etc.)"
    },
    "is_catchall": {
      "type": "boolean",
      "description": "Whether the domain is a catch-all"
    }
  }
}

DNS Lookup

dns.lookup
$0.005
per call

Look up DNS records for a domain

Endpoint
POST /v1/tools/dns.lookup/tasks
Request
{
  "domain": "google.com"
}
Response
{
  "domain": "google.com",
  "records": {
    "A": [
      "142.250.80.46"
    ],
    "AAAA": [
      "2607:f8b0:4004:800::200e"
    ],
    "MX": [
      {
        "priority": 10,
        "exchange": "smtp.google.com"
      }
    ],
    "NS": [
      "ns1.google.com",
      "ns2.google.com"
    ],
    "TXT": [
      "v=spf1 include:_spf.google.com ~all"
    ]
  },
  "queried_at": "2026-03-07T08:00:00.000Z"
}
Input Schema
{
  "type": "object",
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name to look up"
    },
    "record_type": {
      "type": "string",
      "enum": [
        "A",
        "AAAA",
        "MX",
        "TXT",
        "NS",
        "CNAME",
        "SOA",
        "SRV",
        "CAA",
        "ALL"
      ],
      "default": "ALL",
      "description": "DNS record type to query. Defaults to ALL"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string"
    },
    "records": {
      "type": "object",
      "description": "Map of record type to results. Only queried types are present.",
      "properties": {
        "A": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "IPv4 addresses"
        },
        "AAAA": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "IPv6 addresses"
        },
        "MX": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "priority": {
                "type": "integer"
              },
              "exchange": {
                "type": "string"
              }
            }
          }
        },
        "TXT": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "NS": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "CNAME": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "SOA": {
          "type": "object",
          "nullable": true,
          "properties": {
            "nsname": {
              "type": "string"
            },
            "hostmaster": {
              "type": "string"
            },
            "serial": {
              "type": "integer"
            },
            "refresh": {
              "type": "integer"
            },
            "retry": {
              "type": "integer"
            },
            "expire": {
              "type": "integer"
            },
            "minttl": {
              "type": "integer"
            }
          }
        },
        "SRV": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "priority": {
                "type": "integer"
              },
              "weight": {
                "type": "integer"
              },
              "port": {
                "type": "integer"
              },
              "name": {
                "type": "string"
              }
            }
          }
        },
        "CAA": {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      }
    },
    "queried_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

IP Geolocate

ip.geolocate
$0.01
per call

Get geographic location and network info for an IP address

Endpoint
POST /v1/tools/ip.geolocate/tasks
Request
{
  "ip": "8.8.8.8"
}
Response
{
  "ip": "8.8.8.8",
  "city": "Mountain View",
  "region": "California",
  "region_code": "CA",
  "country": "United States",
  "country_code": "US",
  "zip": "94043",
  "lat": 37.4056,
  "lng": -122.0775,
  "timezone": "America/Los_Angeles",
  "isp": "Google LLC",
  "organization": "Google LLC",
  "as": "AS15169 Google LLC",
  "is_mobile": false,
  "is_proxy": false,
  "is_hosting": true
}
Input Schema
{
  "type": "object",
  "required": [
    "ip"
  ],
  "properties": {
    "ip": {
      "type": "string",
      "description": "IPv4 or IPv6 address"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "ip": {
      "type": "string"
    },
    "city": {
      "type": "string",
      "nullable": true
    },
    "region": {
      "type": "string",
      "nullable": true,
      "description": "Region/state full name"
    },
    "region_code": {
      "type": "string",
      "nullable": true,
      "description": "Region/state code"
    },
    "country": {
      "type": "string",
      "nullable": true,
      "description": "Country full name"
    },
    "country_code": {
      "type": "string",
      "nullable": true,
      "description": "Two-letter ISO country code"
    },
    "zip": {
      "type": "string",
      "nullable": true
    },
    "lat": {
      "type": "number",
      "nullable": true
    },
    "lng": {
      "type": "number",
      "nullable": true
    },
    "timezone": {
      "type": "string",
      "nullable": true,
      "description": "IANA timezone (e.g. America/Los_Angeles)"
    },
    "isp": {
      "type": "string",
      "nullable": true
    },
    "organization": {
      "type": "string",
      "nullable": true
    },
    "as": {
      "type": "string",
      "nullable": true,
      "description": "Autonomous system number and name"
    },
    "is_mobile": {
      "type": "boolean"
    },
    "is_proxy": {
      "type": "boolean"
    },
    "is_hosting": {
      "type": "boolean",
      "description": "Whether the IP belongs to a hosting/datacenter provider"
    }
  }
}

Geocode Address

geo.locate
$0.005
per call

Convert an address to geographic coordinates

Endpoint
POST /v1/tools/geo.locate/tasks
Request
{
  "address": "1600 Amphitheatre Parkway, Mountain View, CA"
}
Response
{
  "lat": 37.4224,
  "lng": -122.0856,
  "confidence": 0.95,
  "formatted_address": "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
  "components": {
    "house_number": "1600",
    "street": "Amphitheatre Parkway",
    "city": "Mountain View",
    "state": "California",
    "country": "United States",
    "postal_code": "94043"
  }
}
Input Schema
{
  "type": "object",
  "required": [
    "address"
  ],
  "properties": {
    "address": {
      "type": "string",
      "description": "Address to geocode",
      "minLength": 3
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "lat": {
      "type": "number"
    },
    "lng": {
      "type": "number"
    },
    "confidence": {
      "type": "number",
      "description": "Confidence score from 0 to 1"
    },
    "formatted_address": {
      "type": "string",
      "description": "Full formatted address string"
    },
    "components": {
      "type": "object",
      "properties": {
        "house_number": {
          "type": "string",
          "nullable": true
        },
        "street": {
          "type": "string",
          "nullable": true
        },
        "city": {
          "type": "string",
          "nullable": true
        },
        "state": {
          "type": "string",
          "nullable": true
        },
        "country": {
          "type": "string",
          "nullable": true
        },
        "postal_code": {
          "type": "string",
          "nullable": true
        }
      }
    }
  }
}

URL Status

url.status
$0.005
per call

Check if a URL is reachable and get response details

Endpoint
POST /v1/tools/url.status/tasks
Request
{
  "url": "https://example.com"
}
Response
{
  "url": "https://example.com",
  "final_url": "https://example.com/",
  "status_code": 200,
  "status_text": "OK",
  "reachable": true,
  "headers": {
    "content-type": "text/html; charset=UTF-8",
    "server": "ECS"
  },
  "ssl": {
    "valid": true
  },
  "response_time_ms": 156,
  "checked_at": "2026-03-07T08:00:00.000Z"
}
Input Schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "description": "URL to check (http or https)"
    },
    "follow_redirects": {
      "type": "boolean",
      "default": true,
      "description": "Whether to follow redirects"
    },
    "timeout_ms": {
      "type": "integer",
      "default": 10000,
      "maximum": 30000,
      "description": "Request timeout in milliseconds (max 30000)"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Original URL requested"
    },
    "final_url": {
      "type": "string",
      "description": "Final URL after any redirects"
    },
    "status_code": {
      "type": "integer",
      "description": "HTTP status code (0 if unreachable/timeout)"
    },
    "status_text": {
      "type": "string",
      "description": "HTTP status text or error message on failure"
    },
    "reachable": {
      "type": "boolean",
      "description": "Whether the URL returned a successful (2xx) response"
    },
    "headers": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Response headers as key-value pairs"
    },
    "ssl": {
      "type": "object",
      "nullable": true,
      "description": "SSL info for https:// URLs (null for http://)",
      "properties": {
        "valid": {
          "type": "boolean"
        }
      }
    },
    "response_time_ms": {
      "type": "integer",
      "description": "Time taken in milliseconds"
    },
    "checked_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Home Services Request

homeservices.request
$0.05
per call

Submit a service request to a specific professional (from homeservices.search results)

Endpoint
POST /v1/tools/homeservices.request/tasks
Request
{
  "pro_id": "pro_abc123",
  "requester": {
    "name": "John Doe",
    "phone": "415-555-0100"
  },
  "notes": "Leaky faucet in kitchen, needs repair ASAP"
}
Response
{
  "request_id": "req_xk8f2a9c0012",
  "pro_id": "pro_abc123",
  "pro_name": "Bay Area Plumbing",
  "status": "sent",
  "message": "Request sent to Bay Area Plumbing."
}
Input Schema
{
  "type": "object",
  "required": [
    "pro_id",
    "requester",
    "notes"
  ],
  "properties": {
    "pro_id": {
      "type": "string",
      "description": "Professional ID from homeservices.search results (e.g. pro_abc123)"
    },
    "requester": {
      "type": "object",
      "required": [
        "name",
        "phone"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Customer name"
        },
        "phone": {
          "type": "string",
          "description": "Customer phone number"
        },
        "email": {
          "type": "string",
          "format": "email",
          "description": "Customer email (optional)"
        }
      }
    },
    "notes": {
      "type": "string",
      "description": "Job description — details of what work is needed"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "request_id": {
      "type": "string",
      "description": "Unique ID for this service request"
    },
    "pro_id": {
      "type": "string",
      "description": "ID of the professional notified"
    },
    "pro_name": {
      "type": "string",
      "description": "Name of the professional notified"
    },
    "status": {
      "type": "string",
      "description": "Always 'sent' on success"
    },
    "message": {
      "type": "string",
      "description": "Human-readable confirmation message"
    }
  }
}

Browser Screenshot

browser.screenshot
$0.01
per call

Capture a screenshot of a webpage or HTML content

Endpoint
POST /v1/tools/browser.screenshot/tasks
Request
{
  "url": "https://example.com",
  "width": 1280,
  "full_page": true
}
Response
{
  "file_id": "file_abc123def4567890",
  "file_url": "https://1234567890abcdef.r2.cloudflarestorage.com/agentutil/browser/123/screenshot-file_abc123def4567890.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=86400&X-Amz-Signature=...",
  "content_type": "image/png",
  "file_url_notes": "Signed URL will expire in 24 hours. If you need it for longer then download it and store it somewhere",
  "expires_at": "2026-03-12T08:00:00.000Z",
  "expires_in_days": 1,
  "width": 1280,
  "height": 2400,
  "bytes": 145832
}
Input Schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL to capture"
    },
    "html": {
      "type": "string",
      "description": "HTML content to render"
    },
    "width": {
      "type": "integer",
      "default": 1280,
      "description": "Viewport width"
    },
    "height": {
      "type": "integer",
      "default": 800,
      "description": "Viewport height"
    },
    "full_page": {
      "type": "boolean",
      "default": false,
      "description": "Capture full scrollable page"
    },
    "format": {
      "type": "string",
      "enum": [
        "png",
        "jpeg",
        "webp"
      ],
      "default": "png"
    },
    "quality": {
      "type": "integer",
      "default": 80,
      "description": "Quality for jpeg/webp (1-100)"
    },
    "transparent": {
      "type": "boolean",
      "default": false,
      "description": "Transparent background (png only)"
    },
    "wait": {
      "type": "string",
      "enum": [
        "load",
        "dom",
        "idle"
      ],
      "default": "load",
      "description": "When to capture"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "file_id": {
      "type": "string",
      "description": "Stored artifact ID"
    },
    "file_url": {
      "type": "string",
      "description": "24-hour signed URL for the rendered image"
    },
    "content_type": {
      "type": "string",
      "description": "Artifact MIME type"
    },
    "file_url_notes": {
      "type": "string",
      "description": "Notes about the signed URL lifetime"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "Signed URL expiry timestamp"
    },
    "expires_in_days": {
      "type": "integer",
      "description": "Signed URL expiry in days"
    },
    "width": {
      "type": "integer"
    },
    "height": {
      "type": "integer"
    },
    "bytes": {
      "type": "integer"
    }
  }
}

Browser PDF

browser.pdf
$0.01
per call

Render a webpage or HTML content to PDF

Endpoint
POST /v1/tools/browser.pdf/tasks
Request
{
  "url": "https://example.com",
  "size": "a4"
}
Response
{
  "file_id": "file_abc123def4567890",
  "file_url": "https://1234567890abcdef.r2.cloudflarestorage.com/agentutil/browser/123/pdf-file_abc123def4567890.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=86400&X-Amz-Signature=...",
  "content_type": "application/pdf",
  "file_url_notes": "Signed URL will expire in 24 hours. If you need it for longer then download it and store it somewhere",
  "expires_at": "2026-03-12T08:00:00.000Z",
  "expires_in_days": 1,
  "pages": 3,
  "bytes": 234567
}
Input Schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL to render"
    },
    "html": {
      "type": "string",
      "description": "HTML content to render"
    },
    "size": {
      "type": "string",
      "enum": [
        "letter",
        "a4",
        "legal",
        "a3",
        "a5"
      ],
      "default": "letter"
    },
    "landscape": {
      "type": "boolean",
      "default": false
    },
    "margins": {
      "type": "string",
      "default": "0.5in",
      "description": "Page margins (CSS format)"
    },
    "background": {
      "type": "boolean",
      "default": true,
      "description": "Include backgrounds"
    },
    "wait": {
      "type": "string",
      "enum": [
        "load",
        "dom",
        "idle"
      ],
      "default": "load"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "file_id": {
      "type": "string",
      "description": "Stored artifact ID"
    },
    "file_url": {
      "type": "string",
      "description": "24-hour signed URL for the rendered PDF"
    },
    "content_type": {
      "type": "string",
      "description": "Artifact MIME type"
    },
    "file_url_notes": {
      "type": "string",
      "description": "Notes about the signed URL lifetime"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "Signed URL expiry timestamp"
    },
    "expires_in_days": {
      "type": "integer",
      "description": "Signed URL expiry in days"
    },
    "pages": {
      "type": "integer"
    },
    "bytes": {
      "type": "integer"
    }
  }
}

Browser Content

browser.content
$0.005
per call

Get fully rendered HTML content (JavaScript executed)

Endpoint
POST /v1/tools/browser.content/tasks
Request
{
  "url": "https://example.com",
  "wait": "idle"
}
Response
{
  "html": "<!DOCTYPE html>...",
  "title": "Example Domain",
  "bytes": 12345
}
Input Schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "URL to render"
    },
    "wait": {
      "type": "string",
      "enum": [
        "load",
        "dom",
        "idle"
      ],
      "default": "load"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "html": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "bytes": {
      "type": "integer"
    }
  }
}

Browser Markdown

browser.markdown
$0.005
per call

Extract readable content from a webpage as Markdown

Endpoint
POST /v1/tools/browser.markdown/tasks
Request
{
  "url": "https://example.com"
}
Response
{
  "markdown": "# Example Domain\n\nThis domain is...",
  "title": "Example Domain",
  "bytes": 456
}
Input Schema
{
  "type": "object",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "URL to extract from"
    },
    "wait": {
      "type": "string",
      "enum": [
        "load",
        "dom",
        "idle"
      ],
      "default": "load"
    }
  }
}
Output Schema
{
  "type": "object",
  "properties": {
    "markdown": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "bytes": {
      "type": "integer"
    }
  }
}

Browser Scrape

browser.scrape
$0.01
per call

Extract specific elements using named CSS selectors

Endpoint
POST /v1/tools/browser.scrape/tasks
Request
{
  "url": "https://example.com",
  "select": {
    "title": "h1",
    "links": "a"
  }
}
Response
{
  "title": "Example Domain",
  "links": [
    "More information..."
  ]
}
Input Schema
{
  "type": "object",
  "required": [
    "url",
    "select"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "URL to scrape"
    },
    "select": {
      "type": "object",
      "description": "Named selectors: {\"title\": \"h1\", \"prices\": \".price\"}"
    },
    "wait": {
      "type": "string",
      "enum": [
        "load",
        "dom",
        "idle"
      ],
      "default": "load"
    }
  }
}
Output Schema
{
  "type": "object",
  "description": "Named results matching your selectors"
}

Task Lifecycle

pending
running
complete
or
failed
{
  "task_id": "task_abc123",
  "status": "complete",
  "tool": "email.verify",
  "result": { ... },
  "error": "..."
}

Error Handling

StatusMeaningAction
400Invalid inputFix request per error message
402Payment requiredPay via x402 or use API key
404Not foundCheck tool name or task ID
500Server errorRetry or contact support

Discovery

/.well-known/agent-service.jsonService metadata
/.well-known/agent.jsonA2A Agent Card
/openapi.jsonOpenAPI 3.1 spec
/v1/toolsList all tools
/v1/tools/{tool}Tool details

Questions? Email silas@agentutil.dev