{"openapi":"3.1.0","info":{"title":"Supply-chain file validator","version":"1.0.0","description":"Inputs and reports are processed in memory and discarded. No request bodies, raw domains, IPs or results are logged. Registries, robots policies and app metadata use bounded memory caches. Badges retain the domain and summary for at most 24 hours. API keys are optional and must be provisioned separately. SupplyChain asi/sid-to-registry lookup follows industry practice; the 1.0 document does not explicitly specify that URL mapping. Target-file pacing excludes robots discovery and immediate redirects within the same request."},"servers":[{"url":"/api/v1"}],"paths":{"/validate/ads-txt":{"post":{"summary":"Validate ads-txt","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Input"}}}},"responses":{"200":{"description":"Report: inspect error and warning counts"},"400":{"description":"Malformed request"},"401":{"description":"Invalid key or unauthenticated batch"},"404":{"description":"Target file missing; report included"},"413":{"description":"Input exceeds size limit"},"422":{"description":"Unparseable or partially verified input"},"429":{"description":"Rate limited: Retry-After header"},"504":{"description":"Upstream or whole-request timeout"}}}},"/validate/app-ads-txt":{"post":{"summary":"Validate app-ads-txt","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Input"}}}},"responses":{"200":{"description":"Report: inspect error and warning counts"},"400":{"description":"Malformed request"},"401":{"description":"Invalid key or unauthenticated batch"},"404":{"description":"Target file missing; report included"},"413":{"description":"Input exceeds size limit"},"422":{"description":"Unparseable or partially verified input"},"429":{"description":"Rate limited: Retry-After header"},"504":{"description":"Upstream or whole-request timeout"}}}},"/validate/sellers-json":{"post":{"summary":"Validate sellers-json","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Input"}}}},"responses":{"200":{"description":"Report: inspect error and warning counts"},"400":{"description":"Malformed request"},"401":{"description":"Invalid key or unauthenticated batch"},"404":{"description":"Target file missing; report included"},"413":{"description":"Input exceeds size limit"},"422":{"description":"Unparseable or partially verified input"},"429":{"description":"Rate limited: Retry-After header"},"504":{"description":"Upstream or whole-request timeout"}}}},"/validate/supply-chain":{"post":{"summary":"Validate supply-chain","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Input"}}}},"responses":{"200":{"description":"Report: inspect error and warning counts"},"400":{"description":"Malformed request"},"401":{"description":"Invalid key or unauthenticated batch"},"404":{"description":"Target file missing; report included"},"413":{"description":"Input exceeds size limit"},"422":{"description":"Unparseable or partially verified input"},"429":{"description":"Rate limited: Retry-After header"},"504":{"description":"Upstream or whole-request timeout"}}}},"/health":{"get":{"responses":{"200":{"description":"Health, validator version and supported specification versions"}}}},"/validate":{"get":{"parameters":[{"name":"type","in":"query","required":true,"schema":{"enum":["ads-txt","app-ads-txt","sellers-json"]}},{"name":"domain","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Report: inspect error and warning counts"},"400":{"description":"Malformed request"},"401":{"description":"Invalid key or unauthenticated batch"},"404":{"description":"Target file missing; report included"},"413":{"description":"Input exceeds size limit"},"422":{"description":"Unparseable or partially verified input"},"429":{"description":"Rate limited: Retry-After header"},"504":{"description":"Upstream or whole-request timeout"}}}},"/badge/{type}/{domain}.svg":{"get":{"parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"}},{"name":"domain","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Dated status badge; initial response is not checked","content":{"image/svg+xml":{}}}}}}},"components":{"schemas":{"Input":{"type":"object","properties":{"domain":{"type":"string"},"content":{"type":"string","maxLength":2097152},"store_url":{"type":"string","format":"uri"},"bundle":{"type":"string"},"store":{"enum":["google_play","app_store","amazon","roku"]},"domains":{"type":"array","maxItems":50,"items":{"type":"string"}},"schain":{"oneOf":[{"type":"string"},{"type":"object"}]},"ads_txt_domain":{"type":"string"},"options":{"type":"object","properties":{"cross_check":{"type":"boolean","default":true},"follow_partners":{"type":"boolean","default":true}}}}}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer"}}}}