{"openapi":"3.1.0","info":{"title":"Contract Guard API","version":"0.1.0","description":"Deterministic JSON Schema validation with explicit violations and conservative opt-in normalization."},"servers":[{"url":"https://contract-guard-production.up.railway.app"}],"paths":{"/healthz":{"get":{"summary":"Service health","responses":{"200":{"description":"Healthy"}}}},"/mcp":{"post":{"summary":"MCP Streamable HTTP endpoint","description":"Remote MCP surface for Contract Guard. Requires X-API-Key.","security":[{"apiKey":[]}],"responses":{"200":{"description":"MCP response"},"401":{"description":"Missing/invalid API key"},"429":{"description":"Usage limit reached"}}}},"/v1/products":{"get":{"summary":"Product registry","responses":{"200":{"description":"Registry"}}}},"/v1/contract-guard/demo":{"post":{"summary":"Run a non-evidence-counted public demo","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payload","schema"],"properties":{"payload":{},"schema":{"type":"object"},"normalize":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Validation result"},"400":{"description":"Invalid schema"},"429":{"description":"Demo limit reached"}}}},"/v1/trial-keys":{"post":{"summary":"Issue a free trial API key","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"customer_id":{"type":"string","maxLength":120},"source":{"type":"string","maxLength":40,"description":"Optional acquisition source label such as postman, apis-io, apis-guru, github, or direct."}}}}}},"responses":{"201":{"description":"Trial key created"},"429":{"description":"Issuance limit reached"},"503":{"description":"Trial issuance not available"}}}},"/v1/account":{"get":{"summary":"Check authenticated key usage and entitlement without consuming quota","security":[{"apiKey":[]}],"responses":{"200":{"description":"Usage and key status; never includes credentials"},"401":{"description":"Missing/invalid key"}}}},"/v1/billing/status":{"get":{"summary":"Billing readiness status","responses":{"200":{"description":"Billing state"}}}},"/v1/billing/checkout":{"post":{"summary":"Create Stripe-hosted subscription Checkout session when live billing is enabled","security":[{"apiKey":[]}],"responses":{"200":{"description":"Checkout URL"},"503":{"description":"Live billing disabled"}}}},"/v1/billing/portal":{"post":{"summary":"Create customer billing portal session when live billing is enabled","security":[{"apiKey":[]}],"responses":{"200":{"description":"Portal URL"},"409":{"description":"No billing customer"},"503":{"description":"Live billing disabled"}}}},"/v1/contract-guard/validate":{"post":{"summary":"Validate using a customer API key","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["payload","schema"],"properties":{"payload":{},"schema":{"type":"object"},"normalize":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Validation result"},"401":{"description":"Missing/invalid API key"},"429":{"description":"Usage limit reached"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key"}}}}