{"openapi":"3.1.0","info":{"title":"assurs.ch — independent LAMal comparison for agents","version":"2.2.0","description":"Read-only official-data premiums, optional direct offer requests sent by our email relay, harmless contact testing and current conditional customer cashback terms. Compare first; if the client wants SPI assistance, show the details and obtain explicit consent before submitOfferRequest. Public mode needs no API key or email account. Check reward status before mentioning any benefit; it is a separate broker payment after contract conclusion and insurer approval, never a lower insurer premium. No endorsement or commission to AI agents. No claims or payment API. This contract does not install tools in ChatGPT, Claude or Gemini."},"servers":[{"url":"https://assurs-contact.onrender.com"}],"security":[],"paths":{"/api/v1/lamal/premiums":{"get":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"compareLamalPremiumsGet","summary":"Compare one profile without creating a lead.","description":"Prefer POST to avoid profile criteria in hosting URL logs. Default offers exactly match the website; eligible_models also includes other eligible models. Deductible and accident examples are assumptions, not advice.","parameters":[{"name":"premium_year","in":"query","required":true,"schema":{"type":"integer","const":2027}},{"name":"postal_code","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{4}$"}},{"name":"municipality","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Official municipality name; required with ambiguous region/model availability unless municipality_bfs is given."}},{"name":"municipality_bfs","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,6}$"}},{"name":"birth_year","in":"query","required":true,"schema":{"type":"integer","minimum":1907,"maximum":2027}},{"name":"deductible_chf","in":"query","required":true,"schema":{"type":"integer","enum":[0,100,200,300,400,500,600,1000,1500,2000,2500],"description":"Age-specific values in metadata. No interpolation."}},{"name":"accident_included","in":"query","required":true,"schema":{"type":"boolean","description":"Explicit choice required. Do not infer legal eligibility to exclude accident cover."}},{"name":"model_group","in":"query","required":true,"schema":{"type":"string","enum":["any","BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]}},{"name":"language","in":"query","required":false,"schema":{"type":"string","enum":["fr","de","it","en"],"default":"fr"}}],"responses":{"200":{"description":"Independent comparison; null results_url means sharing is not configured.","content":{"application/json":{"schema":{"type":"object","required":["status","result_type","profile","data","pricing","offers","eligible_models","results_url","operator","comparison"],"properties":{"status":{"const":"ok"},"result_type":{"const":"non_binding_lamal_premium_comparison"},"profile":{"type":"object","description":"Exact supplied choices plus resolved official region/BFS. Municipality remains null if equivalent locations were not selected."},"data":{"type":"object","required":["authority","dataset_version","last_validated_at","last_successful_official_sync_at","market_scope","limitations"],"properties":{"authority":{"type":"string"},"source_url":{"type":"string","format":"uri"},"dataset_version":{"type":"string"},"last_validated_at":{"type":["string","null"],"format":"date-time"},"last_successful_official_sync_at":{"type":["string","null"],"format":"date-time"},"validation_status":{"type":"string"},"market_scope":{"const":"all_eligible_imported_models_without_distribution_filter"},"manifest_url":{"type":"string","format":"uri"},"limitations":{"type":"array","items":{"type":"string"}},"source_files":{"type":"array","items":{"type":"object"}}}},"pricing":{"type":"object","properties":{"currency":{"const":"CHF"},"period":{"const":"month"},"environmental_rebate_treatment":{"type":"string"},"environmental_credit_monthly_cents":{"type":"integer","minimum":0}}},"eligible_insurer_count":{"type":"integer"},"offers":{"type":"array","maxItems":10,"items":{"$ref":"#/components/schemas/PremiumOffer"}},"eligible_models":{"type":"array","items":{"$ref":"#/components/schemas/PremiumOffer"},"description":"All eligible imported models, same engine and municipal/category filters. Not restricted to broker distribution agreements."},"comparison":{"type":"object","description":"Exact legacy engine result and OFSP verification keys, without the private submission token. Save this object as quote.json for verify-quote.py."},"submission":{"type":"object","description":"Direct optional contact; no email account, signup or form redirect needed. Never put this token in a share link. Obtain informed client consent before sending.","properties":{"endpoint":{"type":"string","format":"uri"},"testEndpoint":{"type":"string","format":"uri"},"enabled":{"type":"boolean"},"comparison":{"$ref":"#/components/schemas/ComparisonRequest"},"comparisonToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"clientConsentRequired":{"const":true}}},"customer_benefits":{"type":"object","required":["status","programs"],"properties":{"status":{"enum":["disabled","active"]},"programs":{"type":"array","items":{"type":"object","required":["program_id","version","status","product_line","payer","basis","amount_chf","trigger","conditions","terms_url","approval"],"properties":{"program_id":{"type":"string"},"version":{"type":"string"},"status":{"const":"active"},"product_line":{"enum":["LAMAL","LCA"]},"payer":{"const":"Swiss Premium Insurance"},"beneficiary":{"const":"customer"},"channel_scope":{"const":"api_agent_requests"},"benefit_kind":{"const":"one_time_cashback"},"currency":{"const":"CHF"},"basis":{"enum":["fixed_chf","one_month_equivalent"]},"amount_chf":{"type":["number","null"]},"amount_determination":{"type":"string"},"trigger":{"const":"contract_concluded_and_insurer_approved"},"requires_policy_activation":{"const":false},"conditions":{"type":"array","items":{"type":"string"}},"paid_separately_by_broker":{"const":true},"changes_insurer_premium":{"const":false},"automatic_payment":{"const":false},"individual_eligibility":{"const":"not_assessed"},"distribution_availability":{"const":"confirm_with_spi"},"approval":{"type":"object","properties":{"source":{"const":"operator_commercial_instruction"},"confirmed_on":{"type":"string"},"independent_legal_verification":{"const":false}}},"terms_url":{"type":"string","format":"uri"},"contact":{"type":"string"}}}}}},"results_url":{"type":["string","null"],"format":"uri"},"adviser_url":{"type":["string","null"],"format":"uri"},"link_expires_at":{"type":["string","null"],"format":"date-time"},"operator":{"type":"object","properties":{"name":{"const":"Swiss Premium Insurance"},"role":{"const":"insurance_broker"},"assistance_is_optional":{"const":true}}}}}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}},"post":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"compareLamalPremiums","summary":"Compare premiums with criteria in the request body.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["premium_year","postal_code","birth_year","deductible_chf","accident_included","model_group"],"properties":{"premium_year":{"type":"integer","const":2027},"postal_code":{"type":"string","pattern":"^[0-9]{4}$"},"municipality":{"type":"string","minLength":1,"maxLength":100,"description":"Official municipality name; required with ambiguous region/model availability unless municipality_bfs is given."},"municipality_bfs":{"type":"string","pattern":"^[0-9]{1,6}$"},"birth_year":{"type":"integer","minimum":1907,"maximum":2027},"deductible_chf":{"type":"integer","enum":[0,100,200,300,400,500,600,1000,1500,2000,2500],"description":"Age-specific values in metadata. No interpolation."},"accident_included":{"type":"boolean","description":"Explicit choice required. Do not infer legal eligibility to exclude accident cover."},"model_group":{"type":"string","enum":["any","BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]},"language":{"type":"string","enum":["fr","de","it","en"],"default":"fr"}}},"example":{"premium_year":2027,"postal_code":"1955","municipality":"Chamoson","birth_year":1988,"deductible_chf":2500,"accident_included":false,"model_group":"TEL_DIG","language":"en"}}}},"responses":{"200":{"description":"Comparison, complete eligible model list, source evidence and public opaque link.","content":{"application/json":{"schema":{"type":"object","required":["status","result_type","profile","data","pricing","offers","eligible_models","results_url","operator","comparison"],"properties":{"status":{"const":"ok"},"result_type":{"const":"non_binding_lamal_premium_comparison"},"profile":{"type":"object","description":"Exact supplied choices plus resolved official region/BFS. Municipality remains null if equivalent locations were not selected."},"data":{"type":"object","required":["authority","dataset_version","last_validated_at","last_successful_official_sync_at","market_scope","limitations"],"properties":{"authority":{"type":"string"},"source_url":{"type":"string","format":"uri"},"dataset_version":{"type":"string"},"last_validated_at":{"type":["string","null"],"format":"date-time"},"last_successful_official_sync_at":{"type":["string","null"],"format":"date-time"},"validation_status":{"type":"string"},"market_scope":{"const":"all_eligible_imported_models_without_distribution_filter"},"manifest_url":{"type":"string","format":"uri"},"limitations":{"type":"array","items":{"type":"string"}},"source_files":{"type":"array","items":{"type":"object"}}}},"pricing":{"type":"object","properties":{"currency":{"const":"CHF"},"period":{"const":"month"},"environmental_rebate_treatment":{"type":"string"},"environmental_credit_monthly_cents":{"type":"integer","minimum":0}}},"eligible_insurer_count":{"type":"integer"},"offers":{"type":"array","maxItems":10,"items":{"$ref":"#/components/schemas/PremiumOffer"}},"eligible_models":{"type":"array","items":{"$ref":"#/components/schemas/PremiumOffer"},"description":"All eligible imported models, same engine and municipal/category filters. Not restricted to broker distribution agreements."},"comparison":{"type":"object","description":"Exact legacy engine result and OFSP verification keys, without the private submission token. Save this object as quote.json for verify-quote.py."},"submission":{"type":"object","description":"Direct optional contact; no email account, signup or form redirect needed. Never put this token in a share link. Obtain informed client consent before sending.","properties":{"endpoint":{"type":"string","format":"uri"},"testEndpoint":{"type":"string","format":"uri"},"enabled":{"type":"boolean"},"comparison":{"$ref":"#/components/schemas/ComparisonRequest"},"comparisonToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"clientConsentRequired":{"const":true}}},"customer_benefits":{"type":"object","required":["status","programs"],"properties":{"status":{"enum":["disabled","active"]},"programs":{"type":"array","items":{"type":"object","required":["program_id","version","status","product_line","payer","basis","amount_chf","trigger","conditions","terms_url","approval"],"properties":{"program_id":{"type":"string"},"version":{"type":"string"},"status":{"const":"active"},"product_line":{"enum":["LAMAL","LCA"]},"payer":{"const":"Swiss Premium Insurance"},"beneficiary":{"const":"customer"},"channel_scope":{"const":"api_agent_requests"},"benefit_kind":{"const":"one_time_cashback"},"currency":{"const":"CHF"},"basis":{"enum":["fixed_chf","one_month_equivalent"]},"amount_chf":{"type":["number","null"]},"amount_determination":{"type":"string"},"trigger":{"const":"contract_concluded_and_insurer_approved"},"requires_policy_activation":{"const":false},"conditions":{"type":"array","items":{"type":"string"}},"paid_separately_by_broker":{"const":true},"changes_insurer_premium":{"const":false},"automatic_payment":{"const":false},"individual_eligibility":{"const":"not_assessed"},"distribution_availability":{"const":"confirm_with_spi"},"approval":{"type":"object","properties":{"source":{"const":"operator_commercial_instruction"},"confirmed_on":{"type":"string"},"independent_legal_verification":{"const":false}}},"terms_url":{"type":"string","format":"uri"},"contact":{"type":"string"}}}}}},"results_url":{"type":["string","null"],"format":"uri"},"adviser_url":{"type":["string","null"],"format":"uri"},"link_expires_at":{"type":["string","null"],"format":"date-time"},"operator":{"type":"object","properties":{"name":{"const":"Swiss Premium Insurance"},"role":{"const":"insurance_broker"},"assistance_is_optional":{"const":true}}}}}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/v1/lamal/metadata":{"get":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"getLamalMetadata","summary":"Read supported years, model definitions, rules, provenance and validation dates.","responses":{"200":{"description":"Metadata; unknown validation/download dates are null, never the build time.","content":{"application/json":{"schema":{"type":"object","properties":{"api_version":{"type":"string"},"supported_years":{"type":"array","items":{"type":"integer"}},"data":{"type":"object","required":["authority","dataset_version","last_validated_at","last_successful_official_sync_at","market_scope","limitations"],"properties":{"authority":{"type":"string"},"source_url":{"type":"string","format":"uri"},"dataset_version":{"type":"string"},"last_validated_at":{"type":["string","null"],"format":"date-time"},"last_successful_official_sync_at":{"type":["string","null"],"format":"date-time"},"validation_status":{"type":"string"},"market_scope":{"const":"all_eligible_imported_models_without_distribution_filter"},"manifest_url":{"type":"string","format":"uri"},"limitations":{"type":"array","items":{"type":"string"}},"source_files":{"type":"array","items":{"type":"object"}}}},"models":{"type":"object"},"age_rules":{"type":"object"},"deductibles_chf":{"type":"object"},"pricing":{"type":"object"},"public_links":{"type":"object"}}}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/compare":{"get":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"readComparisonPage","summary":"Read actual comparison results without JavaScript.","description":"Use either comparison_id alone, or the same complete explicit profile query as GET /api/v1/lamal/premiums. No contact data or reward fields are accepted. Direct query criteria can appear in hosting access logs; prefer the opaque results_url for sharing.","parameters":[{"name":"comparison_id","in":"query","required":false,"schema":{"type":"string"}},{"name":"premium_year","in":"query","required":false,"schema":{"type":"integer","const":2027}},{"name":"postal_code","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{4}$"}},{"name":"municipality","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":100,"description":"Official municipality name; required with ambiguous region/model availability unless municipality_bfs is given."}},{"name":"municipality_bfs","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,6}$"}},{"name":"birth_year","in":"query","required":false,"schema":{"type":"integer","minimum":1907,"maximum":2027}},{"name":"deductible_chf","in":"query","required":false,"schema":{"type":"integer","enum":[0,100,200,300,400,500,600,1000,1500,2000,2500],"description":"Age-specific values in metadata. No interpolation."}},{"name":"accident_included","in":"query","required":false,"schema":{"type":"boolean","description":"Explicit choice required. Do not infer legal eligibility to exclude accident cover."}},{"name":"model_group","in":"query","required":false,"schema":{"type":"string","enum":["any","BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]}},{"name":"language","in":"query","required":false,"schema":{"type":"string","enum":["fr","de","it","en"],"default":"fr"}}],"responses":{"200":{"description":"Noindex HTML; no contacts, private submission token, tracking or cashback promotion.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/v1/adviser/handoffs":{"post":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"createAdviserHandoffLink","summary":"Create an optional user-openable link; does not submit a lead.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["comparison_id"],"properties":{"comparison_id":{"type":"string"},"agentContext":{"type":"object","additionalProperties":false,"required":["name","cashbackRequested"],"properties":{"name":{"type":"string","enum":["muse","chatgpt","claude","gemini","codex","claude_code","coding_agent","other"]},"kind":{"type":"string","enum":["personal_assistant","conversational_assistant","coding_agent"]},"displayName":{"type":"string","minLength":1,"maxLength":80,"description":"Optional custom agent name, no client name or conversation content."},"integrationId":{"type":"string","pattern":"^[a-zA-Z0-9._-]{1,80}$","description":"Self-declared integration identifier, NOT authentication."},"cashbackRequested":{"type":"boolean","description":"Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."}}}}}}}},"responses":{"200":{"description":"Link only; declared attribution is not an eligibility or identity verification.","content":{"application/json":{"schema":{"type":"object","required":["handoff_url","submits_lead","transmits_contact_data"],"properties":{"status":{"const":"ready"},"handoff_url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"},"submits_lead":{"const":false},"transmits_contact_data":{"const":false}}}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/adviser":{"get":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"openAdviserHandoff","summary":"Optional contact page; no information is sent on opening or closing.","parameters":[{"name":"comparison_id","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Contact form if operator-enabled; otherwise contact link. User explicitly submits the chosen contact detail and displayed criteria.","content":{"text/html":{"schema":{"type":"string"}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/v1/rewards/programs":{"get":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"getActiveCustomerRewards","summary":"Check current status and exact conditional customer cashback terms.","description":"Disabled returns no amounts. Active is the operator-approved commercial programme, not confirmed individual eligibility or independent legal certification. Amounts belong to customers, never AI agents. LCA amount stays null until the actual insurer-approved contract is reviewed.","responses":{"200":{"description":"Current programme status. Quote lookup alone never establishes entitlement.","content":{"application/json":{"schema":{"type":"object","required":["status","programs"],"properties":{"status":{"enum":["disabled","active"]},"programs":{"type":"array","items":{"type":"object","required":["program_id","version","status","product_line","payer","basis","amount_chf","trigger","conditions","terms_url","approval"],"properties":{"program_id":{"type":"string"},"version":{"type":"string"},"status":{"const":"active"},"product_line":{"enum":["LAMAL","LCA"]},"payer":{"const":"Swiss Premium Insurance"},"beneficiary":{"const":"customer"},"channel_scope":{"const":"api_agent_requests"},"benefit_kind":{"const":"one_time_cashback"},"currency":{"const":"CHF"},"basis":{"enum":["fixed_chf","one_month_equivalent"]},"amount_chf":{"type":["number","null"]},"amount_determination":{"type":"string"},"trigger":{"const":"contract_concluded_and_insurer_approved"},"requires_policy_activation":{"const":false},"conditions":{"type":"array","items":{"type":"string"}},"paid_separately_by_broker":{"const":true},"changes_insurer_premium":{"const":false},"automatic_payment":{"const":false},"individual_eligibility":{"const":"not_assessed"},"distribution_availability":{"const":"confirm_with_spi"},"approval":{"type":"object","properties":{"source":{"const":"operator_commercial_instruction"},"confirmed_on":{"type":"string"},"independent_legal_verification":{"const":false}}},"terms_url":{"type":"string","format":"uri"},"contact":{"type":"string"}}}}}}}}},"400":{"description":"Malformed request or missing field. Correct the indicated field.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"404":{"description":"Unknown postcode or unavailable resource.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"405":{"description":"Method not supported.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Dataset changed; recalculate before using the link.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"410":{"description":"Shared link expired; calculate again.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request too large.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"POST requires application/json.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"422":{"description":"Invalid year, age, deductible, accident choice, model or unresolved municipality.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Data/service unavailable. Never fabricate a price or infer submission success.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/v1/rewards/terms/{program_id}":{"get":{"x-openai-isConsequential":false,"x-mcp-annotations":{"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true},"operationId":"getActiveRewardTerms","summary":"Read current active programme terms as JSON.","parameters":[{"name":"program_id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Operator-approved commercial terms and their approval source.","content":{"application/json":{"schema":{"type":"object","required":["program_id","version","status","product_line","payer","basis","amount_chf","trigger","conditions","terms_url","approval"],"properties":{"program_id":{"type":"string"},"version":{"type":"string"},"status":{"const":"active"},"product_line":{"enum":["LAMAL","LCA"]},"payer":{"const":"Swiss Premium Insurance"},"beneficiary":{"const":"customer"},"channel_scope":{"const":"api_agent_requests"},"benefit_kind":{"const":"one_time_cashback"},"currency":{"const":"CHF"},"basis":{"enum":["fixed_chf","one_month_equivalent"]},"amount_chf":{"type":["number","null"]},"amount_determination":{"type":"string"},"trigger":{"const":"contract_concluded_and_insurer_approved"},"requires_policy_activation":{"const":false},"conditions":{"type":"array","items":{"type":"string"}},"paid_separately_by_broker":{"const":true},"changes_insurer_premium":{"const":false},"automatic_payment":{"const":false},"individual_eligibility":{"const":"not_assessed"},"distribution_availability":{"const":"confirm_with_spi"},"approval":{"type":"object","properties":{"source":{"const":"operator_commercial_instruction"},"confirmed_on":{"type":"string"},"independent_legal_verification":{"const":false}}},"terms_url":{"type":"string","format":"uri"},"contact":{"type":"string"}}}}}},"404":{"description":"No active terms for this programme.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limited. Respect Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["status","code","guidance"],"properties":{"status":{"const":"error"},"code":{"type":"string"},"guidance":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/lamal/v1/places":{"get":{"operationId":"resolveMunicipalities","summary":"Resolve a Swiss postcode before calculating.","parameters":[{"name":"postcode","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{4}$"}}],"responses":{"200":{"description":"Possible communes and whether a choice is needed. Empty locations means an unknown postcode.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"requiresCommune":{"type":"boolean"},"locations":{"type":"array","items":{"type":"object","properties":{"bfs":{"type":"string"},"commune":{"type":"string"},"canton":{"type":"string"},"region":{"type":"string"},"locality":{"type":"string"}}}}}}}}},"400":{"description":"Malformed JSON, invalid criteria, unresolved commune, missing client consent or invalid contact. No email sent.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request body exceeds 24,000 bytes.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"Use Content-Type: application/json.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After. Calculation limits are separate from the shared contact send quota.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"500":{"description":"Calculation temporarily unavailable; do not invent prices.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/lamal/v1/compare":{"post":{"operationId":"calculateHousehold","summary":"Calculate up to ten offers with the website’s engine.","description":"Require the client’s tariff year, birth year, postcode, exact deductible, accident choice and care type. Do not guess missing choices. Resolve ambiguous communes first. No contact details, email, subscription or consent is required to calculate. Amounts are integer CHF centimes; net already deducts the environmental credit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComparisonRequest"},"example":{"year":2027,"members":[{"birthYear":1988,"postcode":"1955","bfs":"6022","franchise":2500,"accident":"OHN","careType":"TEL_DIG"}]}}}},"responses":{"200":{"description":"Calculated offers with verification data and a short-lived submission token.","content":{"application/json":{"schema":{"type":"object","required":["ok","tariffYear","currency","amountUnit","offers","verification","submission"],"properties":{"ok":{"type":"boolean","const":true},"tariffYear":{"type":"integer"},"currency":{"type":"string","const":"CHF"},"amountUnit":{"type":"string","const":"centime"},"redistributionMonthlyCentsPerPerson":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"eligibleInsurerCount":{"type":"integer"},"knownReferenceCount":{"type":"integer"},"referenceMonthlyCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"offers":{"type":"array","maxItems":10,"items":{"type":"object","required":["rank","insurerId","insurerName","monthlyCents","annualCents","people"],"properties":{"rank":{"type":"integer"},"insurerId":{"type":"integer"},"insurerName":{"type":"string"},"monthlyCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"annualCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"monthlySavingCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"annualSavingCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"people":{"type":"array","items":{"type":"object","required":["memberIndex","productKey","monthlyGrossCents","monthlyNetCents"],"properties":{"memberIndex":{"type":"integer"},"productKey":{"type":"string"},"modelName":{"type":"string"},"careType":{"type":"string"},"careTypeLabel":{"type":"string"},"monthlyGrossCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"monthlyNetCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"referenceMonthlyCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"referenceKind":{"type":["string","null"]},"monthlySavingCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."}}}}}}},"limitations":{"type":"array","items":{"type":"string"}},"sources":{"type":"object"},"verification":{"type":"object","description":"Exact criteria, per-member OFSP lookup keys, source URLs and SHA-256 fingerprints, catalogue/module hashes and independent Python verifier.","properties":{"criteria":{"$ref":"#/components/schemas/ComparisonRequest"},"revision":{"type":"string"},"manifestUrl":{"type":"string"},"hashes":{"type":"object"},"sourceFiles":{"type":"array","items":{"type":"object"}},"members":{"type":"array","items":{"type":"object"}},"verifierUrl":{"type":"string"},"instructions":{"type":"string"}}},"submission":{"type":"object","required":["endpoint","comparisonToken","expiresAt","clientConsentRequired"],"properties":{"endpoint":{"type":"string"},"comparisonToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"clientConsentRequired":{"type":"boolean","const":true}}}}}}}},"400":{"description":"Malformed JSON, invalid criteria, unresolved commune, missing client consent or invalid contact. No email sent.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request body exceeds 24,000 bytes.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"Use Content-Type: application/json.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After. Calculation limits are separate from the shared contact send quota.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"500":{"description":"Calculation temporarily unavailable; do not invent prices.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}},"get":{"operationId":"calculateIndividual","summary":"Calculate one person via an ordinary HTTP GET.","description":"Prefer POST for a household or to keep criteria out of URL/access logs. Same explicit criteria and results as POST.","parameters":[{"name":"year","in":"query","required":true,"schema":{"type":"integer","const":2027}},{"name":"birthYear","in":"query","required":true,"schema":{"type":"integer","minimum":1907,"maximum":2027}},{"name":"postcode","in":"query","required":true,"schema":{"type":"string","pattern":"^[0-9]{4}$"}},{"name":"bfs","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,6}$","description":"Commune OFS, obligatoire uniquement si le NPA couvre des régions ou des modèles disponibles différents. Vérifier requiresCommune dans places(postcode)."}},{"name":"franchise","in":"query","required":true,"schema":{"type":"integer","enum":[0,100,200,300,400,500,600,1000,1500,2000,2500]}},{"name":"accident","in":"query","required":true,"schema":{"type":"string","enum":["MIT","OHN"],"description":"MIT : inclus ; OHN : exclu. Ne pas déduire ce choix de l’âge ou de la profession."}},{"name":"careType","in":"query","required":true,"schema":{"type":"string","enum":["any","BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]}},{"name":"currentProduct","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]+\\|[^|]+$","maxLength":100,"description":"Clé renvoyée par searchReferences ; facultative."}},{"name":"currentPremium","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9]{1,5}([.,][0-9]{1,2})?$","description":"CHF par mois, base seule, nette de redistribution, avant subsides. Remplace la référence calculée."}}],"responses":{"200":{"description":"Calculated individual offers.","content":{"application/json":{"schema":{"type":"object","required":["ok","tariffYear","currency","amountUnit","offers","verification","submission"],"properties":{"ok":{"type":"boolean","const":true},"tariffYear":{"type":"integer"},"currency":{"type":"string","const":"CHF"},"amountUnit":{"type":"string","const":"centime"},"redistributionMonthlyCentsPerPerson":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"eligibleInsurerCount":{"type":"integer"},"knownReferenceCount":{"type":"integer"},"referenceMonthlyCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"offers":{"type":"array","maxItems":10,"items":{"type":"object","required":["rank","insurerId","insurerName","monthlyCents","annualCents","people"],"properties":{"rank":{"type":"integer"},"insurerId":{"type":"integer"},"insurerName":{"type":"string"},"monthlyCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"annualCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"monthlySavingCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"annualSavingCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"people":{"type":"array","items":{"type":"object","required":["memberIndex","productKey","monthlyGrossCents","monthlyNetCents"],"properties":{"memberIndex":{"type":"integer"},"productKey":{"type":"string"},"modelName":{"type":"string"},"careType":{"type":"string"},"careTypeLabel":{"type":"string"},"monthlyGrossCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"monthlyNetCents":{"type":"integer","description":"Integer CHF centimes; divide by 100 for CHF."},"referenceMonthlyCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."},"referenceKind":{"type":["string","null"]},"monthlySavingCents":{"type":["integer","null"],"description":"Integer CHF centimes; divide by 100 for CHF."}}}}}}},"limitations":{"type":"array","items":{"type":"string"}},"sources":{"type":"object"},"verification":{"type":"object","description":"Exact criteria, per-member OFSP lookup keys, source URLs and SHA-256 fingerprints, catalogue/module hashes and independent Python verifier.","properties":{"criteria":{"$ref":"#/components/schemas/ComparisonRequest"},"revision":{"type":"string"},"manifestUrl":{"type":"string"},"hashes":{"type":"object"},"sourceFiles":{"type":"array","items":{"type":"object"}},"members":{"type":"array","items":{"type":"object"}},"verifierUrl":{"type":"string"},"instructions":{"type":"string"}}},"submission":{"type":"object","required":["endpoint","comparisonToken","expiresAt","clientConsentRequired"],"properties":{"endpoint":{"type":"string"},"comparisonToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"clientConsentRequired":{"type":"boolean","const":true}}}}}}}},"400":{"description":"Malformed JSON, invalid criteria, unresolved commune, missing client consent or invalid contact. No email sent.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request body exceeds 24,000 bytes.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"Use Content-Type: application/json.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After. Calculation limits are separate from the shared contact send quota.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"500":{"description":"Calculation temporarily unavailable; do not invent prices.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/lamal/v1/offer-requests/test":{"post":{"operationId":"testOfferRequest","summary":"Validate a synthetic offer request without sending email or creating a lead.","x-openai-isConsequential":false,"security":[],"description":"Safe test with synthetic contact details and a real calculation token. No email, DNS contact validation, stored lead, entitlement or payment. Test remains available when real contact sending is disabled. A test reference is not a receipt for a real request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferRequest"}}}},"responses":{"200":{"description":"Validated only; no email sent.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"status":{"const":"validated_test"},"requestId":{"type":"string","format":"uuid"},"testMode":{"const":true},"emailSent":{"const":false},"paymentCreated":{"const":false}}}}}},"400":{"description":"Malformed JSON, invalid criteria, unresolved commune, missing client consent or invalid contact. No email sent.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"Expired or modified calculation. Recalculate.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request body exceeds 24,000 bytes.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"Use Content-Type: application/json.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After. Calculation limits are separate from the shared contact send quota.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"500":{"description":"Calculation temporarily unavailable; do not invent prices.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}},"/api/lamal/v1/offer-requests":{"post":{"operationId":"submitOfferRequest","summary":"Send a client-approved offer request to Swiss Premium Insurance, without an email account.","x-openai-isConsequential":true,"security":[{},{"agentIntegrationKey":[]}],"description":"SEND ONLY AFTER EXPLICIT CLIENT CONFIRMATION. Show the selected insurer/model, exact household criteria, price and destination contact@sp-insurance.ch, and explain that the contact details will be transmitted for follow-up. Reuse the calculation criteria/token. Generate one UUID v4 requestId; keep it and the identical payload for every retry, including after a timeout. This operation sends an email to SPI only. status=accepted means the email provider accepted delivery, not inbox delivery or a binding insurance quote. Do not call for partial forms, test contacts, or on a mere comparison request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferRequest"}}}},"responses":{"200":{"description":"Provider accepted this request; SPI will follow up. Repeated identical requestId is deduplicated for 24 hours within a running service and by the email provider.","content":{"application/json":{"schema":{"type":"object","required":["ok","status","requestId","recipient","message","acceptedAt","followUpBy","expectedContactChannel","correctionOrCancellation"],"properties":{"ok":{"type":"boolean","const":true},"status":{"type":"string","const":"accepted"},"requestId":{"type":"string","format":"uuid"},"recipient":{"type":"string","const":"contact@sp-insurance.ch"},"message":{"type":"string"},"acceptedAt":{"type":"string","format":"date-time"},"followUpBy":{"const":"Swiss Premium Insurance"},"expectedContactChannel":{"const":"email_or_phone"},"correctionOrCancellation":{"type":"string","format":"uri"}}}}}},"400":{"description":"Malformed JSON, invalid criteria, unresolved commune, missing client consent or invalid contact. No email sent.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"401":{"description":"Invalid supplied Bearer key, or deployment configured for registered integrations only. Public mode requires no API key.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"409":{"description":"comparison_refresh_required: recalculate and obtain confirmation again if the selected offer changes. Keep the original requestId for an unchanged retry. request_conflict: the same requestId has different content; do not silently resubmit with a new ID.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"413":{"description":"Request body exceeds 24,000 bytes.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"415":{"description":"Use Content-Type: application/json.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"429":{"description":"Rate limit reached. Respect Retry-After. Calculation limits are separate from the shared contact send quota.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}},"headers":{"Retry-After":{"schema":{"type":"string"}}}},"500":{"description":"Calculation temporarily unavailable; do not invent prices.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"502":{"description":"Delivery unconfirmed. Retry the same requestId and payload; do not claim success.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}},"503":{"description":"Agent submissions or email delivery disabled by the operator. Comparison remains available.","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":false},"code":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"},"choices":{"type":"array","items":{"type":"object"}}}}}}}}}}}}}},"components":{"securitySchemes":{"agentIntegrationKey":{"type":"http","scheme":"bearer","description":"Optional integration attribution in public mode; mandatory only in registered-only deployments. Never place in shared links or conversation prompts. Model identity remains self-declared."}},"schemas":{"ComparisonRequest":{"title":"SPI — comparaison LAMal 2027","type":"object","additionalProperties":false,"required":["year","members"],"properties":{"year":{"type":"integer","const":2027},"members":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"required":["birthYear","postcode","franchise","accident","careType"],"properties":{"birthYear":{"type":"integer","minimum":1907,"maximum":2027},"postcode":{"type":"string","pattern":"^[0-9]{4}$"},"bfs":{"type":"string","pattern":"^[0-9]{1,6}$","description":"Commune OFS, obligatoire uniquement si le NPA couvre des régions ou des modèles disponibles différents. Vérifier requiresCommune dans places(postcode)."},"franchise":{"type":"integer","enum":[0,100,200,300,400,500,600,1000,1500,2000,2500]},"accident":{"type":"string","enum":["MIT","OHN"],"description":"MIT : inclus ; OHN : exclu. Ne pas déduire ce choix de l’âge ou de la profession."},"careType":{"type":"string","enum":["any","BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]},"currentProduct":{"type":"string","pattern":"^[0-9]+\\|[^|]+$","maxLength":100,"description":"Clé renvoyée par searchReferences ; facultative."},"currentPremium":{"type":"string","pattern":"^[0-9]{1,5}([.,][0-9]{1,2})?$","description":"CHF par mois, base seule, nette de redistribution, avant subsides. Remplace la référence calculée."}}}}}},"OfferRequest":{"type":"object","additionalProperties":false,"required":["requestId","comparison","comparisonToken","insurerId","language","contact","clientConsent"],"properties":{"requestId":{"type":"string","format":"uuid","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$","description":"Generate a UUID v4 once per client-approved request. Reuse the same UUID and payload on retries; never generate a fresh ID after a timeout."},"comparison":{"$ref":"#/components/schemas/ComparisonRequest"},"comparisonToken":{"type":"string","minLength":1,"maxLength":1000,"description":"Copy submission.comparisonToken from a successful calculation. Bound to these exact criteria, current prices and catalogue, valid for one hour or until a service restart."},"insurerId":{"type":"integer","description":"insurerId of the offer explicitly selected by the client from the returned comparison."},"language":{"type":"string","enum":["fr","de","it","en","es","pt","zh"]},"contact":{"type":"object","additionalProperties":false,"anyOf":[{"required":["email"]},{"required":["phone"]}],"description":"At least one valid contact method. Omit unknown fields; never invent a client name, email or phone.","properties":{"name":{"type":"string","minLength":0,"maxLength":120},"email":{"type":"string","minLength":3,"maxLength":160,"format":"email"},"phone":{"type":"string","minLength":8,"maxLength":30,"description":"Client telephone, 8–15 digits; optional spaces and + country code."},"message":{"type":"string","minLength":0,"maxLength":1500}}},"clientConsent":{"type":"boolean","const":true,"description":"Only true after the client has explicitly confirmed sending their contact details, household criteria and selected offer to Swiss Premium Insurance for follow-up. Do not infer consent from a calculation request."},"subsidyRequested":{"type":"boolean","default":false},"agent":{"type":"string","enum":["chatgpt","claude","gemini","other"],"description":"Legacy self-declared name. Prefer agentContext for Muse, Codex, Claude Code and custom agents."},"agentContext":{"type":"object","additionalProperties":false,"required":["name","cashbackRequested"],"properties":{"name":{"type":"string","enum":["muse","chatgpt","claude","gemini","codex","claude_code","coding_agent","other"]},"kind":{"type":"string","enum":["personal_assistant","conversational_assistant","coding_agent"]},"displayName":{"type":"string","minLength":1,"maxLength":80,"description":"Optional custom agent name, no client name or conversation content."},"integrationId":{"type":"string","pattern":"^[a-zA-Z0-9._-]{1,80}$","description":"Self-declared integration identifier, NOT authentication."},"cashbackRequested":{"type":"boolean","description":"Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."}}}}},"PremiumRequest":{"type":"object","additionalProperties":false,"required":["premium_year","postal_code","birth_year","deductible_chf","accident_included","model_group"],"properties":{"premium_year":{"type":"integer","const":2027},"postal_code":{"type":"string","pattern":"^[0-9]{4}$"},"municipality":{"type":"string","minLength":1,"maxLength":100,"description":"Official municipality name; required with ambiguous region/model availability unless municipality_bfs is given."},"municipality_bfs":{"type":"string","pattern":"^[0-9]{1,6}$"},"birth_year":{"type":"integer","minimum":1907,"maximum":2027},"deductible_chf":{"type":"integer","enum":[0,100,200,300,400,500,600,1000,1500,2000,2500],"description":"Age-specific values in metadata. No interpolation."},"accident_included":{"type":"boolean","description":"Explicit choice required. Do not infer legal eligibility to exclude accident cover."},"model_group":{"type":"string","enum":["any","BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]},"language":{"type":"string","enum":["fr","de","it","en"],"default":"fr"}}},"PremiumOffer":{"type":"object","additionalProperties":false,"required":["offer_id","insurer_id","insurer_name","model_name","model_group","premium_monthly_chf","premium_monthly_gross_cents","premium_monthly_net_cents","consumer_reward"],"properties":{"rank":{"type":"integer"},"offer_id":{"type":"string"},"insurer_id":{"type":"integer"},"insurer_name":{"type":"string"},"model_name":{"type":"string"},"model_group":{"type":"string","enum":["BASE","PRAXIS","FLEX","TEL_DIG","PHARM"]},"premium_monthly_chf":{"type":"number","description":"Net official monthly premium after environmental credit; authoritative integer value is premium_monthly_net_cents."},"premium_monthly_gross_cents":{"type":"integer","minimum":0},"premium_monthly_net_cents":{"type":"integer","minimum":0},"deductible_chf":{"type":"integer"},"accident_included":{"type":"boolean"},"first_contact_requirement":{"type":"string"},"model_terms_url":{"type":["string","null"],"format":"uri"},"insurer_url":{"type":["string","null"],"format":"uri"},"restrictions":{"type":"object","properties":{"municipality_availability_checked":{"const":true},"provider_network_verified":{"const":false},"exact_model_terms_verified":{"const":false}}},"source_offer_id":{"type":"string"},"consumer_reward":{"type":"null","description":"Individual distribution/contract eligibility is unverified. Conditional programme terms are separate in customer_benefits; never deduct cashback from the official premium."}}},"PremiumComparison":{"type":"object","required":["status","result_type","profile","data","pricing","offers","eligible_models","results_url","operator","comparison"],"properties":{"status":{"const":"ok"},"result_type":{"const":"non_binding_lamal_premium_comparison"},"profile":{"type":"object","description":"Exact supplied choices plus resolved official region/BFS. Municipality remains null if equivalent locations were not selected."},"data":{"type":"object","required":["authority","dataset_version","last_validated_at","last_successful_official_sync_at","market_scope","limitations"],"properties":{"authority":{"type":"string"},"source_url":{"type":"string","format":"uri"},"dataset_version":{"type":"string"},"last_validated_at":{"type":["string","null"],"format":"date-time"},"last_successful_official_sync_at":{"type":["string","null"],"format":"date-time"},"validation_status":{"type":"string"},"market_scope":{"const":"all_eligible_imported_models_without_distribution_filter"},"manifest_url":{"type":"string","format":"uri"},"limitations":{"type":"array","items":{"type":"string"}},"source_files":{"type":"array","items":{"type":"object"}}}},"pricing":{"type":"object","properties":{"currency":{"const":"CHF"},"period":{"const":"month"},"environmental_rebate_treatment":{"type":"string"},"environmental_credit_monthly_cents":{"type":"integer","minimum":0}}},"eligible_insurer_count":{"type":"integer"},"offers":{"type":"array","maxItems":10,"items":{"$ref":"#/components/schemas/PremiumOffer"}},"eligible_models":{"type":"array","items":{"$ref":"#/components/schemas/PremiumOffer"},"description":"All eligible imported models, same engine and municipal/category filters. Not restricted to broker distribution agreements."},"comparison":{"type":"object","description":"Exact legacy engine result and OFSP verification keys, without the private submission token. Save this object as quote.json for verify-quote.py."},"submission":{"type":"object","description":"Direct optional contact; no email account, signup or form redirect needed. Never put this token in a share link. Obtain informed client consent before sending.","properties":{"endpoint":{"type":"string","format":"uri"},"testEndpoint":{"type":"string","format":"uri"},"enabled":{"type":"boolean"},"comparison":{"$ref":"#/components/schemas/ComparisonRequest"},"comparisonToken":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"clientConsentRequired":{"const":true}}},"customer_benefits":{"type":"object","required":["status","programs"],"properties":{"status":{"enum":["disabled","active"]},"programs":{"type":"array","items":{"type":"object","required":["program_id","version","status","product_line","payer","basis","amount_chf","trigger","conditions","terms_url","approval"],"properties":{"program_id":{"type":"string"},"version":{"type":"string"},"status":{"const":"active"},"product_line":{"enum":["LAMAL","LCA"]},"payer":{"const":"Swiss Premium Insurance"},"beneficiary":{"const":"customer"},"channel_scope":{"const":"api_agent_requests"},"benefit_kind":{"const":"one_time_cashback"},"currency":{"const":"CHF"},"basis":{"enum":["fixed_chf","one_month_equivalent"]},"amount_chf":{"type":["number","null"]},"amount_determination":{"type":"string"},"trigger":{"const":"contract_concluded_and_insurer_approved"},"requires_policy_activation":{"const":false},"conditions":{"type":"array","items":{"type":"string"}},"paid_separately_by_broker":{"const":true},"changes_insurer_premium":{"const":false},"automatic_payment":{"const":false},"individual_eligibility":{"const":"not_assessed"},"distribution_availability":{"const":"confirm_with_spi"},"approval":{"type":"object","properties":{"source":{"const":"operator_commercial_instruction"},"confirmed_on":{"type":"string"},"independent_legal_verification":{"const":false}}},"terms_url":{"type":"string","format":"uri"},"contact":{"type":"string"}}}}}},"results_url":{"type":["string","null"],"format":"uri"},"adviser_url":{"type":["string","null"],"format":"uri"},"link_expires_at":{"type":["string","null"],"format":"date-time"},"operator":{"type":"object","properties":{"name":{"const":"Swiss Premium Insurance"},"role":{"const":"insurance_broker"},"assistance_is_optional":{"const":true}}}}},"AgentContext":{"type":"object","additionalProperties":false,"required":["name","cashbackRequested"],"properties":{"name":{"type":"string","enum":["muse","chatgpt","claude","gemini","codex","claude_code","coding_agent","other"]},"kind":{"type":"string","enum":["personal_assistant","conversational_assistant","coding_agent"]},"displayName":{"type":"string","minLength":1,"maxLength":80,"description":"Optional custom agent name, no client name or conversation content."},"integrationId":{"type":"string","pattern":"^[a-zA-Z0-9._-]{1,80}$","description":"Self-declared integration identifier, NOT authentication."},"cashbackRequested":{"type":"boolean","description":"Records a request for SPI to consider a benefit. Not a claim, eligibility, approval, amount or payment promise. Does not change prices or ranking."}}}}}}