{"components":{"responses":{"InvalidInput":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"INVALID_INPUT \u2014 the domain is not a domain. Not retryable."},"RateLimited":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"RATE_LIMITED \u2014 over the request budget, or the domain is over its fresh-scan cap. Retryable: back off and repeat. Where a recent result exists this returns 200 with a cached body instead of this error."}},"schemas":{"Component":{"description":"One scored area","properties":{"key":{"type":"string"},"max":{"type":"integer"},"name":{"type":"string"},"points":{"type":"integer"},"summary":{"type":"string"}},"type":"object"},"CrawlerView":{"properties":{"agent":{"type":"string"},"blocked":{"type":"boolean"},"chain":{"description":"Each hop: url, status","items":{"properties":{"status":{"type":"integer"},"url":{"type":"string"}},"type":"object"},"type":"array"},"challenge":{"type":"boolean"},"content_type":{"type":"string"},"domain":{"type":"string"},"error":{"nullable":true,"type":"string"},"extract":{"description":"Text the crawler would index","type":"string"},"final_url":{"type":"string"},"headers":{"additionalProperties":{"type":"string"},"type":"object"},"label":{"type":"string"},"ms":{"type":"integer"}},"type":"object"},"DiscoverabilityResult":{"properties":{"cache_age_seconds":{"type":"integer"},"capped":{"type":"boolean"},"components":{"items":{"$ref":"#/components/schemas/Component"},"type":"array"},"domain":{"type":"string"},"grade":{"type":"string"},"held_back":{"description":"Points the cap holds back; components add up to score + held_back","type":"integer"},"open_fixes":{"type":"integer"},"raw":{"type":"integer"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array"},"report_url":{"type":"string"},"score":{"type":"integer"},"verdict":{"type":"string"}},"type":"object"},"EmailResult":{"properties":{"cache_age_seconds":{"type":"integer"},"capped":{"type":"boolean"},"components":{"items":{"$ref":"#/components/schemas/Component"},"type":"array"},"domain":{"type":"string"},"grade":{"type":"string"},"held_back":{"description":"Points the cap holds back; components add up to score + held_back","type":"integer"},"null_mx":{"type":"boolean"},"open_fixes":{"type":"integer"},"provider":{"type":"string"},"raw":{"type":"integer"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array"},"records":{"additionalProperties":{"items":{"type":"object"},"type":"array"},"description":"DNS records found, keyed mx, spf, dkim, dmarc","type":"object"},"report_url":{"type":"string"},"score":{"type":"integer"}},"type":"object"},"Error":{"properties":{"error":{"properties":{"code":{"description":"Stable machine-readable code","enum":["DISABLED","DNS_NXDOMAIN","DNS_SERVFAIL","INTERNAL_ERROR","INVALID_INPUT","NOT_READY","RATE_LIMITED","SCAN_TIMEOUT","SCHEMA_VIOLATION","UPSTREAM_ERROR"],"type":"string"},"domain":{"type":"string"},"message":{"type":"string"},"request_id":{"description":"Quote this to hi@astraverify.com","type":"string"},"retryable":{"description":"true when the same call may succeed later","type":"boolean"},"stage":{"description":"Where it failed, for support","type":"string"}},"type":"object"}},"required":["error"],"type":"object"},"Fix":{"description":"The record, tag or file to add","properties":{"kind":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"},"where":{"type":"string"}},"type":"object"},"Recommendation":{"properties":{"fix":{"$ref":"#/components/schemas/Fix"},"id":{"type":"string"},"scan":{"enum":["email","discoverability"],"type":"string"},"severity":{"enum":["critical","important","info"],"type":"string"},"title":{"type":"string"},"why":{"type":"string"}},"type":"object"},"Report":{"properties":{"discoverability":{"$ref":"#/components/schemas/Score"},"discoverability_cache_age_seconds":{"type":"integer"},"discoverability_error":{"nullable":true,"type":"string"},"domain":{"type":"string"},"email_cache_age_seconds":{"type":"integer"},"email_security":{"$ref":"#/components/schemas/Score"},"live_url":{"description":"The live report page, which rescans when stale","type":"string"},"recommendations":{"items":{"$ref":"#/components/schemas/Recommendation"},"type":"array"},"report_url":{"description":"Saved snapshot of this report (/r/<id>); opens without a rescan","type":"string"}},"type":"object"},"Score":{"properties":{"capped":{"type":"boolean"},"components":{"items":{"$ref":"#/components/schemas/Component"},"type":"array"},"grade":{"type":"string"},"held_back":{"description":"Points the cap holds back; components add up to score + held_back","type":"integer"},"open_fixes":{"type":"integer"},"provider":{"type":"string"},"raw":{"description":"Before cap rules","type":"integer"},"score":{"description":"Out of 100, as shown on the website","type":"integer"},"verdict":{"type":"string"}},"type":"object"}},"securitySchemes":{"apiKey":{"description":"Optional. An AstraVerify API key (from your /my page) lifts the anonymous fresh-scan limits.","scheme":"bearer","type":"http"}}},"info":{"description":"Email Security and Discoverability scores for any domain, with the exact fixes. No account or key is needed. Identical scans inside 15 minutes are served from cache. Budget per caller: 120 requests a minute, 1200 an hour, 10000 a day; assistants share one egress address, so this covers everyone behind it. Fresh DNS-hitting scans are capped at 30 per domain per hour across all clients, and one caller may trigger fresh scans for at most 120 distinct domains an hour. Over a cap, a cached result up to 24 hours old is returned where one exists; otherwise the call returns 429 with code RATE_LIMITED, flagged retryable, carrying a request_id. MCP callers are never IP-blocked.","title":"AstraVerify Domain Trust API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/api/v1/discoverability":{"get":{"operationId":"checkDiscoverability","parameters":[{"description":"The domain to check (no scheme, no path)","in":"query","name":"domain","required":true,"schema":{"type":"string"}},{"description":"Force a fresh scan (rate limited)","in":"query","name":"refresh","required":false,"schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverabilityResult"}}},"description":"Discoverability result"},"400":{"$ref":"#/components/responses/InvalidInput"},"429":{"$ref":"#/components/responses/RateLimited"}},"summary":"Discoverability score and fixes"}},"/api/v1/email":{"get":{"operationId":"checkEmailSecurity","parameters":[{"description":"The domain to check (no scheme, no path)","in":"query","name":"domain","required":true,"schema":{"type":"string"}},{"description":"Force a fresh scan (rate limited)","in":"query","name":"refresh","required":false,"schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailResult"}}},"description":"Email security result"},"400":{"$ref":"#/components/responses/InvalidInput"},"429":{"$ref":"#/components/responses/RateLimited"}},"summary":"Email Security score and fixes"}},"/api/v1/fetch-as":{"get":{"operationId":"fetchAsCrawler","parameters":[{"description":"The domain to check (no scheme, no path)","in":"query","name":"domain","required":true,"schema":{"type":"string"}},{"in":"query","name":"agent","required":true,"schema":{"enum":["googlebot","bingbot","oai-searchbot","perplexitybot","claudebot","gptbot"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrawlerView"}}},"description":"Crawler view"},"400":{"$ref":"#/components/responses/InvalidInput"},"429":{"$ref":"#/components/responses/RateLimited"}},"summary":"What a named crawler receives from the root page"}},"/api/v1/report":{"get":{"operationId":"getReport","parameters":[{"description":"The domain to check (no scheme, no path)","in":"query","name":"domain","required":true,"schema":{"type":"string"}},{"description":"Force a fresh scan (rate limited)","in":"query","name":"refresh","required":false,"schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}},"description":"Report"},"400":{"$ref":"#/components/responses/InvalidInput"},"429":{"$ref":"#/components/responses/RateLimited"}},"summary":"Both scores, open fixes and the report link"}},"/api/v1/verify":{"post":{"operationId":"verifyFix","requestBody":{"content":{"application/json":{"schema":{"properties":{"component":{"enum":["crawl","plumbing","metadata","structured","answer"],"type":"string"},"domain":{"type":"string"}},"required":["domain","component"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverabilityResult"}}},"description":"Updated discoverability result"},"400":{"$ref":"#/components/responses/InvalidInput"},"429":{"$ref":"#/components/responses/RateLimited"}},"summary":"Re-check one discoverability component after a fix"}}},"security":[{},{"apiKey":[]}],"servers":[{"url":"https://astraverify.com"}]}
