{
  "openapi": "3.1.0",
  "info": {
    "title": "how.is",
    "version": "1.0.0",
    "description": "Domain and IP intelligence priced per call. Unpaid calls get HTTP 402 with machine-readable terms; pay per call with x402 or use a prepaid Bearer key. Guide: https://how.is/llms.txt. MCP: https://how.is/mcp.",
    "x-payment-rails": {
      "x402": {
        "available": true,
        "network": "eip155:84532",
        "live_money": false,
        "note": "Base Sepolia (testnet \u2014 test USDC, no real value)"
      },
      "credits": {
        "available": true,
        "live_money": false,
        "note": "Stripe test mode \u2014 test cards only"
      }
    }
  },
  "servers": [
    {
      "url": "https://how.is"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "Prepaid key from /topup/checkout"
      },
      "x402": {
        "type": "apiKey",
        "in": "header",
        "name": "PAYMENT-SIGNATURE",
        "description": "x402 v2 payment payload (base64), built from the 402's PAYMENT-REQUIRED header"
      }
    }
  },
  "paths": {
    "/v1/domain/profile": {
      "post": {
        "summary": "Domain profile (bundle) \u2014 $0.025",
        "description": "Everything about a domain in one call: DNS, WHOIS, TLS, DNSSEC, email auth, security score, blacklist status, plus IP intelligence for its A record.\n\nReturns: data.sections.{dns,whois,tls,dnssec,email-auth,security-score,blacklist,ip}; data.errors names any section that failed; data.billing says what was delivered.",
        "x-price-usd": 0.025,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_profile",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "Domain profile (bundle) \u2014 $0.025",
        "description": "Everything about a domain in one call: DNS, WHOIS, TLS, DNSSEC, email auth, security score, blacklist status, plus IP intelligence for its A record.\n\nReturns: data.sections.{dns,whois,tls,dnssec,email-auth,security-score,blacklist,ip}; data.errors names any section that failed; data.billing says what was delivered.",
        "x-price-usd": 0.025,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_profile_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/dns": {
      "post": {
        "summary": "DNS records \u2014 $0.005",
        "description": "A, AAAA, MX, NS, TXT and other records for a domain, with resolve timing.\n\nReturns: data.data.records keyed by record type (A, AAAA, MX, NS, TXT, ...); data.data.responseTime.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_dns",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "DNS records \u2014 $0.005",
        "description": "A, AAAA, MX, NS, TXT and other records for a domain, with resolve timing.\n\nReturns: data.data.records keyed by record type (A, AAAA, MX, NS, TXT, ...); data.data.responseTime.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_dns_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/whois": {
      "post": {
        "summary": "WHOIS / RDAP \u2014 $0.005",
        "description": "Registrar, creation and expiry dates, nameservers and status codes for a domain.\n\nReturns: data.data.data: the parsed WHOIS/RDAP record (registrar, dates, nameservers, status).",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_whois",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "WHOIS / RDAP \u2014 $0.005",
        "description": "Registrar, creation and expiry dates, nameservers and status codes for a domain.\n\nReturns: data.data.data: the parsed WHOIS/RDAP record (registrar, dates, nameservers, status).",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_whois_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/tls": {
      "post": {
        "summary": "TLS certificate \u2014 $0.005",
        "description": "Certificate validity, issuer, protocol and days until expiry for a domain.\n\nReturns: data.data: valid, issuer, subject, subjectAltNames, validFrom, validTo, daysUntilExpiry, protocol, cipher, selfSigned.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_tls",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "TLS certificate \u2014 $0.005",
        "description": "Certificate validity, issuer, protocol and days until expiry for a domain.\n\nReturns: data.data: valid, issuer, subject, subjectAltNames, validFrom, validTo, daysUntilExpiry, protocol, cipher, selfSigned.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_tls_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/dnssec": {
      "post": {
        "summary": "DNSSEC \u2014 $0.005",
        "description": "Whether DNSSEC is signed and validates for a domain.\n\nReturns: data.data: isSigned, isValid, validationStatus, chainOfTrust, dsRecords, dnskeyRecords, errors, warnings, recommendations.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_dnssec",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "DNSSEC \u2014 $0.005",
        "description": "Whether DNSSEC is signed and validates for a domain.\n\nReturns: data.data: isSigned, isValid, validationStatus, chainOfTrust, dsRecords, dnskeyRecords, errors, warnings, recommendations.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_dnssec_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/email-auth": {
      "post": {
        "summary": "Email authentication \u2014 $0.005",
        "description": "SPF, DKIM and DMARC records and posture for a domain.\n\nReturns: data.data: spf, dkim, dmarc, mx, overallScore, overallStatus, recommendations.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_email_auth",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "Email authentication \u2014 $0.005",
        "description": "SPF, DKIM and DMARC records and posture for a domain.\n\nReturns: data.data: spf, dkim, dmarc, mx, overallScore, overallStatus, recommendations.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_email_auth_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/security-score": {
      "post": {
        "summary": "Security score \u2014 $0.005",
        "description": "A letter grade and point score for a domain security posture, with the scored items behind it.\n\nReturns: data.data: grade, overallScore, maxPossibleScore, categories[] of scored items.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_security_score",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "Security score \u2014 $0.005",
        "description": "A letter grade and point score for a domain security posture, with the scored items behind it.\n\nReturns: data.data: grade, overallScore, maxPossibleScore, categories[] of scored items.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_security_score_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/domain/blacklist": {
      "post": {
        "summary": "Blacklist status \u2014 $0.005",
        "description": "Whether the addresses behind a domain appear on spam and abuse blocklists.\n\nReturns: data.data.ipResults[]: target, isListed, listingCount, totalChecked.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_blacklist",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "domain"
                ],
                "additionalProperties": false,
                "properties": {
                  "domain": {
                    "type": "string",
                    "maxLength": 253,
                    "description": "A bare domain name, e.g. example.com"
                  }
                }
              },
              "example": {
                "domain": "example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "Blacklist status \u2014 $0.005",
        "description": "Whether the addresses behind a domain appear on spam and abuse blocklists.\n\nReturns: data.data.ipResults[]: target, isListed, listingCount, totalChecked.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "domain": "example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "domain_blacklist_get",
        "parameters": [
          {
            "name": "domain",
            "in": "query",
            "required": true,
            "description": "A bare domain name, e.g. example.com",
            "schema": {
              "type": "string"
            },
            "example": "example.com"
          }
        ]
      }
    },
    "/v1/ip": {
      "post": {
        "summary": "IP intelligence \u2014 $0.005",
        "description": "Network owner (ASN), company, geolocation, privacy flags and abuse contact for an IP address.\n\nReturns: data.data: ip, hostname, city, region, country, asn, company, privacy, carrier, abuse.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "ip": "1.1.1.1"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "ip_lookup",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "ip"
                ],
                "additionalProperties": false,
                "properties": {
                  "ip": {
                    "type": "string",
                    "description": "An IPv4 or IPv6 address"
                  }
                }
              },
              "example": {
                "ip": "1.1.1.1"
              }
            }
          }
        }
      },
      "get": {
        "summary": "IP intelligence \u2014 $0.005",
        "description": "Network owner (ASN), company, geolocation, privacy flags and abuse contact for an IP address.\n\nReturns: data.data: ip, hostname, city, region, country, asn, company, privacy, carrier, abuse.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "ip": "1.1.1.1"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "ip_lookup_get",
        "parameters": [
          {
            "name": "ip",
            "in": "query",
            "required": true,
            "description": "An IPv4 or IPv6 address",
            "schema": {
              "type": "string"
            },
            "example": "1.1.1.1"
          }
        ]
      }
    },
    "/v1/check/site": {
      "post": {
        "summary": "Site status \u2014 $0.005",
        "description": "Live check of one or more URLs: HTTP status, latency, DNS resolve time, resolved IP, TTL, nameservers, TLS days remaining.\n\nReturns: data keyed by URL; each entry has ok, code, ms, dns_ms, ip, ttl, ns, cert_days, server, ts.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "sites": [
            "https://example.com"
          ]
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "site_status",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "sites": {
                    "type": "array",
                    "maxItems": 10,
                    "items": {
                      "type": "string",
                      "format": "uri"
                    },
                    "description": "Up to 10 http(s):// URLs"
                  }
                }
              },
              "example": {
                "sites": [
                  "https://example.com"
                ]
              }
            }
          }
        }
      },
      "get": {
        "summary": "Site status \u2014 $0.005",
        "description": "Live check of one or more URLs: HTTP status, latency, DNS resolve time, resolved IP, TTL, nameservers, TLS days remaining.\n\nReturns: data keyed by URL; each entry has ok, code, ms, dns_ms, ip, ttl, ns, cert_days, server, ts.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "sites": [
            "https://example.com"
          ]
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "site_status_get",
        "parameters": [
          {
            "name": "sites",
            "in": "query",
            "required": false,
            "description": "Up to 10 http(s):// URLs (comma-separated)",
            "schema": {
              "type": "string"
            },
            "example": "https://example.com"
          }
        ]
      }
    },
    "/v1/watch/page": {
      "post": {
        "summary": "Page-change watch \u2014 $0.005",
        "description": "Has this page changed since your last call, and how much? The first call stores a baseline; later calls return a text diff (2% threshold).\n\nReturns: data with baseline, changed, change_pct, added, removed, last_change_ts.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "url": "https://example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "page_watch",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "url"
                ],
                "additionalProperties": false,
                "properties": {
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "An http(s):// URL on the public internet"
                  }
                }
              },
              "example": {
                "url": "https://example.com"
              }
            }
          }
        }
      },
      "get": {
        "summary": "Page-change watch \u2014 $0.005",
        "description": "Has this page changed since your last call, and how much? The first call stores a baseline; later calls return a text diff (2% threshold).\n\nReturns: data with baseline, changed, change_pct, added, removed, last_change_ts.",
        "x-price-usd": 0.005,
        "x-free-sample": {
          "url": "https://example.com"
        },
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "page_watch_get",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "An http(s):// URL on the public internet",
            "schema": {
              "type": "string"
            },
            "example": "https://example.com"
          }
        ]
      }
    },
    "/v1/bots": {
      "post": {
        "summary": "Bot observatory feed \u2014 $0.050",
        "description": "Partner tier of the dns.pizza bot observatory: every network (ASN), named crawler, TLS (JA4) fingerprint and firewall rule seen in the last 7 days, refreshed hourly. The public tier is free at https://dns.pizza/bots.\n\nReturns: data.data: generated_at, networks, bots, fingerprints (the free tier at dns.pizza/bots shows the same shape without fingerprints).",
        "x-price-usd": 0.05,
        "x-free-sample": null,
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "bot_observatory",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": false,
                "properties": {}
              }
            }
          }
        }
      },
      "get": {
        "summary": "Bot observatory feed \u2014 $0.050",
        "description": "Partner tier of the dns.pizza bot observatory: every network (ASN), named crawler, TLS (JA4) fingerprint and firewall rule seen in the last 7 days, refreshed hourly. The public tier is free at https://dns.pizza/bots.\n\nReturns: data.data: generated_at, networks, bots, fingerprints (the free tier at dns.pizza/bots shows the same shape without fingerprints).",
        "x-price-usd": 0.05,
        "x-free-sample": null,
        "security": [
          {
            "bearer": []
          },
          {
            "x402": []
          }
        ],
        "responses": {
          "200": {
            "description": "Paid (or free sample) result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "result": {
                      "type": "string",
                      "description": "One-line human summary"
                    },
                    "data": {
                      "type": "object",
                      "description": "The check's full structured result"
                    },
                    "receipt": {
                      "type": "object",
                      "description": "id, ts, tool, rail, charge_usd, balance_usd"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad input \u2014 the body says what to send; nothing charged"
          },
          "402": {
            "description": "Payment required \u2014 body lists every working rail; PAYMENT-REQUIRED header carries x402 v2 terms"
          },
          "429": {
            "description": "Rate limited"
          },
          "503": {
            "description": "Upstream warming a cold cache \u2014 retry after Retry-After seconds; nothing charged"
          }
        },
        "operationId": "bot_observatory_get"
      }
    }
  }
}