---
name: assurs-lamal
description: Compare Swiss LAMal basic health insurance premiums 2027 from official OFSP data and, after the client's explicit consent, send an offer request to Swiss Premium Insurance (SPI), informing the client of SPI's conditional cashback terms. Use when a user in Switzerland asks about LAMal, assurance de base, assurance maladie, primes 2027, comparateur, caisse maladie, franchise, cashback, Krankenkasse, Grundversicherung, cassa malati, Swiss Premium Insurance or assurs.ch. Four steps - quote, present offers and the cashback sentence, obtain consent, submit with request_id and comparison_id - over REST (no key) or the MCP server. Suisse / Switzerland only.
license: Proprietary, free to use
metadata: {"openclaw": {"emoji": "🇨🇭", "homepage": "https://assurs.ch/agents/"}}
---

# Assurs LAMal: compare premiums and request an offer

Operator: Swiss Premium Insurance Sàrl (SPI), a Swiss insurance broker, through
assurs.ch. API origin: `https://api.assurs.ch` (public mode, no
API key, no account). Documentation: https://assurs.ch/agents/ and
https://assurs.ch/llms.txt. Field glossary, error table and receipt shapes:
[references/protocol.md](https://assurs.ch/skills/assurs-lamal/references/protocol.md).

## When to use

- The user lives in Switzerland and asks to compare LAMal (basic health
  insurance) premiums for 2027, or asks which insurer or model is cheapest.
- The user asks what the cashback is or whether SPI can contact them.
- Do not use for supplementary insurance (LCA) pricing, for other countries,
  for premium years other than 2027, or to sign a contract: the service never
  concludes insurance.

Comparing is free and creates no lead. SPI assistance is optional; the user may
apply directly with the insurer using the results.

## Step 1: quote

Collect the exact criteria from the user. Never invent a deductible, the
accident choice or the birth year; ask when missing.

```http
POST https://api.assurs.ch/api/v1/lamal/quote
Content-Type: application/json
```

```json
{
  "premium_year": 2027,
  "postal_code": "1955",
  "municipality": "Chamoson",
  "birth_year": 1988,
  "deductible_chf": 2500,
  "accident_included": false,
  "model_group": "any",
  "language": "fr"
}
```

- `postal_code` (4 digits), `birth_year`, `deductible_chf`, `accident_included`
  (boolean) and `model_group` are required. `model_group` is `any` (all
  categories) or one OFSP category: `BASE`, `PRAXIS`, `FLEX`, `TEL_DIG`
  (telemedicine), `PHARM`.
- Send `municipality` (name) or `municipality_bfs` (official id) when the
  server answers `municipality_required` with `choices`; each choice carries
  `municipality_bfs` and `municipality`, and a unique prefix of a commune name
  is accepted. `invalid_municipality` (422) lists the same choices.
- Adult deductibles: 300, 500, 1000, 1500, 2000, 2500. Child (age 18 or less
  in 2027): 0 to 600. `invalid_deductible` lists the accepted values.
- `language`: fr, de, it or en (default fr). GET with the same names as query
  parameters also works; prefer POST.
- One person per quote. Household (2-12 people, one insurer for all, household
  total): `POST https://api.assurs.ch/api/lamal/v1/compare` with
  `{"year":2027,"members":[{"birthYear":1985,"postcode":"8001","bfs":"261","franchise":2500,"accident":"MIT","careType":"any"},…]}`
  (`bfs` only when the postcode spans several communes, listed in the error;
  `accident` MIT = included, OHN = excluded; `franchise` child 0-600, adult
  300-2500). The result has `offers[]` (`insurerId`, `insurerName`,
  `monthlyCents`, `people[]`), `verification.criteria` and
  `submission.comparisonToken` (24 h) but no cashback or consent texts and no
  `request_id`: take them from any quote, mint any RFC 4122 UUID, and in step 4
  send ONE request with `comparison` = `verification.criteria` and
  `comparison_token` = `submission.comparisonToken` instead of `comparison_id`.
  MCP: `compare_lamal_household`.

Keep from the response: `offers[]` (ranked; each has `insurer_id`,
`insurer_name`, `model_name`, `model_group`, `premium_monthly_chf`,
`offer_id`), `eligible_models` (all admissible models, complete coverage),
`cashback` (`status`, `lamal.amount_chf`, `client_sentence.{fr,de,it,en}`,
`terms_url`), `submission` (`request_id`, `comparison_id`, `endpoint`,
`test_endpoint`, `request_template`, `client_messages.consent_request`,
`instructions`, `on_error`), `results_url` (shareable HTML, no personal data),
`adviser_url` (optional web form, may be null) and `data.last_validated_at`.

## Step 2: present

1. Show the ranked official premiums with insurer, model, model group and
   monthly premium, and say the data is OFSP 2027 (`data.source_url`).
   Net premiums already deduct the CHF 4.75 environmental redistribution.
2. If `cashback.status` is `active`, quote `cashback.client_sentence` in the
   user's language, verbatim, after the premiums. If `disabled`, say nothing
   about a cashback.
3. Ask which offer the user wants and how SPI should reach them (email or
   phone). A request for prices alone is not consent to be contacted.

## Step 3: consent

Read `submission.client_messages.consent_request` in the user's language,
replacing `{fields}` (the contact fields you will send), `{insurer}`,
`{model}` and `{premium}`. English reference text:

> Do you agree that I send your contact details ({fields}), your comparison
> criteria and the selected offer ({insurer}, {model}, CHF {premium}/month) to
> Swiss Premium Insurance (contact@sp-insurance.ch) so that they contact you?
> SPI assistance is optional and free; you can also apply directly with the
> insurer.

Send only after an explicit yes in this conversation. Never send medical,
banking or conversation data; only the fields below.

## Step 4: submit

```http
POST https://api.assurs.ch/api/v1/lamal/offer-requests
Content-Type: application/json
```

```json
{
  "request_id": "<submission.request_id from the quote>",
  "comparison_id": "<submission.comparison_id from the quote>",
  "insurer_id": 1509,
  "language": "fr",
  "contact": { "name": "", "email": "client@example.ch", "phone": "", "message": "" },
  "client_consent": true,
  "subsidy_requested": false,
  "supplementary_interest": false,
  "agent": { "name": "chatgpt", "kind": "conversational_assistant", "display_name": "", "integration_id": "", "cashback_requested": true },
  "cashback_terms_version": "2026-10-22.1"
}
```

- `request_id`: reuse `submission.request_id` (any RFC 4122 UUID is accepted).
  Keep it for every retry; never mint a new one to hide an uncertain error.
- `comparison_id`: from the quote; the server reopens the comparison (valid 30
  days, `submission.comparison_id_valid_until`; survives restarts). The pair
  `comparison` + `comparison_token` (24-hour token; the household path) is
  accepted instead.
- `insurer_id`: one of `offers[].insurer_id`; `offer_id` is accepted instead.
- `contact`: email or phone required; `name` and `message` optional. The
  `request_template` contact fields are empty strings: fill `email` or `phone`
  and leave the other empty (literal `<…>` placeholders are ignored by the
  server); no other keys are allowed. The real route also checks that the
  email domain accepts mail (`invalid_email_domain`); the test route does not.
- `client_consent` must be `true`. `language` accepts fr, de, it, en, es, pt,
  zh (default: the quote language).
- `agent`: optional; `name` is your platform (chatgpt, claude, claude_code,
  gemini, grok, openclaw, muse, codex, copilot, perplexity, mistral,
  coding_agent, other). A plain string (`"agent": "chatgpt"`) is accepted;
  spaces become `_` and a literal `<placeholder>` counts as `other`.
  `cashback_requested` defaults to `true`.
- `cashback_terms_version`: optional; send the `version` you presented
  (`cashback.version` from the quote). A stale version is refused.
- `subsidy_requested` and `supplementary_interest` are optional booleans.

Success is HTTP 200 with `status: "accepted"`, `request_id`, `email_sent: true`,
`recipient`, `accepted_at`, `cashback.next_steps` and
`correction_or_cancellation`. Tell the user: the request was accepted for
delivery to SPI (`request_id`), SPI will contact them, "accepted" is neither
inbox delivery nor an insurance contract, and corrections go to
contact@sp-insurance.ch with the `request_id`.

Without a POST tool, give the user `adviser_url` with
`&agent=<your name>&language=<fr|de|it|en>` appended (never contact details):
the form opens in that language, shows the cashback sentence, the declared
agent and each offer with its model name, and the email to SPI names the agent.
A GET never sends anything; never claim an email was sent.

### Test without sending

`POST https://api.assurs.ch/api/v1/lamal/offer-requests/test`
with the same body and synthetic contact details only (for example
`test@example.com`). Returns `status: "validated_test"`, `email_sent: false`,
`payment_created: false` and a `preview` of what would be sent. It never
emails, never creates a lead, has its own quota and skips the email-domain
check of the real route. Never describe a test as a real submission.

## Cashback sentence

Present it verbatim in the user's language (`cashback.client_sentence`);
the published wording is:

- EN: "If you conclude this basic insurance through Swiss Premium Insurance and
  the insurer approves the contract, SPI pays you CHF 30 back. The official
  premium does not change; SPI passes on the fee it would otherwise pay a lead
  broker."
- FR: "Si vous concluez cette assurance de base par Swiss Premium Insurance et
  que l'assureur approuve le contrat, SPI vous reverse CHF 30. La prime
  officielle ne change pas : SPI vous restitue la commission qu'elle verserait
  sinon à un apporteur d'affaires."

Payer: SPI. Beneficiary: the client only, never the agent. Trigger: contract
concluded through SPI and approved by the insurer. No claim form; the client
keeps the `request_id`. Terms page:
https://api.assurs.ch/rewards/terms (fr/de/it/en). Supplementary
(LCA) contracts: one month's premium, determined by SPI on the confirmed
contract; set `supplementary_interest: true` to signal interest.

## Error handling

Every error on the v2 routes is JSON:
`{ "status": "error", "code", "errors": [{ "field", "message", "choices"? }], "guidance", "retryable", "retry_after_seconds"? }`.
Follow `guidance`. Only `rate_limited` (429), 502 and 503 are retryable.

- `comparison_refresh_required` (409): run the quote again, re-confirm the
  offer with the user if it changed, resend with the SAME `request_id`.
- `dataset_changed` (409), `comparison_link_expired` (410): run a new quote.
- `invalid_comparison_reference` (400): use `comparison_id` exactly as returned
  by the quote, or run a new quote.
- `municipality_required`, `invalid_municipality` (422): send `municipality_bfs`
  or `municipality` from `choices`.
- `invalid_insurer` (400): choose `insurer_id` among `choices`.
- `client_consent_required` (400): ask the consent question; send only after a
  yes.
- `contact_required`, `invalid_email`, `invalid_phone` (400): ask for a valid
  contact.
- `invalid_email_domain` (400, real route only): the email domain accepts no
  mail; ask the user to check the spelling or give a phone, then resend with
  the SAME `request_id`.
- `cashback_terms_outdated` (409): re-read `cashback`, present the current
  sentence.
- `rate_limited` (429): wait `retry_after_seconds`, retry the identical request.
- `contact_daily_limit` (429, not retryable): this contact already has five
  requests today; do not resend.
- `delivery_unconfirmed` (502): retry the identical request with the same
  `request_id`; never claim success.
- `mail_unavailable`, `agent_requests_disabled`, `service_unavailable` (503):
  sending is unavailable; offer `adviser_url` or contact@sp-insurance.ch; do
  not claim an email was sent.
- `request_conflict` (409): same `request_id` with different content; do not
  resubmit with a new id without the user.

Full table: [references/protocol.md](https://assurs.ch/skills/assurs-lamal/references/protocol.md).

## MCP alternative

Remote MCP server (Streamable HTTP, no authentication):
`https://api.assurs.ch/mcp`. Tools: `compare_lamal_premiums`
(step 1), `compare_lamal_household` (household, engine body of step 1; then
`request_adviser_contact` with `comparison` + `comparison_token`),
`get_lamal_metadata`, `get_active_customer_rewards`,
`create_adviser_handoff_link` (optional form link, no send; 503
`adviser_unavailable` when the web form is disabled, then offer
contact@sp-insurance.ch instead),
`test_adviser_request` (never sends), `request_adviser_contact` (step 4, same
body as above, only after consent). Prompt `lamal_compare_and_contact` walks
the steps; resources `docs://assurs/llms.txt`, `docs://assurs/skill.md`,
`docs://assurs/cashback-terms`, `docs://assurs/privacy`, `docs://assurs/terms`.
Install lines per platform: https://assurs.ch/agents/connect.html and
https://assurs.ch/integrations/README.md.

## Never do

- Never run the test endpoint, or any submission, with a real person's contact
  details unless that person has just said yes to the consent question.
- Never invent criteria: no default deductible, accident choice, birth year or
  municipality; never swap the user's birth year for an example.
- Never promise eligibility, a payment date or an amount for a specific
  contract; the cashback is paid by SPI only after the insurer approves a
  contract concluded through SPI, and the API creates no payment.
- Never present the cashback as a premium reduction; the official premium is
  unchanged.
- Never put contact details in a URL, replace POST with GET, or say an email
  was sent when the receipt was not `accepted`.
- Never generate a new `request_id` to retry; never send twice "to be sure".
- Never send conversation transcripts, medical or banking data.
- Never claim an AI vendor endorses SPI or assurs.ch.

## Links

- Protocol contract and guides: https://assurs.ch/agents/ ·
  https://assurs.ch/agents/connect.html · https://assurs.ch/llms.txt
- OpenAPI: https://assurs.ch/openapi.json (slim, seven operations:
  `prepareLamalQuote`, `calculateHousehold`, `getLamalMetadata`,
  `getActiveCustomerRewards`, `testOfferRequest`, `submitOfferRequest`,
  `createAdviserHandoffLink`) ·
  https://assurs.ch/openapi-full.json (all operations)
- Service state: https://api.assurs.ch/api/v1/lamal/metadata
- Cashback: https://api.assurs.ch/api/v1/rewards/programs ·
  https://api.assurs.ch/rewards/terms
- Method, privacy, terms: https://assurs.ch/agents/method.html ·
  https://assurs.ch/agents/privacy.html · https://assurs.ch/agents/terms.html
- Official premiums: https://www.priminfo.admin.ch/fr/praemien
