{"openapi":"3.1.0","info":{"title":"Vouchhound API","description":"Trust verification for online merchants. Cross-checks five independent signals.","version":"1.0.0"},"paths":{"/v1/health":{"get":{"tags":["meta"],"summary":"Health","description":"Liveness probe. Returns 200 + timestamp. Used by load balancers and\ncustomer-side uptime monitors.\n\nDeliberately doesn't ping downstreams (Anthropic, crt.sh, archive.org) —\n/v1/health failing should mean \"this server is broken,\" not \"an upstream\nis slow.\" Add /v1/health/deep later if customers need it.","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/score":{"post":{"tags":["scoring"],"summary":"Score V1","description":"Score a store URL for trustworthiness.\n\nReturns the standard envelope: version, request_id, computed_at, data.","operationId":"score_v1_v1_score_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/keys":{"get":{"tags":["admin"],"summary":"List Keys","description":"List all API keys (metadata only; never returns the secret).","operationId":"list_keys_v1_keys_get","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Create Key","description":"Create a new API key. Returns the full key — shown only here, ONCE.","operationId":"create_key_v1_keys_post","parameters":[{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKeyRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/keys/{key_id}":{"delete":{"tags":["admin"],"summary":"Delete Key","description":"Revoke an API key by id. Existing usage rows are kept for the audit trail.","operationId":"delete_key_v1_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}},{"name":"X-Admin-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"CreateKeyRequest":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name","description":"Human-readable label, e.g. 'OpenAI staging' or 'Joe's laptop'."},"tier":{"type":"string","enum":["free","pro","enterprise"],"title":"Tier","default":"free"}},"type":"object","required":["name"],"title":"CreateKeyRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ScoreRequest":{"properties":{"url":{"type":"string","maxLength":500,"minLength":1,"title":"Url","description":"The store URL to score. Bare domain, full URL, or with/without https:// all work."}},"type":"object","required":["url"],"title":"ScoreRequest"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}