{"openapi":"3.1.0","info":{"title":"FeeVerdict Facts API","version":"1.0.0","description":"Machine-readable observed brokerage fee facts for active FeeVerdict markets."},"servers":[{"url":"https://feeverdict.com"}],"paths":{"/api/v1/facts/{locale}/{country}/{carrier}/{feeType}/{slug}":{"get":{"summary":"Get fact bundle for a fee spoke page","parameters":[{"name":"locale","in":"path","required":true,"schema":{"type":"string","enum":["en","fr"]}},{"name":"country","in":"path","required":true,"schema":{"type":"string","enum":["ca","us"]}},{"name":"carrier","in":"path","required":true,"schema":{"type":"string"}},{"name":"feeType","in":"path","required":true,"schema":{"type":"string"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Fact bundle JSON"},"404":{"description":"Spoke not found"}}}},"/api/v1/facts/feed":{"get":{"summary":"Published facts DataFeed","responses":{"200":{"description":"DataFeed JSON-LD"}}}},"/api/ask":{"post":{"summary":"Keyword ask over published facts (no generative LLM)","responses":{"200":{"description":"schema.org ItemList of Observations"}}}},"/api/mcp":{"get":{"summary":"MCP-compatible fact tools (JSON V1)","responses":{"200":{"description":"Tool listing / result"}}},"post":{"summary":"Invoke MCP fact tool","responses":{"200":{"description":"Tool result"}}}},"/api/v1/submissions":{"post":{"summary":"Submit an observed brokerage fee (no file upload)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["carrier","feePaid"],"properties":{"countryCode":{"type":"string","default":"ca"},"locale":{"type":"string","enum":["en","fr"]},"carrier":{"type":"string"},"feePaid":{"type":"number"},"parcelValueCad":{"type":"number","nullable":true},"service":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"shipperKind":{"type":"string","enum":["merchant","personal"],"nullable":true},"comment":{"type":"string","maxLength":500}}}}}},"responses":{"201":{"description":"Submission accepted"},"400":{"description":"Validation error"},"420":{"description":"Rate limited"}}}},"/api/v1/stats/{carrier}/{country}":{"get":{"summary":"Get aggregated brokerage fee stats (median/min/max/n only)","parameters":[{"name":"carrier","in":"path","required":true,"schema":{"type":"string"}},{"name":"country","in":"path","required":true,"schema":{"type":"string","enum":["ca","us"]}}],"responses":{"200":{"description":"Aggregated stats JSON"},"404":{"description":"Insufficient data"}}}}}}