{
  "openapi": "3.1.0",
  "info": {
    "title": "Afterwren API",
    "version": "1.0.0",
    "summary": "Drop-in replacements for retired developer APIs: Clearbit Autocomplete (same [{name, domain, logo}] shape), Clearbit Logo, a public-data company profile from a domain, forward and reverse geocoding (US Census with county/tract/block FIPS, OpenStreetMap worldwide), Goodreads-style book search (Open Library) and Wikipedia search. REST + remote MCP server.",
    "description": "Paid API keys from $19/month (Builder: 25,000 calls a month); free tier 100 calls a day per IP with no key. Buy: https://afterwren.cybermaxtools.com/buy/builder?s=lead · all plans: https://afterwren.cybermaxtools.com/docs#pricing\n\nPricing: free tier 100 calls/day per IP, no key. Paid API keys: Builder $19/month = 25,000 calls/month; Pro $49/month = 100,000 calls/month; Team $99/month = 300,000 calls/month; Pay as you go $5 = 5,000 calls (one-time pack); Builder yearly $190/year = 25,000 calls/month; Pro yearly $490/year = 100,000 calls/month; Team yearly $990/year = 300,000 calls/month. Get a key: https://afterwren.cybermaxtools.com/docs#pricing\n\nClearbit-style company autocomplete, logos and company profiles, address geocoding with Census FIPS, book lookup after Goodreads, and encyclopedia search after Bing: one REST API and MCP server built on open public data. 100 free calls a day, no key; plans from $5 (one-time pack) or $19/month.\n\nFree tier: Free tier: 100 calls a day per IP, 30 a minute, no key. Paid keys from $5 (one-time pack) or $19/month (see Get an API key). Every call is one lookup and counts once; failed calls are not counted. Answers are cached at the edge (company and search 6-24 hours, geocodes and logos 7 days); cached: true marks them. Geocoding outside the US uses OpenStreetMap Nominatim, which allows about 1 request a second for the whole service; at busy moments a call may answer 503 busy (retry in a few seconds). US addresses use the Census Geocoder and are not affected. Company profiles read only public sources: the company's homepage, public DNS and Wikidata. No personal data, no employee or contact records. Sites behind a bot wall return blocked: true with DNS and Wikidata facts only. Search covers Wikipedia (English), not the whole web. No key needed. Remote MCP server: https://afterwren.cybermaxtools.com/mcp",
    "contact": {
      "name": "CyberMax",
      "url": "https://cybermax-tools-cybermax.static.hf.space/"
    },
    "license": {
      "name": "Proprietary (free tier + paid API keys)",
      "identifier": "LicenseRef-CyberMax"
    },
    "x-x402": {
      "protocol": "x402",
      "versions": [
        1,
        2
      ],
      "scheme": "exact",
      "network": [
        "base",
        "eip155:8453"
      ],
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "currency": "USDC",
      "price": {
        "perCallUsd": 0.002
      },
      "payPerCallEndpoints": [
        "/x402/v1/companies/suggest",
        "/x402/api/companies/suggest",
        "/x402/api/logo",
        "/x402/api/company",
        "/x402/api/geocode",
        "/x402/api/reverse",
        "/x402/api/books",
        "/x402/api/search"
      ],
      "alsoOn": "the plain endpoints answer 402 with the same terms once the free daily quota is used up (no key sent)",
      "headers": {
        "request": [
          "X-PAYMENT (v1)",
          "PAYMENT-SIGNATURE (v2)"
        ],
        "response": [
          "X-PAYMENT-RESPONSE",
          "PAYMENT-RESPONSE"
        ]
      }
    },
    "x-pricing": {
      "api": "Afterwren API",
      "currency": "USD",
      "free": {
        "price": 0,
        "callsPerDayPerIp": 100,
        "perMinutePerIp": 30,
        "key": "none needed"
      },
      "plans": [
        {
          "id": "builder",
          "name": "Builder",
          "price": 19,
          "billing": "per month",
          "calls": 25000,
          "per": "calendar month (UTC)",
          "perMinute": 120,
          "buy": "https://afterwren.cybermaxtools.com/buy/builder?s=openapi"
        },
        {
          "id": "pro",
          "name": "Pro",
          "price": 49,
          "billing": "per month",
          "calls": 100000,
          "per": "calendar month (UTC)",
          "perMinute": 300,
          "buy": "https://afterwren.cybermaxtools.com/buy/pro?s=openapi"
        },
        {
          "id": "team",
          "name": "Team",
          "price": 99,
          "billing": "per month",
          "calls": 300000,
          "per": "calendar month (UTC)",
          "perMinute": 600,
          "buy": "https://afterwren.cybermaxtools.com/buy/team?s=openapi"
        },
        {
          "id": "pack",
          "name": "Pay as you go",
          "price": 5,
          "billing": "one-time",
          "calls": 5000,
          "per": "until used",
          "perMinute": 120,
          "buy": "https://afterwren.cybermaxtools.com/buy/pack?s=openapi"
        },
        {
          "id": "builder-yearly",
          "name": "Builder yearly",
          "price": 190,
          "billing": "per year",
          "calls": 25000,
          "per": "calendar month (UTC)",
          "perMinute": 120,
          "buy": "https://afterwren.cybermaxtools.com/buy/builder-yearly?s=openapi"
        },
        {
          "id": "pro-yearly",
          "name": "Pro yearly",
          "price": 490,
          "billing": "per year",
          "calls": 100000,
          "per": "calendar month (UTC)",
          "perMinute": 300,
          "buy": "https://afterwren.cybermaxtools.com/buy/pro-yearly?s=openapi"
        },
        {
          "id": "team-yearly",
          "name": "Team yearly",
          "price": 990,
          "billing": "per year",
          "calls": 300000,
          "per": "calendar month (UTC)",
          "perMinute": 600,
          "buy": "https://afterwren.cybermaxtools.com/buy/team-yearly?s=openapi"
        }
      ],
      "unit": "calls",
      "howToUse": {
        "header": "x-api-key: YOUR_KEY",
        "alt": [
          "Authorization: Bearer YOUR_KEY",
          "?key=YOUR_KEY"
        ],
        "mcp": "send the key as Authorization: Bearer YOUR_KEY",
        "usage": "https://afterwren.cybermaxtools.com/key"
      },
      "manageKey": "https://afterwren.cybermaxtools.com/manage",
      "payments": "Stripe Checkout: card, Apple Pay, Google Pay, Link; sales tax/VAT handled by Stripe. Cancel any time at https://afterwren.cybermaxtools.com/manage."
    }
  },
  "servers": [
    {
      "url": "https://afterwren.cybermaxtools.com"
    },
    {
      "url": "https://afterwren.cybermax-tools.workers.dev"
    }
  ],
  "paths": {
    "/v1/companies/suggest": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Autocomplete replacement: company name in, [{name, domain, logo}] out",
        "description": "Same response as autocomplete.clearbit.com/v1/companies/suggest: a JSON array of {name, domain, logo} (plus wikidata and description), best-known companies first. Official websites come from Wikidata (CC0); logo points at /api/logo for that domain.",
        "operationId": "companiesSuggestGet",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Company name or prefix",
            "schema": {
              "type": "string"
            },
            "example": "stripe"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Autocomplete replacement: company name in, [{name, domain, logo}] out",
        "description": "Same response as autocomplete.clearbit.com/v1/companies/suggest: a JSON array of {name, domain, logo} (plus wikidata and description), best-known companies first. Official websites come from Wikidata (CC0); logo points at /api/logo for that domain.",
        "operationId": "companiesSuggestPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ]
              },
              "example": {
                "query": "stripe"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/companies/suggest": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company autocomplete with the free-tier limits wrapped around the results",
        "description": "The same lookup as /v1/companies/suggest, answered as { query, results: [{name, domain, logo, wikidata, description}], cached, limits }.",
        "operationId": "companiesSuggestWrappedGet",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Company name or prefix",
            "schema": {
              "type": "string"
            },
            "example": "stripe"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                },
                "example": {
                  "domain": "stripe.com",
                  "name": "Stripe",
                  "description": "Stripe is a financial services platform that helps all types of businesses accept payments, build flexible billing models, and manage money movement.",
                  "url": "https://stripe.com/",
                  "reachable": true,
                  "blocked": false,
                  "language": "en-US",
                  "logo": "https://commons.wikimedia.org/wiki/Special:FilePath/Stripe_Logo%2C_revised_2016.svg?width=256",
                  "ogImage": "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/stripe.37119086.jpg",
                  "socials": {
                    "github": "https://github.com/stripe"
                  },
                  "email": {
                    "provider": "Google Workspace",
                    "mx": [
                      "aspmx.l.google.com",
                      "alt1.aspmx.l.google.com",
                      "alt2.aspmx.l.google.com",
                      "aspmx2.googlemail.com",
                      "aspmx3.googlemail.com"
                    ],
                    "spf": "v=spf1 ip4:198.2.180.60/32 ip4:13.111.2.227/32 include:spf1.stripe.com include:greenhouse-outbound-mail.stripe.com include:_spf.qualtrics.com ~all"
                  },
                  "facts": {
                    "founded": "2010",
                    "headquarters": "San Francisco",
                    "industry": "financial services",
                    "employees": 2500,
                    "country": "United States",
                    "ticker": null,
                    "exchange": null
                  },
                  "wikidata": "Q7624104",
                  "wikipedia": "https://en.wikipedia.org/wiki/Stripe%2C_Inc.",
                  "sources": [
                    "company homepage",
                    "DNS over HTTPS",
                    "Wikidata (CC0)"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company autocomplete with the free-tier limits wrapped around the results",
        "description": "The same lookup as /v1/companies/suggest, answered as { query, results: [{name, domain, logo, wikidata, description}], cached, limits }.",
        "operationId": "companiesSuggestWrappedPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ]
              },
              "example": {
                "query": "stripe"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                },
                "example": {
                  "domain": "stripe.com",
                  "name": "Stripe",
                  "description": "Stripe is a financial services platform that helps all types of businesses accept payments, build flexible billing models, and manage money movement.",
                  "url": "https://stripe.com/",
                  "reachable": true,
                  "blocked": false,
                  "language": "en-US",
                  "logo": "https://commons.wikimedia.org/wiki/Special:FilePath/Stripe_Logo%2C_revised_2016.svg?width=256",
                  "ogImage": "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/stripe.37119086.jpg",
                  "socials": {
                    "github": "https://github.com/stripe"
                  },
                  "email": {
                    "provider": "Google Workspace",
                    "mx": [
                      "aspmx.l.google.com",
                      "alt1.aspmx.l.google.com",
                      "alt2.aspmx.l.google.com",
                      "aspmx2.googlemail.com",
                      "aspmx3.googlemail.com"
                    ],
                    "spf": "v=spf1 ip4:198.2.180.60/32 ip4:13.111.2.227/32 include:spf1.stripe.com include:greenhouse-outbound-mail.stripe.com include:_spf.qualtrics.com ~all"
                  },
                  "facts": {
                    "founded": "2010",
                    "headquarters": "San Francisco",
                    "industry": "financial services",
                    "employees": 2500,
                    "country": "United States",
                    "ticker": null,
                    "exchange": null
                  },
                  "wikidata": "Q7624104",
                  "wikipedia": "https://en.wikipedia.org/wiki/Stripe%2C_Inc.",
                  "sources": [
                    "company homepage",
                    "DNS over HTTPS",
                    "Wikidata (CC0)"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/logo": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Logo replacement: the company's own best icon for a domain",
        "description": "Reads the site's own markup (apple-touch-icon, icon links incl. SVG, schema.org logo, /favicon.ico) and returns the best image that loads: { domain, logo, kind, sizes, ogImage, alternatives, status }. format=image answers with a 302 redirect to the image, so it works in an <img src> (add &key= for paid limits).",
        "operationId": "companyLogoGet",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "description": "A domain, URL or work email",
            "schema": {
              "type": "string"
            },
            "example": "stripe.com"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "json (default) or image (302 redirect)",
            "schema": {
              "type": "string"
            },
            "example": "json"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Logo replacement: the company's own best icon for a domain",
        "description": "Reads the site's own markup (apple-touch-icon, icon links incl. SVG, schema.org logo, /favicon.ico) and returns the best image that loads: { domain, logo, kind, sizes, ogImage, alternatives, status }. format=image answers with a 302 redirect to the image, so it works in an <img src> (add &key= for paid limits).",
        "operationId": "companyLogoPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "type": "string"
                  }
                },
                "required": [
                  "domain"
                ]
              },
              "example": {
                "domain": "stripe.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/company": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company profile from a domain (Clearbit Company API's public subset)",
        "description": "name, description, url, logo, ogImage, socials (LinkedIn, X, GitHub, Facebook, Instagram, YouTube, TikTok from the homepage), email { provider, mx, spf } from DNS, and facts { founded, headquarters, industry, employees, country, ticker, exchange } from Wikidata when the entity's official website is this domain.",
        "operationId": "companyProfileGet",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "description": "A domain, URL or work email",
            "schema": {
              "type": "string"
            },
            "example": "stripe.com"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company profile from a domain (Clearbit Company API's public subset)",
        "description": "name, description, url, logo, ogImage, socials (LinkedIn, X, GitHub, Facebook, Instagram, YouTube, TikTok from the homepage), email { provider, mx, spf } from DNS, and facts { founded, headquarters, industry, employees, country, ticker, exchange } from Wikidata when the entity's official website is this domain.",
        "operationId": "companyProfilePost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "type": "string"
                  }
                },
                "required": [
                  "domain"
                ]
              },
              "example": {
                "domain": "stripe.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/geocode": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Address or place to coordinates (US Census with FIPS, OpenStreetMap worldwide)",
        "description": "geocoder-style result: { ok, provider, address, lat, lng, latlng, housenumber, street, city, state, postal, country, county, fips { state, county, tract, block } }. US addresses go to the US Census Geocoder (public domain); others, or country=xx, to OpenStreetMap Nominatim (ODbL, attribution included).",
        "operationId": "geocodeGet",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Address or place name",
            "schema": {
              "type": "string"
            },
            "example": "1600 Pennsylvania Ave NW, Washington, DC 20500"
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Optional ISO 3166-1 alpha-2 code (us = Census first)",
            "schema": {
              "type": "string"
            },
            "example": "us"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Address or place to coordinates (US Census with FIPS, OpenStreetMap worldwide)",
        "description": "geocoder-style result: { ok, provider, address, lat, lng, latlng, housenumber, street, city, state, postal, country, county, fips { state, county, tract, block } }. US addresses go to the US Census Geocoder (public domain); others, or country=xx, to OpenStreetMap Nominatim (ODbL, attribution included).",
        "operationId": "geocodePost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q": {
                    "type": "string"
                  },
                  "country": {
                    "type": "string"
                  }
                },
                "required": [
                  "q"
                ]
              },
              "example": {
                "q": "1600 Pennsylvania Ave NW, Washington, DC 20500"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/reverse": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Coordinates to the nearest address, plus US county, tract and block FIPS",
        "description": "result: the nearest OpenStreetMap address (city, state, postal, country); census (US points): state, county and FIPS codes for state, county, tract and block.",
        "operationId": "reverseGeocodeGet",
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "description": "Latitude",
            "schema": {
              "type": "string"
            },
            "example": "38.8977"
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "description": "Longitude",
            "schema": {
              "type": "string"
            },
            "example": "-77.0365"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Coordinates to the nearest address, plus US county, tract and block FIPS",
        "description": "result: the nearest OpenStreetMap address (city, state, postal, country); census (US points): state, county and FIPS codes for state, county, tract and block.",
        "operationId": "reverseGeocodePost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "lat": {
                    "type": "number"
                  },
                  "lng": {
                    "type": "number"
                  }
                },
                "required": [
                  "lat",
                  "lng"
                ]
              },
              "example": {
                "lat": 38.8977,
                "lng": -77.0365
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/books": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Goodreads API replacement: books by title, author or ISBN",
        "description": "Up to 10 books: title, authors, firstPublished, isbn13, isbn10, pages, editions, rating (Open Library readers), ratingsCount, wantToRead, subjects, publishers, cover image and Open Library URL.",
        "operationId": "booksGet",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Title and/or author",
            "schema": {
              "type": "string"
            },
            "example": "dune frank herbert"
          },
          {
            "name": "isbn",
            "in": "query",
            "required": false,
            "description": "ISBN-10 or ISBN-13 instead of q",
            "schema": {
              "type": "string"
            },
            "example": "9780441172719"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1-10, default 5",
            "schema": {
              "type": "string"
            },
            "example": "5"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Goodreads API replacement: books by title, author or ISBN",
        "description": "Up to 10 books: title, authors, firstPublished, isbn13, isbn10, pages, editions, rating (Open Library readers), ratingsCount, wantToRead, subjects, publishers, cover image and Open Library URL.",
        "operationId": "booksPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q": {
                    "type": "string"
                  },
                  "isbn": {
                    "type": "string"
                  },
                  "limit": {
                    "type": "integer"
                  }
                },
                "required": []
              },
              "example": {
                "q": "dune frank herbert"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/search": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Encyclopedia search after Bing Search API: Wikipedia titles, URLs and snippets",
        "description": "Full-text search over English Wikipedia: title, url, snippet, updated, words. A grounded-facts search for agents, not a whole-web index.",
        "operationId": "encyclopediaSearchGet",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Search terms",
            "schema": {
              "type": "string"
            },
            "example": "model context protocol"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1-10, default 5",
            "schema": {
              "type": "string"
            },
            "example": "5"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Encyclopedia search after Bing Search API: Wikipedia titles, URLs and snippets",
        "description": "Full-text search over English Wikipedia: title, url, snippet, updated, words. A grounded-facts search for agents, not a whole-web index.",
        "operationId": "encyclopediaSearchPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q": {
                    "type": "string"
                  },
                  "limit": {
                    "type": "integer"
                  }
                },
                "required": [
                  "q"
                ]
              },
              "example": {
                "q": "model context protocol"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/retired": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Which retired API maps to which Afterwren endpoint (free, not metered)",
        "description": "The list of retired or abandoned APIs Afterwren replaces, their status and the endpoint to call instead.",
        "operationId": "retiredApisGet",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Which retired API maps to which Afterwren endpoint (free, not metered)",
        "description": "The list of retired or abandoned APIs Afterwren replaces, their status and the endpoint to call instead.",
        "operationId": "retiredApisPost",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {},
                "required": []
              },
              "example": {}
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Free tier used up (100/day per IP) or rate/plan limit reached; the body has an upgrade link.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/x402/v1/companies/suggest": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Autocomplete replacement: company name in, [{name, domain, logo}] out (pay per call in USDC via x402, no key)",
        "description": "Same response as autocomplete.clearbit.com/v1/companies/suggest: a JSON array of {name, domain, logo} (plus wikidata and description), best-known companies first. Official websites come from Wikidata (CC0); logo points at /api/logo for that domain.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companiesSuggestGetPayPerCall",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Company name or prefix",
            "schema": {
              "type": "string"
            },
            "example": "stripe"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Autocomplete replacement: company name in, [{name, domain, logo}] out (pay per call in USDC via x402, no key)",
        "description": "Same response as autocomplete.clearbit.com/v1/companies/suggest: a JSON array of {name, domain, logo} (plus wikidata and description), best-known companies first. Official websites come from Wikidata (CC0); logo points at /api/logo for that domain.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companiesSuggestPostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ]
              },
              "example": {
                "query": "stripe"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/companies/suggest": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company autocomplete with the free-tier limits wrapped around the results (pay per call in USDC via x402, no key)",
        "description": "The same lookup as /v1/companies/suggest, answered as { query, results: [{name, domain, logo, wikidata, description}], cached, limits }.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companiesSuggestWrappedGetPayPerCall",
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "description": "Company name or prefix",
            "schema": {
              "type": "string"
            },
            "example": "stripe"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                },
                "example": {
                  "domain": "stripe.com",
                  "name": "Stripe",
                  "description": "Stripe is a financial services platform that helps all types of businesses accept payments, build flexible billing models, and manage money movement.",
                  "url": "https://stripe.com/",
                  "reachable": true,
                  "blocked": false,
                  "language": "en-US",
                  "logo": "https://commons.wikimedia.org/wiki/Special:FilePath/Stripe_Logo%2C_revised_2016.svg?width=256",
                  "ogImage": "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/stripe.37119086.jpg",
                  "socials": {
                    "github": "https://github.com/stripe"
                  },
                  "email": {
                    "provider": "Google Workspace",
                    "mx": [
                      "aspmx.l.google.com",
                      "alt1.aspmx.l.google.com",
                      "alt2.aspmx.l.google.com",
                      "aspmx2.googlemail.com",
                      "aspmx3.googlemail.com"
                    ],
                    "spf": "v=spf1 ip4:198.2.180.60/32 ip4:13.111.2.227/32 include:spf1.stripe.com include:greenhouse-outbound-mail.stripe.com include:_spf.qualtrics.com ~all"
                  },
                  "facts": {
                    "founded": "2010",
                    "headquarters": "San Francisco",
                    "industry": "financial services",
                    "employees": 2500,
                    "country": "United States",
                    "ticker": null,
                    "exchange": null
                  },
                  "wikidata": "Q7624104",
                  "wikipedia": "https://en.wikipedia.org/wiki/Stripe%2C_Inc.",
                  "sources": [
                    "company homepage",
                    "DNS over HTTPS",
                    "Wikidata (CC0)"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company autocomplete with the free-tier limits wrapped around the results (pay per call in USDC via x402, no key)",
        "description": "The same lookup as /v1/companies/suggest, answered as { query, results: [{name, domain, logo, wikidata, description}], cached, limits }.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companiesSuggestWrappedPostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string"
                  }
                },
                "required": [
                  "query"
                ]
              },
              "example": {
                "query": "stripe"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                },
                "example": {
                  "domain": "stripe.com",
                  "name": "Stripe",
                  "description": "Stripe is a financial services platform that helps all types of businesses accept payments, build flexible billing models, and manage money movement.",
                  "url": "https://stripe.com/",
                  "reachable": true,
                  "blocked": false,
                  "language": "en-US",
                  "logo": "https://commons.wikimedia.org/wiki/Special:FilePath/Stripe_Logo%2C_revised_2016.svg?width=256",
                  "ogImage": "https://b.stripecdn.com/mkt-ssr-statics/assets/_next/static/media/stripe.37119086.jpg",
                  "socials": {
                    "github": "https://github.com/stripe"
                  },
                  "email": {
                    "provider": "Google Workspace",
                    "mx": [
                      "aspmx.l.google.com",
                      "alt1.aspmx.l.google.com",
                      "alt2.aspmx.l.google.com",
                      "aspmx2.googlemail.com",
                      "aspmx3.googlemail.com"
                    ],
                    "spf": "v=spf1 ip4:198.2.180.60/32 ip4:13.111.2.227/32 include:spf1.stripe.com include:greenhouse-outbound-mail.stripe.com include:_spf.qualtrics.com ~all"
                  },
                  "facts": {
                    "founded": "2010",
                    "headquarters": "San Francisco",
                    "industry": "financial services",
                    "employees": 2500,
                    "country": "United States",
                    "ticker": null,
                    "exchange": null
                  },
                  "wikidata": "Q7624104",
                  "wikipedia": "https://en.wikipedia.org/wiki/Stripe%2C_Inc.",
                  "sources": [
                    "company homepage",
                    "DNS over HTTPS",
                    "Wikidata (CC0)"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/logo": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Logo replacement: the company's own best icon for a domain (pay per call in USDC via x402, no key)",
        "description": "Reads the site's own markup (apple-touch-icon, icon links incl. SVG, schema.org logo, /favicon.ico) and returns the best image that loads: { domain, logo, kind, sizes, ogImage, alternatives, status }. format=image answers with a 302 redirect to the image, so it works in an <img src> (add &key= for paid limits).\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companyLogoGetPayPerCall",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "description": "A domain, URL or work email",
            "schema": {
              "type": "string"
            },
            "example": "stripe.com"
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "json (default) or image (302 redirect)",
            "schema": {
              "type": "string"
            },
            "example": "json"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Clearbit Logo replacement: the company's own best icon for a domain (pay per call in USDC via x402, no key)",
        "description": "Reads the site's own markup (apple-touch-icon, icon links incl. SVG, schema.org logo, /favicon.ico) and returns the best image that loads: { domain, logo, kind, sizes, ogImage, alternatives, status }. format=image answers with a 302 redirect to the image, so it works in an <img src> (add &key= for paid limits).\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companyLogoPostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "type": "string"
                  }
                },
                "required": [
                  "domain"
                ]
              },
              "example": {
                "domain": "stripe.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/company": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company profile from a domain (Clearbit Company API's public subset) (pay per call in USDC via x402, no key)",
        "description": "name, description, url, logo, ogImage, socials (LinkedIn, X, GitHub, Facebook, Instagram, YouTube, TikTok from the homepage), email { provider, mx, spf } from DNS, and facts { founded, headquarters, industry, employees, country, ticker, exchange } from Wikidata when the entity's official website is this domain.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companyProfileGetPayPerCall",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": false,
            "description": "A domain, URL or work email",
            "schema": {
              "type": "string"
            },
            "example": "stripe.com"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Company profile from a domain (Clearbit Company API's public subset) (pay per call in USDC via x402, no key)",
        "description": "name, description, url, logo, ogImage, socials (LinkedIn, X, GitHub, Facebook, Instagram, YouTube, TikTok from the homepage), email { provider, mx, spf } from DNS, and facts { founded, headquarters, industry, employees, country, ticker, exchange } from Wikidata when the entity's official website is this domain.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "companyProfilePostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "domain": {
                    "type": "string"
                  }
                },
                "required": [
                  "domain"
                ]
              },
              "example": {
                "domain": "stripe.com"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/geocode": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Address or place to coordinates (US Census with FIPS, OpenStreetMap worldwide) (pay per call in USDC via x402, no key)",
        "description": "geocoder-style result: { ok, provider, address, lat, lng, latlng, housenumber, street, city, state, postal, country, county, fips { state, county, tract, block } }. US addresses go to the US Census Geocoder (public domain); others, or country=xx, to OpenStreetMap Nominatim (ODbL, attribution included).\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "geocodeGetPayPerCall",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Address or place name",
            "schema": {
              "type": "string"
            },
            "example": "1600 Pennsylvania Ave NW, Washington, DC 20500"
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "description": "Optional ISO 3166-1 alpha-2 code (us = Census first)",
            "schema": {
              "type": "string"
            },
            "example": "us"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Address or place to coordinates (US Census with FIPS, OpenStreetMap worldwide) (pay per call in USDC via x402, no key)",
        "description": "geocoder-style result: { ok, provider, address, lat, lng, latlng, housenumber, street, city, state, postal, country, county, fips { state, county, tract, block } }. US addresses go to the US Census Geocoder (public domain); others, or country=xx, to OpenStreetMap Nominatim (ODbL, attribution included).\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "geocodePostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q": {
                    "type": "string"
                  },
                  "country": {
                    "type": "string"
                  }
                },
                "required": [
                  "q"
                ]
              },
              "example": {
                "q": "1600 Pennsylvania Ave NW, Washington, DC 20500"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/reverse": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Coordinates to the nearest address, plus US county, tract and block FIPS (pay per call in USDC via x402, no key)",
        "description": "result: the nearest OpenStreetMap address (city, state, postal, country); census (US points): state, county and FIPS codes for state, county, tract and block.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "reverseGeocodeGetPayPerCall",
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "description": "Latitude",
            "schema": {
              "type": "string"
            },
            "example": "38.8977"
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "description": "Longitude",
            "schema": {
              "type": "string"
            },
            "example": "-77.0365"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Coordinates to the nearest address, plus US county, tract and block FIPS (pay per call in USDC via x402, no key)",
        "description": "result: the nearest OpenStreetMap address (city, state, postal, country); census (US points): state, county and FIPS codes for state, county, tract and block.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "reverseGeocodePostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "lat": {
                    "type": "number"
                  },
                  "lng": {
                    "type": "number"
                  }
                },
                "required": [
                  "lat",
                  "lng"
                ]
              },
              "example": {
                "lat": 38.8977,
                "lng": -77.0365
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/books": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Goodreads API replacement: books by title, author or ISBN (pay per call in USDC via x402, no key)",
        "description": "Up to 10 books: title, authors, firstPublished, isbn13, isbn10, pages, editions, rating (Open Library readers), ratingsCount, wantToRead, subjects, publishers, cover image and Open Library URL.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "booksGetPayPerCall",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Title and/or author",
            "schema": {
              "type": "string"
            },
            "example": "dune frank herbert"
          },
          {
            "name": "isbn",
            "in": "query",
            "required": false,
            "description": "ISBN-10 or ISBN-13 instead of q",
            "schema": {
              "type": "string"
            },
            "example": "9780441172719"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1-10, default 5",
            "schema": {
              "type": "string"
            },
            "example": "5"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Goodreads API replacement: books by title, author or ISBN (pay per call in USDC via x402, no key)",
        "description": "Up to 10 books: title, authors, firstPublished, isbn13, isbn10, pages, editions, rating (Open Library readers), ratingsCount, wantToRead, subjects, publishers, cover image and Open Library URL.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "booksPostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q": {
                    "type": "string"
                  },
                  "isbn": {
                    "type": "string"
                  },
                  "limit": {
                    "type": "integer"
                  }
                },
                "required": []
              },
              "example": {
                "q": "dune frank herbert"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    },
    "/x402/api/search": {
      "get": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Encyclopedia search after Bing Search API: Wikipedia titles, URLs and snippets (pay per call in USDC via x402, no key)",
        "description": "Full-text search over English Wikipedia: title, url, snippet, updated, words. A grounded-facts search for agents, not a whole-web index.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "encyclopediaSearchGetPayPerCall",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Search terms",
            "schema": {
              "type": "string"
            },
            "example": "model context protocol"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1-10, default 5",
            "schema": {
              "type": "string"
            },
            "example": "5"
          }
        ],
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      },
      "post": {
        "tags": [
          "Afterwren"
        ],
        "summary": "Encyclopedia search after Bing Search API: Wikipedia titles, URLs and snippets (pay per call in USDC via x402, no key)",
        "description": "Full-text search over English Wikipedia: title, url, snippet, updated, words. A grounded-facts search for agents, not a whole-web index.\n\nPay per call with x402: $0.002 per call in USDC on Base. No key, no account: an unpaid call returns 402 with the payment requirements; retry with the X-PAYMENT (x402 v1) or PAYMENT-SIGNATURE (v2) header.",
        "operationId": "encyclopediaSearchPostPayPerCall",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "q": {
                    "type": "string"
                  },
                  "limit": {
                    "type": "integer"
                  }
                },
                "required": [
                  "q"
                ]
              },
              "example": {
                "q": "model context protocol"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Results (same field names as the bulk version's dataset records) plus the free-tier limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "description": "Invalid input",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or revoked API key",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required: x402 payment requirements (body: x402Version 1 accepts[]; header PAYMENT-REQUIRED: x402 v2)."
          },
          "504": {
            "description": "Took too long; ask for fewer items",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [],
        "x-payment-info": {
          "price": {
            "mode": "fixed",
            "currency": "USD",
            "amount": "0.002"
          },
          "protocols": [
            {
              "x402": {
                "version": [
                  1,
                  2
                ],
                "network": [
                  "base",
                  "eip155:8453"
                ],
                "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "scheme": "exact"
              }
            }
          ]
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "retryAfterSeconds": {
            "type": "integer"
          },
          "limits": {
            "type": "object"
          }
        },
        "required": [
          "error",
          "message"
        ]
      }
    },
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "Optional. Paid plan key from https://afterwren.cybermaxtools.com/docs#pricing; leave out for the free tier."
      },
      "BearerKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "Same key as a Bearer token."
      }
    }
  },
  "x-mcp-server": "https://afterwren.cybermaxtools.com/mcp",
  "externalDocs": {
    "description": "Get an API key (pricing)",
    "url": "https://afterwren.cybermaxtools.com/docs#pricing"
  },
  "security": [
    {},
    {
      "ApiKeyHeader": []
    },
    {
      "BearerKey": []
    }
  ]
}