{
  "openapi": "3.1.0",
  "info": {
    "title": "Adam Hale Tools paid API (x402)",
    "version": "1.1.0",
    "description": "Web data lookups for agents: PDF and document to Markdown, short audio transcription (Whisper), website screenshots, web page to clean Markdown, domain WHOIS (RDAP) with DNS and email security, robots.txt crawl permissions, plus bulk versions of the free tools at https://tools.adamhaleworks.workers.dev/tools/ (tech stack, SEO meta tags, URL status, sitemap URLs, RSS/Atom to JSON, EU TED tender search). No account or API key; each call is paid in USDC on Base (eip155:8453) to 0x491Fcf30a5aa0483B3cd8C0041d21801F195B3AF.",
    "contact": {
      "name": "Adam Hale Tools",
      "url": "https://tools.adamhaleworks.workers.dev/about/"
    },
    "x-guidance": "Pay-per-call web data lookups for agents, paid in USDC via x402 v2 (scheme exact). Call any endpoint with GET and its query parameters; an unpaid call returns HTTP 402 with the payment terms in the PAYMENT-REQUIRED header (and the body). Retry with a PAYMENT-SIGNATURE header, e.g. using @x402/fetch. Invalid input is rejected with 400 before any payment; calls where every item fails are not charged. Document, transcription and screenshot endpoints run on a daily free-compute allocation: when it is used up they answer 503 with Retry-After before payment, and failed conversions are not settled. All fetching follows robots.txt and refuses private addresses."
  },
  "externalDocs": {
    "description": "Docs, prices and limits",
    "url": "https://tools.adamhaleworks.workers.dev/x402/"
  },
  "servers": [
    {
      "url": "https://tools.adamhaleworks.workers.dev"
    }
  ],
  "x-x402": {
    "x402Version": 2,
    "scheme": "exact",
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "payTo": "0x491Fcf30a5aa0483B3cd8C0041d21801F195B3AF",
    "facilitators": [
      "https://facilitator.payai.network",
      "https://facilitator.xpay.sh"
    ]
  },
  "paths": {
    "/x402/v1/tech-stack": {
      "get": {
        "operationId": "techStack",
        "summary": "Bulk website tech stack lookup",
        "description": "Use when you need to know what a website is built with (CMS, frameworks, analytics, CDN, hosting), who hosts its email and DNS, and how good its security headers are. Up to 3 domains per call; fetches each homepage once, follows robots.txt. Price: $0.005 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "domains",
            "in": "query",
            "required": true,
            "description": "Up to 3 domains or homepage URLs, comma-separated. Public hosts only.",
            "schema": {
              "type": "string"
            },
            "example": "wordpress.org,stripe.com"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.005"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "wordpress.org",
                      "ok": true,
                      "result": {
                        "domain": "wordpress.org",
                        "finalUrl": "https://wordpress.org/",
                        "status": "ok",
                        "httpStatus": 200,
                        "technologies": [
                          {
                            "name": "WordPress",
                            "version": "7.2",
                            "confidence": 100,
                            "categories": [
                              "CMS"
                            ]
                          }
                        ],
                        "cms": "WordPress",
                        "cdn": "Cloudflare",
                        "hosting": null,
                        "title": "Blog Tool, Publishing Platform, and CMS - WordPress.org",
                        "securityHeaders": {
                          "score": 30,
                          "grade": "E"
                        },
                        "dns": {
                          "emailProvider": "Other / self-hosted",
                          "spf": {
                            "policy": "fail"
                          },
                          "dmarc": {
                            "policy": "reject"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/meta-tags": {
      "get": {
        "operationId": "metaTags",
        "summary": "Bulk SEO meta tag and schema check",
        "description": "Use when you need an on-page SEO audit of specific URLs: title and meta description lengths, canonical, robots/noindex, headings, hreflang, Open Graph, Twitter card and JSON-LD rich-result checks, with machine-readable issue codes. Up to 3 URLs per call. Price: $0.004 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "urls",
            "in": "query",
            "required": true,
            "description": "Up to 3 URLs, comma-separated. A bare domain means its https:// homepage. Public hosts only (no IPs, no internal names), ports 80/443.",
            "schema": {
              "type": "string"
            },
            "example": "https://www.python.org/,https://apify.com/"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.004"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "https://www.python.org/",
                      "ok": true,
                      "result": {
                        "finalUrl": "https://www.python.org/",
                        "httpStatus": 200,
                        "indexable": true,
                        "title": "Welcome to Python.org",
                        "titleLength": 21,
                        "metaDescriptionLength": 52,
                        "h1Count": 5,
                        "canonicalUrl": null,
                        "schemaTypes": [
                          "WebSite"
                        ],
                        "issues": [
                          "TITLE_TOO_SHORT",
                          "META_DESCRIPTION_TOO_SHORT",
                          "MULTIPLE_H1",
                          "CANONICAL_MISSING",
                          "TWITTER_CARD_MISSING",
                          "SCHEMA_MISSING_REQUIRED_PROPERTIES"
                        ],
                        "issueCount": 6
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/url-status": {
      "get": {
        "operationId": "urlStatus",
        "summary": "Bulk URL status and redirect checker",
        "description": "Use when you need to know whether links are alive: HTTP status, every redirect hop, final URL and a classification (ok, redirect, broken, restricted, blocked_by_site, disallowed_by_robots_txt, timeout). Up to 10 URLs per call; HEAD first, GET to confirm errors. Price: $0.003 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "urls",
            "in": "query",
            "required": true,
            "description": "Up to 10 URLs, comma-separated. A bare domain means its https:// homepage. Public hosts only (no IPs, no internal names), ports 80/443.",
            "schema": {
              "type": "string"
            },
            "example": "http://apify.com,https://httpbin.org/status/404"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.003"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "http://apify.com",
                      "ok": true,
                      "result": {
                        "url": "http://apify.com/",
                        "status": "redirect",
                        "httpStatus": 200,
                        "finalUrl": "https://apify.com/",
                        "redirectCount": 1,
                        "redirectChain": [
                          {
                            "url": "http://apify.com/",
                            "status": 301
                          }
                        ],
                        "checkedWith": "HEAD",
                        "responseTimeMs": 587
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/sitemap-urls": {
      "get": {
        "operationId": "sitemapUrls",
        "summary": "Sitemap URL extractor (5,000 URLs)",
        "description": "Use when you need the list of pages on a website: finds sitemaps via robots.txt or common paths, follows sitemap indexes, reads gzip, text and feed sitemaps, and returns up to 5,000 URLs with lastmod from up to 20 files. format=csv returns CSV. Price: $0.004 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "A domain (sitemaps found via robots.txt or common paths) or the URL of one sitemap file.",
            "schema": {
              "type": "string"
            },
            "example": "github.blog"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "json (default) or csv.",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "csv"
              ]
            },
            "example": "json"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.004"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "site": "https://github.blog",
                  "source": "robots.txt",
                  "files": [
                    {
                      "url": "https://github.blog/sitemap_index.xml",
                      "kind": "index",
                      "urls": 0,
                      "children": 17
                    }
                  ],
                  "urls": [
                    {
                      "url": "https://github.blog/latest/",
                      "lastmod": "2026-10-08T18:13:52+00:00",
                      "sitemap": "https://github.blog/post-sitemap.xml"
                    }
                  ],
                  "totalUrls": 5000,
                  "capped": true
                }
              },
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/rss-to-json": {
      "get": {
        "operationId": "rssToJson",
        "summary": "RSS, Atom and JSON Feed to JSON (5 feeds)",
        "description": "Use when you need the latest items of news feeds or blogs as clean JSON: accepts feed URLs or plain site URLs (finds the feed via <link rel=alternate>), normalises RSS, RDF, Atom and JSON Feed to one item schema (title, url, publishedAt, author, categories, summary). Up to 5 feeds, 100 items each. Price: $0.003 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "urls",
            "in": "query",
            "required": true,
            "description": "Up to 5 feed or site URLs, comma-separated. A bare domain means its https:// homepage. Public hosts only (no IPs, no internal names), ports 80/443.",
            "schema": {
              "type": "string"
            },
            "example": "github.blog,https://hnrss.org/frontpage"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.003"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "github.blog",
                      "ok": true,
                      "result": {
                        "feed": {
                          "url": "https://github.blog/feed/",
                          "discoveredFrom": "https://github.blog/",
                          "feedType": "RSS 2.0",
                          "title": "The GitHub Blog",
                          "itemCount": 10
                        },
                        "items": [
                          {
                            "title": "Hack the World: Why hackathons are still the best place to learn to build",
                            "url": "https://github.blog/developer-skills/career-growth/hack-the-world-why-hackathons-are-still-the-best-place-to-learn-to-build/",
                            "publishedAt": "2026-10-09T16:00:00Z",
                            "author": "Ed Summers",
                            "categories": [
                              "Career growth"
                            ]
                          }
                        ]
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/ted-search": {
      "get": {
        "operationId": "tedSearch",
        "summary": "EU public tender search (TED), 100 per page",
        "description": "Use when you need EU public procurement notices (tenders, contract notices, awards) from TED: keyword search (comma = OR), optional buyer country (ISO-2) and open-deadline filter, newest first, 100 notices per page, page up to 50. Price: $0.002 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Keywords; a comma separates alternatives (OR), up to 5.",
            "schema": {
              "type": "string"
            },
            "example": "cloud hosting,data centre"
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Buyer country as ISO 3166-1 alpha-2 (EU/EEA + CH), e.g. FR, DE.",
            "schema": {
              "type": "string"
            },
            "example": "FR"
          },
          {
            "name": "open",
            "in": "query",
            "required": false,
            "description": "1 = only notices whose tender deadline has not passed.",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "example": "1"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Result page, 1-50 (100 notices per page).",
            "schema": {
              "type": "string"
            },
            "example": "1"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "terms": [
                    "cloud hosting"
                  ],
                  "country": "FR",
                  "open": false,
                  "page": 1,
                  "totalNotices": 2,
                  "notices": [
                    {
                      "publicationNumber": "315226-2019",
                      "title": "France-Paris: Managed Network Services",
                      "buyerName": "European Securities and Markets Authority (ESMA)",
                      "buyerCountry": "FRA",
                      "publicationDate": "2019-07-08",
                      "noticeTypeLabel": "Contract award notice",
                      "deadline": null,
                      "cpvMain": "72410000",
                      "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/315226-2019"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/page-markdown": {
      "get": {
        "operationId": "pageMarkdown",
        "summary": "Web page to clean Markdown (3 URLs)",
        "description": "Use when you need to read a web page: returns its main content as clean Markdown without navigation, scripts or ads (headings, lists, absolute links, tables, code blocks), plus title, description, language, canonical URL and word count. Up to 3 URLs per call, 100,000 characters each; follows robots.txt and does not get past bot walls. Price: $0.002 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "urls",
            "in": "query",
            "required": true,
            "description": "Up to 3 page URLs, comma-separated. A bare domain means its https:// homepage. Public hosts only (no IPs, no internal names), ports 80/443.",
            "schema": {
              "type": "string"
            },
            "example": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402",
                      "ok": true,
                      "result": {
                        "url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/402",
                        "finalUrl": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402",
                        "httpStatus": 200,
                        "contentType": "text/html",
                        "title": "402 Payment Required - HTTP | MDN",
                        "description": "The HTTP 402 Payment Required client error response status code is a nonstandard response status code reserved for future use.",
                        "lang": "en-US",
                        "canonical": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/402",
                        "markdown": "# 402 Payment Required\n\nThe HTTP **`402 Payment Required`** [client error response](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status#client_error_responses) status code is a **nonstandard** response status code reserved for future use.\n\n…",
                        "wordCount": 322,
                        "linkCount": 14,
                        "contentTruncated": false
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/domain-intel": {
      "get": {
        "operationId": "domainIntel",
        "summary": "Domain WHOIS (RDAP), DNS and email security lookup (3 domains)",
        "description": "Use when you need to know who a domain is registered with and since when (RDAP: registrar, created, expires, age, status, DNSSEC), what its DNS says (A, AAAA, MX, NS, TXT, CAA) and how its email is set up (provider, SPF policy, DMARC policy). No registrant personal data. Up to 3 domains per call. Price: $0.003 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "domains",
            "in": "query",
            "required": true,
            "description": "Up to 3 domains, comma-separated (a URL or email address is reduced to its domain). Public names only.",
            "schema": {
              "type": "string"
            },
            "example": "wordpress.org,stripe.com"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.003"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "wordpress.org",
                      "ok": true,
                      "result": {
                        "domain": "wordpress.org",
                        "registered": true,
                        "registration": {
                          "domain": "wordpress.org",
                          "registrar": "MarkMonitor Inc.",
                          "registrarIanaId": "292",
                          "created": "2003-03-28T01:07:35.665Z",
                          "expires": "2035-03-28T01:07:35.665Z",
                          "ageDays": 8599,
                          "status": [
                            "client delete prohibited",
                            "client transfer prohibited",
                            "client update prohibited"
                          ],
                          "nameservers": [
                            "ns1.wordpress.org",
                            "ns2.wordpress.org",
                            "ns3.wordpress.org",
                            "ns4.wordpress.org"
                          ],
                          "dnssec": false,
                          "rdapServer": "rdap.publicinterestregistry.org"
                        },
                        "rdapNote": null,
                        "dns": {
                          "a": [
                            "66.6.42.252"
                          ],
                          "aaaa": [
                            "2620:109:b00a::4206:2afc"
                          ],
                          "mx": [
                            "smtp2-dca.wordpress.org",
                            "smtp1-dca.wordpress.org"
                          ],
                          "ns": [
                            "ns1.wordpress.org",
                            "ns2.wordpress.org",
                            "ns3.wordpress.org",
                            "ns4.wordpress.org"
                          ],
                          "caa": [
                            "0 iodef \"mailto:caa@wordpress.org\""
                          ],
                          "txt": [
                            "v=spf1 ip4:66.6.42.0/24 ip4:66.155.40.0/24 include:helpscoutemail.com -all"
                          ]
                        },
                        "email": {
                          "provider": "Other / self-hosted",
                          "acceptsMail": true,
                          "spf": {
                            "policy": "fail",
                            "includes": [
                              "helpscoutemail.com"
                            ],
                            "services": [
                              "Help Scout"
                            ]
                          },
                          "dmarc": {
                            "policy": "reject"
                          }
                        },
                        "dnsProvider": null,
                        "verifications": [
                          "Google Search Console / Workspace"
                        ]
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/robots-check": {
      "get": {
        "operationId": "robotsCheck",
        "summary": "robots.txt crawl permission check for AI agents (5 URLs)",
        "description": "Use when you are about to crawl or scrape a URL: tells whether each user agent (default: 13 common AI and search crawlers, or your own tokens) may fetch it under the site's robots.txt (RFC 9309, longest match, '*' fallback), with crawl-delay, the sitemaps robots.txt lists and whether the site publishes /llms.txt. Up to 5 URLs per call. Price: $0.001 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "urls",
            "in": "query",
            "required": true,
            "description": "Up to 5 URLs, comma-separated. A bare domain means its https:// homepage. Public hosts only (no IPs, no internal names), ports 80/443.",
            "schema": {
              "type": "string"
            },
            "example": "https://www.nytimes.com/section/technology,https://github.com/about"
          },
          {
            "name": "agents",
            "in": "query",
            "required": false,
            "description": "User-agent product tokens to check, comma-separated, up to 15 (default: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-User, PerplexityBot, Google-Extended, Googlebot, Bingbot, CCBot, Applebot-Extended, Bytespider, *).",
            "schema": {
              "type": "string"
            },
            "example": "GPTBot,ClaudeBot,*"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.001"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "count": 1,
                  "succeeded": 1,
                  "failed": 0,
                  "results": [
                    {
                      "input": "https://github.com/about",
                      "ok": true,
                      "result": {
                        "url": "https://github.com/about",
                        "robotsTxt": {
                          "url": "https://github.com/robots.txt",
                          "status": 200,
                          "state": "rules",
                          "sitemaps": [],
                          "groups": 8
                        },
                        "agents": {
                          "GPTBot": {
                            "allowed": true,
                            "crawlDelay": 1
                          },
                          "ClaudeBot": {
                            "allowed": true,
                            "crawlDelay": 1
                          },
                          "*": {
                            "allowed": true,
                            "crawlDelay": null
                          }
                        },
                        "llmsTxt": {
                          "present": true,
                          "status": 200,
                          "url": "https://github.com/llms.txt",
                          "firstLine": "# GitHub"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/document-markdown": {
      "get": {
        "operationId": "documentMarkdown",
        "summary": "PDF and document to Markdown (10 MB)",
        "description": "Use when you need the text of a document as Markdown: give the public URL of a PDF (with a text layer), Word DOCX, Excel XLSX/XLSM/XLSB/XLS, OpenDocument ODS/ODT, CSV, HTML, XML or Apple Numbers file up to 10 MB and get Markdown (tables kept), up to 250,000 characters. Text-layer conversion only: scanned PDFs, images, PPTX and encrypted files are refused and not charged. Price: $0.004 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Public URL of the document (PDF, DOCX, XLSX/XLSM/XLSB/XLS, ODS, ODT, CSV, HTML, XML or Numbers), up to 10 MB. No IPs or internal names.",
            "schema": {
              "type": "string"
            },
            "example": "https://bitcoin.org/bitcoin.pdf"
          },
          {
            "name": "filename",
            "in": "query",
            "required": false,
            "description": "Optional file name, used as a format hint and in the result.",
            "schema": {
              "type": "string"
            },
            "example": "bitcoin.pdf"
          },
          {
            "name": "metadata",
            "in": "query",
            "required": false,
            "description": "1 (default) keeps the PDF's metadata block at the top of the Markdown; 0 drops it.",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "example": "0"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.004"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "sourceUrl": "https://bitcoin.org/bitcoin.pdf",
                  "finalUrl": "https://bitcoin.org/bitcoin.pdf",
                  "filename": "bitcoin.pdf",
                  "format": "PDF",
                  "mimeType": "application/pdf",
                  "bytes": 184292,
                  "markdown": "# bitcoin.pdf\n## Contents\n### Page 1\nBitcoin: A Peer-to-Peer Electronic Cash SystemSatoshi Nakamoto\nsatoshin@gmx.com\nwww.bitcoin.orgAbstract. A purely peer-to-peer version of electronic cash would allow online\npayments to be sent directly from one party to another without going through a\nfinancial institution. …",
                  "characters": 21322,
                  "wordCount": 3535,
                  "tokens": 5331,
                  "truncated": false
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Today's free compute for this endpoint (1,000 conversions a day) is used up, or the backend is unavailable. Answered before payment, with Retry-After. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/transcribe-short": {
      "get": {
        "operationId": "transcribeShort",
        "summary": "Short audio transcription (Whisper, 2 MB)",
        "description": "Use when you need a transcript of a short audio clip: give the direct public URL of an MP3, WAV, M4A, OGG, FLAC or WebM file up to 2 MB (and 20 minutes) and get the text, word count, timed segments, WebVTT subtitles and the detected language, from Whisper large-v3-turbo. task=translate returns English. No YouTube or social media pages. Price: $0.01 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Direct public URL of an audio file (MP3, WAV, M4A, OGG, FLAC or WebM), up to 2 MB. No YouTube or social media pages.",
            "schema": {
              "type": "string"
            },
            "example": "https://upload.wikimedia.org/wikipedia/commons/4/46/1941_Roosevelt_speech_pearlharbor_p1.ogg"
          },
          {
            "name": "task",
            "in": "query",
            "required": false,
            "description": "transcribe (default) or translate (into English).",
            "schema": {
              "type": "string",
              "enum": [
                "transcribe",
                "translate"
              ]
            },
            "example": "transcribe"
          },
          {
            "name": "language",
            "in": "query",
            "required": false,
            "description": "Spoken language as an ISO 639-1 code (en, de, es…); detected when omitted.",
            "schema": {
              "type": "string"
            },
            "example": "en"
          },
          {
            "name": "vad",
            "in": "query",
            "required": false,
            "description": "1 (default) filters silence with voice activity detection first; 0 turns it off.",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            },
            "example": "1"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.01"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "sourceUrl": "https://upload.wikimedia.org/wikipedia/commons/4/46/1941_Roosevelt_speech_pearlharbor_p1.ogg",
                  "finalUrl": "https://upload.wikimedia.org/wikipedia/commons/4/46/1941_Roosevelt_speech_pearlharbor_p1.ogg",
                  "mimeType": "audio/ogg",
                  "bytes": 363717,
                  "task": "transcribe",
                  "text": "Yesterday, December 7, 1941, a state which will live in infamy. The United States of America was suddenly and deliberately attacked by naval and air forces of the Empire of Japan.",
                  "wordCount": 31,
                  "noSpeech": false,
                  "detectedLanguage": "en",
                  "languageProbability": 0.997,
                  "durationSeconds": 26.1,
                  "segments": [
                    {
                      "start": 0.24,
                      "end": 12.84,
                      "text": "Yesterday, December 7, 1941, a state which will live in infamy."
                    },
                    {
                      "start": 13.06,
                      "end": 25.07,
                      "text": "The United States of America was suddenly and deliberately attacked by naval and air forces of the Empire of Japan."
                    }
                  ],
                  "vtt": "WEBVTT\n\n00:00.240 --> 00:01.260\n Yesterday,\n\n00:01.660 --> 00:03.360\n December\n\n…",
                  "model": "@cf/openai/whisper-large-v3-turbo"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Today's free compute for this endpoint (about 120 audio minutes a day) is used up, or the backend is unavailable. Answered before payment, with Retry-After. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/screenshot": {
      "get": {
        "operationId": "screenshot",
        "summary": "Website screenshot (desktop or mobile)",
        "description": "Use when you need to see a web page as a browser renders it: one public URL, desktop (1440x900) or mobile (390x844) viewport, PNG or JPEG, returned as the image itself or as JSON with base64 (response=json). Viewport only, no full-page capture, no scripts, cookies or logins; follows robots.txt and does not get past bot walls. Capacity is limited per day. Price: $0.01 USDC per call on Base.",
        "tags": [
          "x402"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Public URL of the web page. No IPs or internal names; ports 80/443.",
            "schema": {
              "type": "string"
            },
            "example": "https://example.com"
          },
          {
            "name": "device",
            "in": "query",
            "required": false,
            "description": "desktop (1440x900, default) or mobile (390x844).",
            "schema": {
              "type": "string",
              "enum": [
                "desktop",
                "mobile"
              ]
            },
            "example": "desktop"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "png (default) or jpeg (quality 80, smaller).",
            "schema": {
              "type": "string",
              "enum": [
                "png",
                "jpeg"
              ]
            },
            "example": "png"
          },
          {
            "name": "response",
            "in": "query",
            "required": false,
            "description": "image (default: the image bytes) or json (metadata plus imageBase64).",
            "schema": {
              "type": "string",
              "enum": [
                "image",
                "json"
              ]
            },
            "example": "image"
          }
        ],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.01"
          },
          "protocols": [
            {
              "x402": {}
            }
          ]
        },
        "responses": {
          "200": {
            "description": "Lookup result (charged).",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "url": "https://example.com/",
                  "finalUrl": "https://example.com/",
                  "device": "desktop",
                  "viewport": {
                    "width": 1440,
                    "height": 900
                  },
                  "mimeType": "image/png",
                  "bytes": 92197,
                  "browserMs": 2526,
                  "imageBase64": "iVBORw0KGgoAAAANSUhEUgAABaAAAAOECAIAAADYLwGFAAAAAXNSR0IArs4c6QAAIABJREFUeJzs3Xd…"
                }
              },
              "image/png": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              },
              "image/jpeg": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, rejected before payment (not charged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment required. The x402 v2 PaymentRequired object is base64 JSON in the PAYMENT-REQUIRED header and repeated in the body.",
            "headers": {
              "PAYMENT-REQUIRED": {
                "schema": {
                  "type": "string"
                },
                "description": "Base64-encoded x402 v2 PaymentRequired"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "422": {
            "description": "Every item failed (for example robots.txt disallows it, or DNS points to a private address). Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "The target host was looked up too often this minute. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Today's free compute for this endpoint (7 browser-minutes a day) is used up, or the backend is unavailable. Answered before payment, with Retry-After. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              }
            },
            "required": [
              "code",
              "message"
            ]
          }
        },
        "required": [
          "error"
        ]
      }
    }
  }
}