{"openapi":"3.1.0","info":{"title":"WebsiteIQ Audit API","version":"1.4.0","description":"Free single-page samples and quoted whole-site audits. WebsiteIQBot obeys robots.txt, rejects private targets, and stops on target-site HTTP 402. Reports are unlisted token-bearing links, excluded from indexing, and retained until deletion is requested.","contact":{"url":"https://websiteiq.xyz/contact/"},"license":{"name":"Proprietary service terms","identifier":"LicenseRef-WebsiteIQ-Terms"}},"servers":[{"url":"https://websiteiq.xyz"}],"paths":{"/api":{"get":{"operationId":"startCanonicalX402Audit","summary":"Pay for a canonical ten-page WebsiteIQ self-audit","description":"Behaviorally discoverable x402 v2 resource. An unpaid GET returns HTTP 402 with PAYMENT-REQUIRED for a fixed, published ten-page WebsiteIQ self-audit priced at $0.01 USDC on Base. A compatible client retries with PAYMENT-SIGNATURE; successful settlement queues that exact scope and returns PAYMENT-RESPONSE plus unlisted status and report URLs.","responses":{"202":{"description":"Payment settled and the fixed ten-page self-audit was queued"},"402":{"description":"Executable x402 v2 challenge in PAYMENT-REQUIRED"},"429":{"description":"Canonical quote generation rate limit reached"},"503":{"description":"Payment runtime, facilitator, or quote storage temporarily unavailable"}}}},"/api/health":{"get":{"operationId":"getHealth","summary":"Service health and public limits","responses":{"200":{"description":"Health response"}}}},"/api/stats":{"get":{"operationId":"getStats","summary":"Aggregate public audit counts","responses":{"200":{"description":"Aggregate counts"}}}},"/api/checks/catalog":{"get":{"operationId":"listChecks","summary":"List public check categories and caveats","responses":{"200":{"description":"Check catalog"}}}},"/api/x402/status":{"get":{"operationId":"getX402Status","summary":"Truthful production-payment status","responses":{"200":{"description":"Current x402 integration status"}}}},"/api/estimate":{"post":{"operationId":"estimateAudit","summary":"Get a robots-aware whole-site audit quote before audit crawling","description":"Reads robots.txt first, discovers standard, namespaced, WordPress, and Yoast-style sitemap indexes, and returns standard and white-label USDC quotes. The minimum covers up to 10 pages: $0.01 standard or $0.02 white-label; additional pages are $0.001 or $0.002 respectively. When the payment runtime is available, a complete payable scope includes quoteId and paidAuditEndpoint.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"whiteLabel":{"type":"boolean","default":false},"branding":{"type":"object","description":"Required when whiteLabel is true; used for paid report presentation, never to replace WebsiteIQ methodology or attribution.","required":["agencyName","presenterName","phone","email","contactConsent"],"properties":{"agencyName":{"type":"string","maxLength":120},"presenterName":{"type":"string","maxLength":120},"phone":{"type":"string","maxLength":40},"email":{"type":"string","format":"email","maxLength":254},"ctaLabel":{"type":"string","maxLength":80},"ctaUrl":{"type":"string","format":"uri","maxLength":500},"marketingMessage":{"type":"string","maxLength":600},"contactConsent":{"type":"boolean","const":true,"description":"Consent to process the supplied agency identity and contact fields for white-label quoting and report presentation."}},"additionalProperties":false}},"additionalProperties":false}}}},"responses":{"200":{"description":"Robots-permitted sitemap estimate and deterministic standard/white-label quote"},"400":{"description":"Invalid URL or incomplete white-label identity"},"422":{"description":"Target could not be estimated safely"},"429":{"description":"Combined requester/target quote abuse limit"}}}},"/api/paid-audits/{quoteId}":{"parameters":[{"name":"quoteId","in":"path","required":true,"schema":{"type":"string","pattern":"^wiq_quote_[a-f0-9]{32}$"}}],"post":{"operationId":"startPaidAudit","summary":"Pay for and start an exact quoted whole-site audit","description":"A request without payment returns HTTP 402 and PAYMENT-REQUIRED. Retry the same quote with an x402 v2 payload in PAYMENT-SIGNATURE. A settled request queues the exact robots-permitted scope and returns PAYMENT-RESPONSE plus token-bearing status and report URLs. Payment identifiers make retries idempotent.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"quoteId":{"type":"string","pattern":"^wiq_quote_[a-f0-9]{32}$"}},"additionalProperties":false}}}},"responses":{"202":{"description":"Payment settled and the quoted audit was queued; PAYMENT-RESPONSE contains settlement evidence"},"402":{"description":"Exact x402 v2 challenge in PAYMENT-REQUIRED"},"409":{"description":"Expired, closed, mismatched, or conflicting quote/payment replay"},"503":{"description":"Payment runtime, facilitator, or queue temporarily unavailable"}}}},"/api/paid-audits":{"post":{"operationId":"startPaidAuditStable","summary":"Pay for and start a current quoted whole-site audit","description":"Stable x402 and Bazaar-compatible adapter for the quote-specific paid resource. Obtain a current quoteId from /api/estimate, send it in JSON, and retry the identical request with PAYMENT-SIGNATURE after reviewing the exact HTTP 402 requirements.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["quoteId"],"properties":{"quoteId":{"type":"string","pattern":"^wiq_quote_[a-f0-9]{32}$"}},"additionalProperties":false}}}},"responses":{"202":{"description":"Payment settled and the quoted audit was queued; PAYMENT-RESPONSE contains settlement evidence"},"400":{"description":"Missing or malformed quoteId"},"402":{"description":"Exact x402 v2 challenge in PAYMENT-REQUIRED, including Bazaar discovery metadata"},"409":{"description":"Expired, closed, mismatched, or conflicting quote/payment replay"},"503":{"description":"Payment runtime, facilitator, or queue temporarily unavailable"}}}},"/api/intake":{"post":{"operationId":"startAudit","summary":"Start a bounded audit","description":"Provides one comprehensive single-page audit per requester IP and per target website per 24 hours. No account, email, or contact consent is required. Abuse controls cross-reference pseudonymous requester-IP, target-website, and combined-pair counters. When x402 is live, an abuse-limited agent receives the exact sitemap-priced HTTP 402 continuation challenge. This free endpoint rejects white-label requests.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"referrer":{"type":"string","format":"uri-reference"},"landingPath":{"type":"string","pattern":"^/"},"utm":{"type":"object","properties":{"source":{"type":"string"},"medium":{"type":"string"},"campaign":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false}}}},"responses":{"202":{"description":"Free audit accepted; returned status and report URLs contain the one-time access token"},"400":{"description":"Invalid input"},"402":{"description":"Daily free limit reached and a payable robots-aware continuation challenge was issued in PAYMENT-REQUIRED"},"409":{"description":"White-label request sent to the free endpoint"},"429":{"description":"Daily free limit reached while payment is unavailable; API clients receive a robots-aware quote preview"},"503":{"description":"Storage or payment challenge unavailable"}}}},"/api/contact":{"post":{"operationId":"submitContact","summary":"Submit the human contact form","description":"Human-facing endpoint protected by Cloudflare Turnstile. Software agents should use /mcp or /api/intake instead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","message","turnstileToken","formStartedAt"],"properties":{"name":{"type":"string","maxLength":120},"email":{"type":"string","format":"email","maxLength":254},"topic":{"type":"string","maxLength":48},"message":{"type":"string","minLength":20,"maxLength":4000},"context":{"type":"string","maxLength":240},"turnstileToken":{"type":"string","maxLength":2048},"formStartedAt":{"type":"integer"}},"additionalProperties":false}}}},"responses":{"202":{"description":"Message accepted"},"400":{"description":"Invalid form or verification"},"403":{"description":"Forbidden Origin"},"503":{"description":"Verification unavailable"}}}},"/api/status/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAuditStatus","summary":"Get privacy-filtered audit status","security":[{"AuditAccessToken":[]}],"responses":{"200":{"description":"Status"},"401":{"description":"Access token required"},"404":{"description":"Not found"}}},"delete":{"operationId":"deleteAudit","summary":"Delete audit metadata, report, and delivery record","security":[{"AuditAccessToken":[]}],"responses":{"200":{"description":"Deleted"},"401":{"description":"Access token required"},"404":{"description":"Not found"}}}},"/api/report/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"operationId":"getAuditReport","summary":"Get pending or complete HTML report","security":[{"AuditAccessToken":[]}],"responses":{"200":{"description":"HTML report","content":{"text/html":{"schema":{"type":"string"}}}},"401":{"description":"Access token required"},"404":{"description":"Not found"}}}}},"components":{"schemas":{"ProblemDetails":{"type":"object","description":"RFC 9457 problem details. The status member matches the HTTP response status.","required":["type","title","status","detail","instance"],"properties":{"type":{"type":"string","format":"uri-reference","default":"about:blank"},"title":{"type":"string"},"status":{"type":"integer","minimum":400,"maximum":599},"detail":{"type":"string"},"instance":{"type":"string","format":"uri-reference"},"allowedMethods":{"type":"array","items":{"type":"string"}}},"additionalProperties":true}},"responses":{"Problem":{"description":"A protocol-appropriate HTTP error. Browser navigation can receive an equivalent noindex HTML recovery page through content negotiation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}}}},"securitySchemes":{"AuditAccessToken":{"type":"apiKey","in":"header","name":"X-WebsiteIQ-Access-Token","description":"Returned once when an audit is created. Bearer authorization and the access query parameter are also supported for report links."}}},"externalDocs":{"description":"WebsiteIQ audit scope and methodology","url":"https://websiteiq.xyz/website-audits/"}}