{"openapi":"3.1.0","info":{"title":"PrimAI OKP API","description":"Open API for Swiss OKP premiums and comparisons","contact":{"name":"PrimAI","url":"https://primai.ch/","email":"hello@primai.ch"},"license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"},"version":"0.1.0"},"servers":[{"url":"http://localhost:8000","description":"Local"},{"url":"https://api.primai.ch","description":"Production"}],"paths":{"/v1/regions/resolve":{"get":{"summary":"Resolve Region","operationId":"resolve_region_v1_regions_resolve_get","parameters":[{"name":"plz","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}$","title":"Plz"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/models":{"get":{"summary":"List Models","operationId":"list_models_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/deductibles":{"get":{"summary":"List Deductibles","operationId":"list_deductibles_v1_deductibles_get","parameters":[{"name":"age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"}},{"name":"yob","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yob"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/insurers":{"get":{"summary":"List Insurers","operationId":"list_insurers_v1_insurers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/quote":{"get":{"summary":"Quote","description":"Universal premium quote endpoint for AI agents","operationId":"quote_v1_quote_get","parameters":[{"name":"plz","in":"query","required":true,"schema":{"type":"string","title":"Plz"}},{"name":"age","in":"query","required":true,"schema":{"type":"integer","title":"Age"}},{"name":"product","in":"query","required":false,"schema":{"type":"string","default":"okp-basic","title":"Product"}},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"deductible","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deductible"}},{"name":"accident","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Accident"}},{"name":"effective_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ai/compare":{"get":{"summary":"Ai Compare","description":"AI-agent-friendly compare endpoint used by the PrimAI chat backend.\n\nReturns ranked offers with summary statistics in the format expected\nby premiums_service.py in primai-api.","operationId":"ai_compare_ai_compare_get","parameters":[{"name":"plz","in":"query","required":true,"schema":{"type":"string","title":"Plz"}},{"name":"age","in":"query","required":true,"schema":{"type":"integer","title":"Age"}},{"name":"deductible","in":"query","required":false,"schema":{"type":"integer","default":2500,"title":"Deductible"}},{"name":"accident","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Accident"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"default":"all","title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/compare":{"get":{"summary":"Compare","operationId":"compare_v1_compare_get","parameters":[{"name":"plz","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plz"}},{"name":"canton","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canton"}},{"name":"insurer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Insurer"}},{"name":"insurers","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Insurers"}},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"deductible","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deductible"}},{"name":"accident","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Accident"}},{"name":"age","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"}},{"name":"yob","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yob"}},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/household/compare":{"post":{"summary":"Household Compare","operationId":"household_compare_v1_household_compare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HouseholdCompareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HouseholdCompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/query":{"get":{"summary":"Nl Query","operationId":"nl_query_v1_query_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/analytics":{"get":{"summary":"Analytics","operationId":"analytics_v1_analytics_get","parameters":[{"name":"group_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(insurer|canton|model|age_band|deductible)$","default":"insurer","title":"Group By"}},{"name":"canton","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canton"}},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"}},{"name":"age_band","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Age Band"}},{"name":"deductible","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deductible"}},{"name":"accident","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Accident"}},{"name":"baseline_insurer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Insurer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyticsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/compare/snapshots":{"post":{"summary":"Create Snapshot","operationId":"create_snapshot_v1_compare_snapshots_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/compare/snapshots/{snapshot_id}":{"get":{"summary":"Get Snapshot","operationId":"get_snapshot_v1_compare_snapshots__snapshot_id__get","parameters":[{"name":"snapshot_id","in":"path","required":true,"schema":{"type":"string","title":"Snapshot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AnalyticsItem":{"properties":{"group":{"type":"string","title":"Group"},"count":{"type":"integer","title":"Count"},"min":{"type":"number","title":"Min"},"max":{"type":"number","title":"Max"},"avg":{"type":"number","title":"Avg"},"currency":{"type":"string","const":"CHF","title":"Currency","default":"CHF"},"delta_vs":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Delta Vs"}},"type":"object","required":["group","count","min","max","avg"],"title":"AnalyticsItem"},"AnalyticsResponse":{"properties":{"currency":{"type":"string","const":"CHF","title":"Currency","default":"CHF"},"group_by":{"type":"string","title":"Group By"},"items":{"items":{"$ref":"#/components/schemas/AnalyticsItem"},"type":"array","title":"Items"},"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"}},"type":"object","required":["group_by","items"],"title":"AnalyticsResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HouseholdCompareRequest":{"properties":{"persons":{"items":{"$ref":"#/components/schemas/Person"},"type":"array","title":"Persons"}},"type":"object","title":"HouseholdCompareRequest"},"HouseholdCompareResponse":{"properties":{"currency":{"type":"string","const":"CHF","title":"Currency","default":"CHF"},"offers":{"items":{"items":{"$ref":"#/components/schemas/Offer"},"type":"array"},"type":"array","title":"Offers"},"household_total":{"type":"number","title":"Household Total"}},"type":"object","required":["offers","household_total"],"title":"HouseholdCompareResponse"},"Offer":{"properties":{"insurer":{"type":"string","title":"Insurer"},"model":{"type":"string","enum":["Standard","HMO","Telmed","Hausarzt"],"title":"Model"},"deductible":{"type":"integer","title":"Deductible"},"accident":{"type":"boolean","title":"Accident"},"age_band":{"type":"string","enum":["child","young_adult","adult","senior"],"title":"Age Band"},"price":{"$ref":"#/components/schemas/OfferPrice"}},"type":"object","required":["insurer","model","deductible","accident","age_band","price"],"title":"Offer"},"OfferPrice":{"properties":{"base":{"type":"number","title":"Base"},"accident":{"type":"number","title":"Accident","default":0.0},"total":{"type":"number","title":"Total"},"currency":{"type":"string","const":"CHF","title":"Currency","default":"CHF"}},"type":"object","required":["base","total"],"title":"OfferPrice"},"Person":{"properties":{"plz":{"type":"string","title":"Plz"},"yob":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Yob"},"age":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Age"},"model":{"anyOf":[{"type":"string","enum":["Standard","HMO","Telmed","Hausarzt"]},{"type":"null"}],"title":"Model"},"deductible":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Deductible"},"accident":{"type":"boolean","title":"Accident","default":true}},"type":"object","required":["plz"],"title":"Person"},"SnapshotCreate":{"properties":{"params":{"additionalProperties":true,"type":"object","title":"Params"},"result":{"additionalProperties":true,"type":"object","title":"Result"}},"type":"object","required":["params","result"],"title":"SnapshotCreate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}