# AIP registry, draft 0.1

This is draft 0.1 of the registry. A later draft can break it until 1.0. The source of truth is [`registry.ts`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/registry.ts), and its types are in the [schema reference](https://agenticinsuranceprotocol.org/spec/0.1/reference#r1-registry-server) from section R1. When this page and `registry.ts` differ, `registry.ts` wins. The tools of each seller are in the [specification](https://agenticinsuranceprotocol.org/spec/0.1).

## 1. Overview

A buying agent calls the registry before it sends anything to a seller. The registry answers three questions, and it needs no customer data to answer them:

- **Who sells here?** `search_distributors` returns the sellers that speak AIP in a country, for a line.
- **Can this seller sell here?** `verify_licence` checks a seller, or the insurer behind an offer, in the public registers. It works for a seller that the registry does not list.
- **Which rules apply here?** `get_country_rules` returns the rules of a country for the AIP skill.

Each seller runs its own MCP server with the tools of the specification. The registry is the global search, and the server of each seller is the one-to-one. The registry does not price, it does not check the underwriting scope of a product, and it does not copy what a server publishes. Those stay on the seller's server.

### 1.1 Roles

- **Operator.** The organisation that runs the registry. It follows the rules on this page.
- **Agent.** The AI agent that acts for the customer. It calls the registry, then the seller.
- **Seller.** A distributor: the company that runs an AIP server and sells the product.
- **Provider.** The insurer that carries the risk. It can be the seller itself.
- **Register.** A public list of licensed insurers or intermediaries, kept by a regulator or for one. The registry reads it and never replaces it.

## 2. Conventions

The [conventions of the specification](https://agenticinsuranceprotocol.org/spec/0.1#conventions) apply. A subdivision is an ISO 3166-2 code, such as `US-TX`. A domain is a lower-case host name with no scheme and no path, such as `pets.example.com`.

## 3. Discovery

The AIP skill gives the address of the registry. The registry declares its extension under `capabilities.extensions["org.agenticinsuranceprotocol/registry"]` in its MCP `server/discover` response. The value is a `RegistrySettings` object: the version, the countries where the registry checks licences, the countries that have rules, every register it reads, and the page where the operator publishes its method.

The registry SHOULD also serve the AIP skill through the [MCP Skills extension](https://modelcontextprotocol.io/extensions/skills/overview). An agent whose host loads skills over MCP then gets the whole skill from the registry. `get_country_rules` serves the same country files to every other agent.

## 4. Tools

| Tool | Session (PAP) | Effect | Params → result |
|---|---|---|---|
| `search_distributors` | None | Read-only | `SearchDistributorsParams` → `SearchDistributorsResult` |
| `verify_licence` | None | Read-only | `VerifyLicenceParams` → `VerifyLicenceResult` |
| `get_country_rules` | None | Read-only | `GetCountryRulesParams` → `GetCountryRulesResult` |

Every registry tool is read-only and needs no session, so the registry never learns who the customer is. The params describe a market or a company, never a person. A registry tool MUST refuse a call with a param that this draft does not define, return `invalid_params`, and keep nothing of the call.

## 5. Search

`search_distributors` takes a country, and optionally a subdivision, a line, an insured family and a minimum conformance level. It returns `ListedDistributor` objects: the legal and trading names, the domain, the MCP endpoint and the address of `poppy.json`, the roles, the conformance level, the lines, the countries, the insured families, and the last licence check with its date.

- Each result MUST match every param of the search.
- The registry MUST return every listed seller that matches, across the pages.
- For a country where it lists no seller, the registry returns `country_not_covered`. An agent then does not read an empty list as "no seller exists".
- The order carries no meaning. The registry MUST NOT rank a seller for a payment or for any commercial link, and it SHOULD shuffle the order for each new search. An agent MUST NOT show the order to the customer as a ranking.

A search result is not a licence check. The agent checks the seller with `verify_licence` before it sends any of the customer's answers.

## 6. Licence check

`verify_licence` answers one question: can this party sell, or carry the risk, for a customer in this country, subdivision and line? It MUST work for a seller that the registry does not list. An agent can find a seller anywhere on the web, and the check matters most then.

### 6.1 What the agent asks

The params are a `DistributorCheckParams` or a `ProviderCheckParams` object.

- **A seller**, with the capacity `distributor`. The agent gives the domain of the server or the website that will receive the customer's answers. It can add the register entry and the legal name that the seller shows, for example in the legal notice of its website. A register number alone does not prove who runs a website, so a seller check always names the domain.
- **A provider**, with the capacity `provider`, for example the insurer in `Offer.provider`. The agent gives its domain, a register entry, or both. Only a provider role counts.

Both give the customer's country and, when the agent knows it, the line. Where a licence applies per subdivision, the subdivision is REQUIRED. In draft 0.1 that is the United States, where each state grants its own licences.

### 6.2 What the registry reads

The result lists every register entry that the registry read for the party, as `LicenceCheck` objects, and that includes the entries that are not active. Each entry gives the register and the identifier, the role, the categories, the subdivisions, the countries of an EU passport, the name in the register, the time of the read, how the registry read it, and the public page where anyone can check it.

| Status | Meaning |
|---|---|
| `active` | The entry is in force |
| `pending` | The regulator has not approved the entry yet |
| `lapsed` | The entry ended with no sanction: not renewed, expired, or removed at the holder's request |
| `suspended` | The regulator suspended the entry for a time |
| `revoked` | The regulator withdrew the entry, or struck it off as a sanction |
| `not_found` | The register has no entry with this identifier |
| `name_mismatch` | The entry exists, but its name does not match the name that the seller declares or shows |

`register_status` keeps the status in the words of the register, for example "Authorised" or "Inscrit".

### 6.3 Domains

Any domain can claim any register entry, for example in the `get_distributor` result of its AIP server. That proves control of the domain and nothing more. `DomainLink` says how the registry tied the domain to the entries:

| Link | Meaning | Supports `licensed` |
|---|---|---|
| `register` | The register gives this domain for the entry | Yes |
| `confirmed` | The operator confirmed with the holder of the entry, through contact details that the register or the regulator gives | Yes |
| `claimed` | Only the domain says that the entries are its own | No |
| `not_linked` | Nothing ties the domain to the entries | No |

### 6.4 Verdict

The registry tests each entry in this order: the country (or an EU passport into it), the subdivision, the line, the role for a provider, then the status. An entry that passes the five tests covers the question.

| Verdict | When | Reasons |
|---|---|---|
| `licensed` | An entry covers the question, and the domain link, when a domain is given, is `register` or `confirmed` | None |
| `not_licensed` | The registry read every register that applies, and no entry covers the question. The reason names the first test that the closest entry failed | `no_entry`, `subdivision_not_covered`, `line_not_covered`, `role_not_covered`, `name_mismatch`, `licence_not_active` |
| `unknown` | The registry cannot decide | `country_not_covered`, `subdivision_required`, `register_unavailable`, `subject_not_identified`, `domain_not_linked` |

Each verdict comes with a message in plain words that the agent can pass to the customer. A verdict MUST rest only on reads made at most seven days before it (`MAX_READ_AGE_DAYS`). The registry SHOULD read the register again for each call when the register has an API or a web page.

### 6.5 What the agent does

| Verdict | The agent |
|---|---|
| `licensed` | Goes on, and keeps the result with the record of the sale |
| `not_licensed` | MUST NOT send the customer's answers to that party, and MUST NOT apply or conclude through it. It MUST tell the customer why |
| `unknown` | MUST tell the customer that the licence could not be checked, and why. It MUST NOT apply or conclude, and SHOULD NOT send the customer's answers. It MAY ask the seller for its register entry and check again |

The agent MUST check the seller before it sends any of the customer's answers. It MUST check the provider of an offer before it applies or concludes, when the provider is not the seller. It MUST keep each result that it relies on with the record of the sale, and SHOULD give the customer a copy. The result repeats the params of the call, so it is a complete record on its own.

## 7. Country rules

`get_country_rules` returns the rules files of the AIP skill for a country. The file of the country comes first. The file of the subdivision and the file of the line follow, when they exist. The agent MUST follow every file of the result. For a country with no file, the registry returns `country_not_covered`.

Each file is Markdown with a YAML front matter:

```yaml
---
country: FR
version: 0.1.0
owner: AIP maintainers
status: draft
language: en
effective_from: 2026-10-24
sources:
  - title: Directive (EU) 2016/97 on insurance distribution
    url: https://eur-lex.europa.eu/eli/dir/2016/97/oj
---
```

- `owner` is the AIP maintainers, until a regulator takes the file over.
- `status` is `draft`, or `endorsed` when a regulator endorsed this version. An endorsed file names the regulator in `endorsed_by`.
- `reviewed_at` is the date of the last legal review. The key is absent when no review happened.
- `language` is the language of the text, as a BCP 47 tag.
- `effective_from` is the first day the version applies. A version that follows a change in the law can be published before that day.
- A file of a subdivision or of a line adds `subdivision` or `line`. In the skill, the file of a country is `countries/<code>/country.md`, the file of a subdivision is in `states/`, and the file of a line is in `lines/`.
- `sources` lists the legal texts that the file rests on.

A `RulesFile` gives the same values, the whole file in `content`, its SHA-256, its public address, and its URI in the skill that the registry serves over MCP. The text MUST be the same as the file of the same version in the skill, so the hash is the same in both places. When the registry does not answer, the agent uses the copy in its installed skill, and SHOULD tell the customer which version it used.

A regulator that takes over the rules of its country changes one file. Each agent that loads the rules from the registry gets the change on its next call.

## 8. Listing

A seller asks the operator to be listed. The operator follows these steps:

1. The seller asks to be listed, and gives its domain.
2. The registry reads `https://{domain}/.well-known/poppy.json`. Its `organization.domain` MUST be the domain. As PAP requires, the document comes from that host, so it proves that the seller controls the domain.
3. It calls `get_distributor` on the MCP server that `poppy.json` names, in the `apis` entry of type `mcp`. The `domain` of the result MUST be the domain.
4. It checks each licence of the result in the public register of its country, as `verify_licence` does. It also confirms with the holder of each entry that the domain is theirs: the register gives the domain, or the operator asks the holder through contact details that the register or the regulator gives.
5. It checks that the server has every tool of the level it declares, and that the results of the level 1 tools match the schema.
6. It lists the server.

Rules for the operator:

- The registry MUST list a server only when steps 2 to 5 pass. A server that lacks one tool of its level MUST NOT be listed.
- The registry MUST NOT list a server that claims a licence whose status is `not_found` or `name_mismatch`. It MUST NOT link a register entry to a second domain unless the holder of the entry confirms the second domain too.
- A listed server appears in a search for a country only while its verdict there is `licensed`.
- The registry MUST check each listed server again at least every seven days (`RECHECK_DAYS`), and when the seller or a regulator asks. It SHOULD also check again when anyone reports a problem.
- When a licence stops being active, the registry MUST remove what that licence covered from the listing before it answers another search.
- When `poppy.json` or the MCP server goes away, or the server fails step 5, the registry MUST remove the listing.
- The registry keeps the fields of `ListedDistributor` and the licences. It MUST NOT copy the products, the underwriting scopes, the prices or the documents of a server.

## 9. Data sources

The registry reads public registers. It MUST read a register only through an access that the terms of the register allow, and under an agreement when the terms ask for one. This table gives what we found on the official pages on 24 October 2026. "Not verified" marks each fact that no official page confirmed.

| Country | Register | Covers | Identifier | Access | Terms of use | Cost | Changes | At launch |
|---|---|---|---|---|---|---|---|---|
| US | [NIPR Producer Database](https://nipr.com/industry-solutions/reports-and-alerts) | Producers (people and agencies), with each state licence and its lines of authority. A carrier report covers insurers | NPN (format not published), and each state licence number | Batch reports and an alerts web service, for subscribers | Fair Credit Reporting Act: a "permissible purpose" only. Needs an access form and a licence agreement | Paid per report and per tracked NPN (current prices not verified) | Every weeknight | Agreement and payment |
| US | [State lookups of 34 jurisdictions](https://sbs.naic.org/solar-external-lookup/), run by the NAIC for the state departments | Licensees and companies of those jurisdictions. Not California, Florida, New York or Texas | Licence number, NPN | Web page only | Bans automated downloads and republishing | Free | Not verified | No |
| US | [Texas Department of Insurance open data](https://data.texas.gov/dataset/Insurance-agencies-and-businesses-approved-to-mana/3yqc-fcdt) | Texas agents, adjusters and agencies | NPN, TDI licence number | Bulk file and query API. No status column: the expiry date gives it | No licence stated (not verified) | Free | Not stated. Rows changed on 22 and 23 October 2026 | Yes, Texas only |
| US | [NAIC Consumer Insurance Search](https://content.naic.org/cis_consumer_information.htm) | Insurers, with their lines, their licensed states and their website | NAIC company code, 5 digits | Web page only | No terms on the page. The NAIC sells its data under a licence agreement | Free to view | Not verified | Agreement |
| UK | [FCA Financial Services Register](https://register.fca.org.uk/s/legal-information) and its API | Authorised firms: intermediaries, appointed representatives, and insurers, including those that the PRA authorises | FRN, 6 or 7 digits | Web pages, and a free API with a key, for one firm per call (50 requests per 10 seconds) | A data feed to another website needs the FCA's written permission. No robots. The terms of the API itself are behind a login (not verified) | Free with a key | About every 24 hours | Agreement to serve the data to agents |
| UK | [FCA Register Extract Service](https://www.fca.org.uk/publication/documents/register-extract-handbook.pdf) | Most Register data, with no websites or email addresses | FRN | Bulk files | Signed subscriber agreement. A "re-sale use" licence covers services that help users check if a firm is regulated | About £11,300 a year plus VAT, for weekly firm data | Weekly or monthly | Paid |
| FR | [ORIAS](https://www.orias.fr/webService/mentionsLegalesWebService) | Intermediaries in insurance, banking and finance, and EEA intermediaries that work in France (category EII) | ORIAS number, 8 digits (seen on every entry, rule not published), and SIREN | Web search, and a SOAP web service after authorisation | No commercial reuse, no derived database, no robots | Web search free. Web service cost not stated | Not verified. Each entry renews every year by 1 March | Agreement |
| FR | [ACPR REGAFI, insurance part](https://www.regafi.fr/pages/api-acpr) | Insurers, mutuals and provident institutions, EEA insurers on a passport, and branches of non-EEA insurers | SIREN, LEI, ACPR id | Open-data API and exports, with no account | The terms "have not been defined yet". No dataset licence | Free | Daily | Yes, after written confirmation from the ACPR |
| EU | [EIOPA Register of Insurance Undertakings](https://register.eiopa.europa.eu/registers/register-of-insurance-undertakings) | EEA insurers, with their cross-border status in each country and their website | National code, LEI | Web, and CSV or Excel export | Reproduction allowed with the source acknowledged | Free | Weekly, on Friday | Yes |
| EU | [EIOPA register of insurance intermediaries](https://www.eiopa.europa.eu/tools-and-data/registers-lists-and-databases/register-insurance-intermediaries_en) | Links to the national registers only | None | Links | Not applicable | Free | Not applicable | No data |
| All | [GLEIF](https://www.gleif.org/en/meta/lei-data-terms-of-use) | Legal entities | LEI, 20 characters | API with no key, and full files | CC0 | Free | Three times a day | Yes |

### 9.1 At launch

With no agreement, a first registry can check:

- the insurers of France, from REGAFI, after the ACPR confirms in writing that the registry may reuse the data;
- the insurers of the EEA, including those that sell in France on a passport, from the EIOPA register;
- the agents and agencies of Texas, from the open data of the Texas Department of Insurance;
- the legal identity of a company in any country, from GLEIF. The LEI and the SIREN join GLEIF to REGAFI, EIOPA and ORIAS.

The intermediaries of the three countries need an agreement: NIPR for the United States, the FCA for the United Kingdom, and ORIAS for France. The insurers of the United States need one with the NAIC. NIPR also asks for a "permissible purpose" under the Fair Credit Reporting Act, and we have not verified that a registry qualifies. Until these agreements exist, `verify_licence` returns `unknown` with the reason `country_not_covered` for what the registry cannot read. The FCA's "re-sale use" licence names the use of the registry: to help users find out if a firm is regulated.

### 9.2 Domains in the registers

ORIAS, the EIOPA register and the NAIC show the website of an entry. The FCA Register can show one, and we have not verified that its API returns it. NIPR and the Texas data show none. When a register gives the website, the registry can tie a domain to the entry with the link `register`. The firm declares its website to the register itself, so another firm cannot add its own domain to the entry. In the other cases, the operator confirms the domain with the holder of the entry.

### 9.3 Status labels

The registry maps the labels of each register to a `LicenceStatus`, and keeps the label in `register_status`:

| Register | Labels |
|---|---|
| NIPR | Active, Pending, Inactive. Lines of authority such as Property, Casualty, Personal Lines, Life, and Accident and Health or Sickness |
| FCA | Authorised, EEA Authorised, Appointed representative, Registered, No longer authorised, Cancelled, Lapsed, Suspended, Revoked |
| ORIAS | Inscrit, Radié for the entry. Inscrit or Supprimé for each category: AGA, COA, MA, MAL, MIA and EII in insurance |
| REGAFI | Actif for an authorisation. An event can say that the insurer may not sell new contracts |

## 10. Trust and privacy

- Every result says where its data comes from and when the registry read it: the register, the access (API, file or web page), the date of the data in the source, the time of the read, and the public page of the entry.
- The registry never receives customer data. Its tools need no session, and their params describe a market or a company. Check RG8 tests the params of each tool against a closed list of fields.
- The registry SHOULD keep each `verify_licence` result under its `check_id` for at least five years, so that it can confirm later what it said.
- Draft 0.1 does not sign results, so an agent cannot yet prove alone what the registry said. See the open points.

## 11. Errors

A registry tool returns an error in an MCP tool result with `isError: true`, as a `RegistryError` in `structuredContent.error`.

| Code | Meaning |
|---|---|
| `country_not_covered` | The registry lists no server in this country, or has no rules file for it. |
| `invalid_params` | A param is missing, not valid, or not defined by this draft. The registry kept nothing of the call. |

## 12. Worked example

These calls go with the [pet insurance flow](https://agenticinsuranceprotocol.org/spec/0.1/example). The rules, the search and the seller checks come before it, and the insurer check comes before the application. All companies are fictional.

### Load the rules of the country

*get_country_rules* · [`examples/registry-01-get_country_rules.params.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-01-get_country_rules.params.json) · [`examples/registry-02-get_country_rules.result.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-02-get_country_rules.result.json)

Camille lives in France and wants to insure her cat. The agent first loads the rules of France. The file is the one of the AIP skill, unchanged, with its version, its owner, its status and its hash.

```json
{
  "country": "FR",
  "line": "pet"
}
```

```json
{
  "files": [
    {
      "country": "FR",
      "version": "0.1.0",
      "owner": "AIP maintainers",
      "status": "draft",
      "language": "en",
      "effective_from": "2026-10-24",
      "content": "---\ncountry: FR\nversion: 0.1.0\nowner: AIP maintainers\nstatus: draft\nlanguage: en\neffective_from: 2026-10-24\nsources:\n  - title: Directive (EU) 2016/97 on insurance distribution\n    url: https://eur-lex.europa.eu/eli/dir/2016/97/oj/eng\n  - title: Code des assurances\n    url: https://www.legifrance.gouv.fr/codes/texte_lc/LEGITEXT000006073984/\n  - title: Code de la consommation, articles L612-1 and L612-2 (mediation)\n    url: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000032224805\n  - title: Regulation (EU) 2016/679 (GDPR)\n    url: https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng\n  - title: ACPR recommendation 2024-R-02 on complaints\n    url: https://acpr.banque-france.fr/system/files/2024-12/20240702_Recommandation_2024-R-02.pdf\n  - title: ACPR recommendation 2024-R-03 on the duty to advise\n    url: https://acpr.banque-france.fr/system/files/2024-12/20241022_recommandation_2024-R-03_0.pdf\n---\n\n# France\n\nDraft. No lawyer and no regulator has reviewed this file. Each rule gives its source and its review status. Follow this file as well as the procedure of the skill.\n\n## Who may sell\n\n1. Only an insurer that the ACPR authorises, or an insurer of another EU or EEA country under its passport, may carry the risk for a customer in France. Check the insurer behind each offer with `verify_licence`, the capacity \"provider\" and the country FR. Source: Code des assurances, art. L310-2 and L321-1. Not reviewed.\n2. A person who distributes insurance for a payment must be in the ORIAS register, unless it is the insurer itself or its staff. Check the seller with `verify_licence`, the capacity \"distributor\" and the country FR, before you send any answer of the customer. Source: Code des assurances, art. L511-1 III, L512-1 I and R512-1. Not reviewed.\n3. The registry checks intermediaries in ORIAS, and insurers in REGAFI, which lists the insurers allowed to operate in France. For an insurer of another EU country, the register of its home country and the EIOPA register also apply. Source: ACPR, page on insurance intermediaries. Not reviewed.\n\n## What you may say\n\n1. Helping a customer to conclude an insurance contract is insurance distribution. A person who does it for a payment or any other advantage linked to the sale is an intermediary, and must be in ORIAS. Follow this skill only when you, and the company that runs you, get no commission, fee or other advantage linked to the sale. Source: Code des assurances, art. L511-1 I and III, R511-3 I and L512-1 I. Not reviewed.\n2. Do not recommend an offer, and do not say which offer is best for the customer. Giving recommendations on insurance contracts is insurance distribution, and the advice belongs to the seller. When the customer asks for advice, say that you cannot give it, and that the seller can. Source: Code des assurances, art. L511-1 I and L521-4; ACPR, page on insurance intermediaries. Not reviewed.\n3. Do not rank the offers, and do not compare them on price or cover against criteria of your own. Give the facts of each offer as `quote` returns them, side by side, with the same fields in the same order, so that the customer compares them alone. Source: Code des assurances, art. L511-1 I and II 4°. Not reviewed.\n4. Give the cover in the seller's words, from the offer and the documents. Do not add your own reading of what a term means for the customer. Explaining the cover with a view to a subscription is presentation, a part of distribution. When the customer asks what a term means for them, send the question to the seller. Source: Code des assurances, art. R511-1. Not reviewed.\n5. When an offer has `recommended: true`, say that the seller recommends it after advice. Source: Code des assurances, art. L521-4 II. Not reviewed.\n\n## Documents before commitment\n\n1. Before the contract is concluded, give the customer the IPID of a non-life product. It is the document with the type `ipid` and `required_before_commitment: true`. Source: Code des assurances, art. L112-2; Directive (EU) 2016/97, art. 20(5) to 20(8); Commission Implementing Regulation (EU) 2017/1469. Not reviewed.\n2. Before the contract, an intermediary gives its identity, its address, its ORIAS number, its complaints and mediation procedures, its links with insurers, whether it gives a personal recommendation, and how it is paid. Take this from `get_distributor` and from the seller's documents, and give it to the customer. Source: Code des assurances, art. L521-2 I and II. Not reviewed.\n3. For a sale at a distance, the customer gets before commitment the information that the law lists, including the total premium, the cover and the exclusions, the right to withdraw with a model form, the complaints procedure and the IPID. Give the customer each document that the seller marks `required_before_commitment: true`. Source: Code des assurances, art. L112-2-1 III. Not reviewed.\n\n## Demands and needs\n\n1. Before the contract, the seller states in writing the customer's demands and needs, based on what the customer said, and proposes a contract that matches them, with its reasons. In France this advice is mandatory. Record the customer's need in their own words in step 1 of the procedure, send it in the `NeedsAssessment`, and give the customer what the seller sends back. Source: Code des assurances, art. L521-4 I; ACPR recommendation 2024-R-03. Not reviewed.\n2. Set `advice_given` to true only when the seller gave a personal recommendation. You never give one. Source: Code des assurances, art. L521-4 II. Not reviewed.\n3. Ask the customer whether they already hold cover for the same risk, and tell them when the new cover overlaps it. Source: ACPR recommendation 2024-R-03, point 2.1.2.2. Not reviewed.\n\n## Withdrawal\n\n1. A consumer who buys a contract at a distance can withdraw within 14 calendar days, with no reason and no penalty. The period starts at the conclusion, or on the day the customer receives the terms and the information if that is later. Tell the customer this period, and where the seller's online withdrawal function is. Source: Code des assurances, art. L112-2-1 II, as amended by ordonnance 2026-2. Not reviewed.\n2. The 14 days do not apply to travel or baggage cover of less than one month, to compulsory motor liability cover, or to a contract fully performed at the customer's express request. Source: Code des assurances, art. L112-2-1 II. Not reviewed.\n3. When the customer buys cover that adds to a good or a service sold by a supplier, for example cover for a device sold with it, the customer can withdraw within 30 days. Pet health cover bought on its own is under the 14 days. Source: Code des assurances, art. L112-10. Not reviewed.\n\n## Sensitive data\n\n1. Health data of a person needs an exception of the GDPR, for example explicit consent. Never collect health details of a person. They are marked `distributor_page`. Source: Regulation (EU) 2016/679 (GDPR), art. 4(15) and 9. Not reviewed.\n2. Never collect a social security number, a bank account number or an identity document number. The customer gives them on the seller's page. Source: Regulation (EU) 2016/679 (GDPR), art. 5(1)(c). Not reviewed.\n\n## Complaints\n\n1. The customer first complains in writing to the seller, at its `complaints_url`. The seller acknowledges within 10 working days and answers within 2 months. Give the customer that address. Source: ACPR recommendation 2024-R-02. Not reviewed.\n2. After the seller's answer, or 2 months after the written complaint, the customer can go to La Médiation de l'Assurance, for free, within 1 year of the complaint, when the seller is a member. Source: Code de la consommation, art. L612-1 and L612-2. Not reviewed.\n3. The ACPR does not settle a single dispute. A customer can report a problem to it, and ABE Info Service gives general information. Source: ACPR, page on complaints for customers. Not reviewed.\n",
      "sha256": "b016524608e8560d8c8e8b27c01542b65a3930085244cda08aeebc686631a90b",
      "url": "https://registry.example.com/rules/fr/country/0.1.0.md",
      "skill_uri": "skill://agentic-insurance-protocol/references/countries/fr/country.md"
    }
  ]
}
```

### Find the sellers

*search_distributors* · [`examples/registry-03-search_distributors.params.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-03-search_distributors.params.json) · [`examples/registry-04-search_distributors.result.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-04-search_distributors.result.json)

The agent asks the registry for the sellers of pet insurance in France that can at least quote. The registry returns Example Pets, with the register entry that its listing rests on.

```json
{
  "country": "FR",
  "line": "pet",
  "min_conformance_level": 2
}
```

```json
{
  "distributors": [
    {
      "legal_name": "Example Pets SAS",
      "trading_name": "Example Pets",
      "domain": "pets.example.com",
      "mcp_url": "https://pets.example.com/mcp",
      "poppy_url": "https://pets.example.com/.well-known/poppy.json",
      "roles": [
        "broker"
      ],
      "conformance_level": 3,
      "lines": [
        "pet"
      ],
      "countries": [
        "FR"
      ],
      "insured_families": [
        "pet"
      ],
      "licence_check": {
        "entries": [
          {
            "country": "FR",
            "identifier_type": "orias_number",
            "identifier": "00000000"
          }
        ],
        "checked_at": "2026-10-18T03:00:00+02:00"
      },
      "listed_since": "2026-10-01"
    }
  ]
}
```

### Check a listed seller

*verify_licence* · [`examples/registry-05-verify_licence.params.licensed.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-05-verify_licence.params.licensed.json) · [`examples/registry-06-verify_licence.result.licensed.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-06-verify_licence.result.licensed.json)

Before it sends any answer, the agent checks the domain that will receive them. The registry reads the ORIAS entry again, and the entry gives the website of Example Pets, so the link is `register`. The verdict is `licensed`. The agent keeps this result with the record of the sale.

```json
{
  "capacity": "distributor",
  "subject": {
    "domain": "pets.example.com"
  },
  "country": "FR",
  "line": "pet"
}
```

```json
{
  "check_id": "chk-4d1e",
  "params": {
    "capacity": "distributor",
    "subject": {
      "domain": "pets.example.com"
    },
    "country": "FR",
    "line": "pet"
  },
  "subject": {
    "legal_name": "Example Pets SAS",
    "domain": "pets.example.com",
    "domain_link": "register",
    "listed": true,
    "mcp_url": "https://pets.example.com/mcp"
  },
  "licences": [
    {
      "country": "FR",
      "regulator": "ACPR",
      "register": "ORIAS",
      "identifier_type": "orias_number",
      "identifier": "00000000",
      "role": "broker",
      "status": "active",
      "register_status": "Inscrit",
      "categories": [
        "COA"
      ],
      "name_in_register": "EXAMPLE PETS SAS",
      "access": "api",
      "checked_at": "2026-10-20T09:58:00+02:00",
      "source_url": "https://www.orias.fr/"
    }
  ],
  "outcome": {
    "verdict": "licensed",
    "message": "Example Pets SAS is in the ORIAS register as an insurance broker (COA), and the entry is active."
  },
  "checked_at": "2026-10-20T09:58:01+02:00"
}
```

### Check a seller found on the web

*verify_licence* · [`examples/registry-07-verify_licence.params.no_licence.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-07-verify_licence.params.no_licence.json) · [`examples/registry-08-verify_licence.result.no_licence.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-08-verify_licence.result.no_licence.json)

Another site sells pet cover and gives an ORIAS number in its legal notice. ORIAS has no such entry. The verdict is `not_licensed`, so the agent sends nothing to that site and tells Camille why.

```json
{
  "capacity": "distributor",
  "subject": {
    "domain": "petcover.example.com",
    "identifier": {
      "country": "FR",
      "identifier_type": "orias_number",
      "identifier": "00000001"
    },
    "legal_name": "Pet Cover Online SARL"
  },
  "country": "FR",
  "line": "pet"
}
```

```json
{
  "check_id": "chk-4d2a",
  "params": {
    "capacity": "distributor",
    "subject": {
      "domain": "petcover.example.com",
      "identifier": {
        "country": "FR",
        "identifier_type": "orias_number",
        "identifier": "00000001"
      },
      "legal_name": "Pet Cover Online SARL"
    },
    "country": "FR",
    "line": "pet"
  },
  "subject": {
    "domain": "petcover.example.com",
    "domain_link": "not_linked",
    "listed": false
  },
  "licences": [
    {
      "country": "FR",
      "regulator": "ACPR",
      "register": "ORIAS",
      "identifier_type": "orias_number",
      "identifier": "00000001",
      "status": "not_found",
      "access": "api",
      "checked_at": "2026-10-20T09:59:00+02:00",
      "source_url": "https://www.orias.fr/"
    }
  ],
  "outcome": {
    "verdict": "not_licensed",
    "reason": "no_entry",
    "message": "ORIAS has no entry with the number 00000001, and no entry in the name of Pet Cover Online SARL. This seller is not registered to sell insurance in France."
  },
  "checked_at": "2026-10-20T09:59:01+02:00"
}
```

### Load the rules of a state and a line

*get_country_rules* · [`examples/registry-13-get_country_rules.params.state_line.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-13-get_country_rules.params.state_line.json) · [`examples/registry-14-get_country_rules.result.state_line.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-14-get_country_rules.result.state_line.json)

In another sale, a customer in Texas wants to insure a cat. The agent asks for the rules of the United States, with the state and the line. Texas has no file of its own yet, so the result holds the file of the United States, then the file of pet insurance there. Each file is the file of the skill, unchanged.

```json
{
  "country": "US",
  "subdivision": "US-TX",
  "line": "pet"
}
```

```json
{
  "files": [
    {
      "country": "US",
      "version": "0.1.0",
      "owner": "AIP maintainers",
      "status": "draft",
      "language": "en",
      "effective_from": "2026-10-24",
      "content": "---\ncountry: US\nversion: 0.1.0\nowner: AIP maintainers\nstatus: draft\nlanguage: en\neffective_from: 2026-10-24\nsources:\n  - title: NAIC Producer Licensing Model Act (#218)\n    url: https://content.naic.org/sites/default/files/model-law-218.pdf\n  - title: NAIC Privacy of Consumer Financial and Health Information Regulation (#672)\n    url: https://content.naic.org/sites/default/files/model-law-672.pdf\n  - title: NAIC Insurance Data Security Model Law (#668)\n    url: https://content.naic.org/sites/default/files/model-law-668.pdf\n  - title: Gramm-Leach-Bliley Act, 15 U.S.C. 6805\n    url: https://www.law.cornell.edu/uscode/text/15/6805\n  - title: NAIC, state insurance departments\n    url: https://content.naic.org/state-insurance-departments\n---\n\n# United States\n\nDraft. No lawyer and no regulator has reviewed this file. Each rule gives its source and its review status. Follow this file as well as the procedure of the skill.\n\nEach state regulates insurance with its own laws and its own insurance department. Most states build their laws on the NAIC model acts, and their texts differ. This file holds the points that the model acts share. The files of the states come later, in `states/`. The rules of one line are in `lines/`, for example `lines/pet.md`.\n\n## Who may sell\n\n1. A person who sells, solicits or negotiates insurance in a state must hold a producer licence of that state for the line of authority. Check the seller with `verify_licence`, the capacity \"distributor\", the country US and the subdivision of the customer's state, for example US-TX, before you send any answer of the customer. Source: NAIC Producer Licensing Model Act, s. 3. Not reviewed.\n2. A licence of one state does not cover a customer in another state. When the verdict is `not_licensed` with the reason `subdivision_not_covered` or `licence_not_active`, stop with this seller. Source: NAIC Producer Licensing Model Act, s. 3. Not reviewed.\n3. An insurer transacts insurance in a state only under a certificate of authority of that state. Check the insurer behind each offer in the same way, with the capacity \"provider\". Source: state insurance codes, for example Washington RCW 48.05.030(1). Not reviewed.\n\n## What you may say\n\n1. To solicit is to try to sell insurance, or to ask or urge a person to apply for a kind of insurance from a particular company. Only a licensed producer may do it, paid or not. Do not urge the customer to buy from a particular company, and do not recommend an offer. When the customer asks for advice, say that you cannot give it, and that a licensed producer can. Source: NAIC Producer Licensing Model Act, s. 2 and s. 3. Not reviewed.\n2. To negotiate is to confer with or advise a buyer on the benefits, terms or conditions of a particular contract, by a person who sells insurance or obtains it for buyers. Give the cover in the seller's words, from the offer and the documents, and do not add your own reading of what a term means for the customer. Send that question to the seller. Source: NAIC Producer Licensing Model Act, s. 2. Not reviewed.\n3. A person with no licence may not take a commission for selling, soliciting or negotiating insurance. Follow this skill only when you, and the company that runs you, get no commission, fee or other advantage linked to the sale. Source: NAIC Producer Licensing Model Act, s. 13. Not reviewed.\n4. Give the facts of each offer as `quote` returns them, side by side, with the same fields in the same order, so that the customer compares them alone. Do not rank the offers. Source: NAIC Producer Licensing Model Act, s. 2. Not reviewed.\n\n## Documents before commitment\n\n1. No general rule names one document before commitment for property and casualty insurance. Give the customer every document with `required_before_commitment: true`, and the policy form when the seller gives it. Source: no general rule found in the NAIC model acts for property and casualty insurance. Not reviewed.\n\n## Demands and needs\n\n1. No general rule asks the seller to record the demands and needs for property and casualty insurance. Record the customer's need in their own words anyway, in step 1 of the procedure, and send it in the `NeedsAssessment`. Source: no general rule found in the NAIC model acts for property and casualty insurance. Not reviewed.\n\n## Withdrawal\n\n1. The right to return a policy after the purchase depends on the state and on the line. Most \"free look\" periods cover life, health and annuities. For other lines, tell the customer what the seller's terms say about cancellation, and give them `withdrawal_period_days` when the terms have it. Source: state insurance codes. Not reviewed.\n\n## Sensitive data\n\n1. The insurance department of each state enforces the federal privacy rules against insurers. An insurer and a producer give a privacy notice, and ask for the customer's authorisation before they disclose health information about a person. Source: Gramm-Leach-Bliley Act, 15 U.S.C. 6805(a)(6); NAIC Privacy of Consumer Financial and Health Information Regulation, s. 18. Not reviewed.\n2. Never collect a Social Security number, a bank account number or health details of a person. The customer gives them on the seller's page. Source: NAIC Insurance Data Security Model Law. Not reviewed.\n\n## Complaints\n\n1. The customer first complains to the seller, at its `complaints_url`. Give the customer that address. Source: NAIC, page on how to file a complaint. Not reviewed.\n2. The customer can then file a complaint with the insurance department of their state, which investigates for free. Give the customer its name. Source: NAIC, page on how to file a complaint. Not reviewed.\n",
      "sha256": "1c78b4f91271faa256d9f98eb7be0471f1651d9268ad05c9964123ee95f80c6a",
      "url": "https://registry.example.com/rules/us/country/0.1.0.md",
      "skill_uri": "skill://agentic-insurance-protocol/references/countries/us/country.md"
    },
    {
      "country": "US",
      "line": "pet",
      "version": "0.1.0",
      "owner": "AIP maintainers",
      "status": "draft",
      "language": "en",
      "effective_from": "2026-10-24",
      "content": "---\ncountry: US\nline: pet\nversion: 0.1.0\nowner: AIP maintainers\nstatus: draft\nlanguage: en\neffective_from: 2026-10-24\nsources:\n  - title: NAIC Pet Insurance Model Act (#633)\n    url: https://content.naic.org/sites/default/files/model-law-633.pdf\n  - title: NAIC, states that adopted the Pet Insurance Model Act\n    url: https://content.naic.org/sites/default/files/model-law-state-page-633_1.pdf\n---\n\n# United States, pet insurance\n\nDraft. No lawyer and no regulator has reviewed this file. It adds to the file of the United States, for pet insurance only. Its rules apply in the states that adopted the NAIC Pet Insurance Model Act. When you do not know if the customer's state adopted it, follow the rules anyway: each one asks only for facts that the offer and the documents give. Each rule gives its source and its review status.\n\n## Who may sell\n\n1. A producer may not sell, solicit or negotiate pet insurance before it holds the licence and has completed the training on pet insurance. Source: NAIC Pet Insurance Model Act, s. 7. Not reviewed.\n\n## Documents before commitment\n\n1. Before the purchase, the insurer discloses the exclusions for pre-existing, hereditary, congenital or chronic conditions, the waiting periods, the deductibles and the limits, and whether the premium rises with the age of the pet or with claims. Show the customer each of these points from the offer and the documents. Source: NAIC Pet Insurance Model Act, s. 4. Not reviewed.\n\n## Withdrawal\n\n1. The customer can return a pet insurance policy within 15 days of receiving it, for a full refund, unless they filed a claim. Tell the customer this period. Source: NAIC Pet Insurance Model Act, s. 4B; for example Washington RCW 48.205.040(2)(a). Not reviewed.\n\n## Complaints\n\n1. The policy gives the contact details of the insurance department of the customer's state. Give them to the customer. Source: NAIC Pet Insurance Model Act, s. 4K. Not reviewed.\n",
      "sha256": "343de7e1956fc238ae55dde721952510f360d7b58a7df4b9a93101ea876ad732",
      "url": "https://registry.example.com/rules/us/lines/pet/0.1.0.md",
      "skill_uri": "skill://agentic-insurance-protocol/references/countries/us/lines/pet.md"
    }
  ]
}
```

### Check a seller whose licence lapsed

*verify_licence* · [`examples/registry-09-verify_licence.params.lapsed.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-09-verify_licence.params.lapsed.json) · [`examples/registry-10-verify_licence.result.lapsed.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-10-verify_licence.result.lapsed.json)

In the same sale in Texas, a licence applies per state, so the agent gives the state. The operator confirmed the agency's domain when it listed it. The Texas licence lapsed, and the Oklahoma licence does not cover a customer in Texas. The verdict is `not_licensed`, and the reason comes from the Texas entry.

```json
{
  "capacity": "distributor",
  "subject": {
    "domain": "agency.example.com"
  },
  "country": "US",
  "subdivision": "US-TX",
  "line": "pet"
}
```

```json
{
  "check_id": "chk-7b90",
  "params": {
    "capacity": "distributor",
    "subject": {
      "domain": "agency.example.com"
    },
    "country": "US",
    "subdivision": "US-TX",
    "line": "pet"
  },
  "subject": {
    "legal_name": "Example Pet Agency LLC",
    "domain": "agency.example.com",
    "domain_link": "confirmed",
    "listed": false
  },
  "licences": [
    {
      "country": "US",
      "register": "NIPR Producer Database",
      "identifier_type": "npn",
      "identifier": "00000000",
      "role": "agent",
      "categories": [
        "Property",
        "Casualty"
      ],
      "lines": [
        "home",
        "renters",
        "motor",
        "pet"
      ],
      "name_in_register": "EXAMPLE PET AGENCY LLC",
      "access": "api",
      "checked_at": "2026-10-21T15:40:00-05:00",
      "source_url": "https://nipr.com/",
      "regulator": "Texas Department of Insurance",
      "subdivisions": [
        "US-TX"
      ],
      "status": "lapsed",
      "register_status": "Inactive",
      "valid_until": "2026-08-31"
    },
    {
      "country": "US",
      "register": "NIPR Producer Database",
      "identifier_type": "npn",
      "identifier": "00000000",
      "role": "agent",
      "categories": [
        "Property",
        "Casualty"
      ],
      "lines": [
        "home",
        "renters",
        "motor",
        "pet"
      ],
      "name_in_register": "EXAMPLE PET AGENCY LLC",
      "access": "api",
      "checked_at": "2026-10-21T15:40:00-05:00",
      "source_url": "https://nipr.com/",
      "regulator": "Oklahoma Insurance Department",
      "subdivisions": [
        "US-OK"
      ],
      "status": "active",
      "register_status": "Active",
      "valid_until": "2027-05-31"
    }
  ],
  "outcome": {
    "verdict": "not_licensed",
    "reason": "licence_not_active",
    "message": "Example Pet Agency LLC holds no active licence in Texas. Its Texas licence ended on 31 August 2026. Its licence in Oklahoma is active, but it does not cover a customer in Texas."
  },
  "checked_at": "2026-10-21T15:40:01-05:00"
}
```

### Check the insurer

*verify_licence* · [`examples/registry-11-verify_licence.params.provider.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-11-verify_licence.params.provider.json) · [`examples/registry-12-verify_licence.result.provider.json`](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/examples/registry-12-verify_licence.result.provider.json)

Back in France, before it applies for the offer, the agent checks Example Mutual, the insurer that carries the risk. A provider check can use the register entry from `Offer.provider` alone. The ACPR register shows an active authorisation, so the verdict is `licensed`.

```json
{
  "capacity": "provider",
  "subject": {
    "identifier": {
      "country": "FR",
      "identifier_type": "lei",
      "identifier": "EXAMPLEMUTUAL0000042"
    }
  },
  "country": "FR",
  "line": "pet"
}
```

```json
{
  "check_id": "chk-4d3c",
  "params": {
    "capacity": "provider",
    "subject": {
      "identifier": {
        "country": "FR",
        "identifier_type": "lei",
        "identifier": "EXAMPLEMUTUAL0000042"
      }
    },
    "country": "FR",
    "line": "pet"
  },
  "subject": {
    "legal_name": "Example Mutual Assurances SA",
    "lei": "EXAMPLEMUTUAL0000042",
    "listed": false
  },
  "licences": [
    {
      "country": "FR",
      "regulator": "ACPR",
      "register": "REGAFI",
      "identifier_type": "lei",
      "identifier": "EXAMPLEMUTUAL0000042",
      "role": "insurer",
      "status": "active",
      "register_status": "Actif",
      "categories": [
        "Non-vie"
      ],
      "name_in_register": "EXAMPLE MUTUAL ASSURANCES SA",
      "access": "api",
      "source_date": "2026-10-19",
      "checked_at": "2026-10-20T10:04:20+02:00",
      "source_url": "https://www.regafi.fr/"
    }
  ],
  "outcome": {
    "verdict": "licensed",
    "message": "Example Mutual Assurances SA is in the ACPR register of insurers, and its authorisation is active."
  },
  "checked_at": "2026-10-20T10:04:21+02:00"
}
```

## 13. Checks

The repository checks the examples against `schema.json`, and against the registry rules that a JSON Schema cannot express:

- **RG1** a search returns only listed servers that match every param.
- **RG2** the verdict of a licence check follows from the entries it read and from the domain link.
- **RG3** every entry was read at most seven days before the verdict.
- **RG4** a licence check repeats the params of the call.
- **RG5** a check in a country where licences apply per subdivision gives the subdivision.
- **RG6** the hash and the front matter of a rules file match the file.
- **RG7** the rules start with the file of the country.
- **RG8** the registry tools need no session, and their params hold no customer data.
- **RG9** a rules file that the registry serves is the same text as the file of the skill.

The listing steps, the order of the search results and the schedule of the checks are rules about how the operator works. A test of a live registry can check them. The examples cannot.

## 14. Open points

1. **Signed results.** A signature on each `verify_licence` result would let an agent prove later what the registry said, with no call to the registry. Draft 0.1 leaves signatures out. A later draft can add them, for example with a key that `RegistrySettings` publishes.
2. **Reading a past check.** The registry keeps each result under its `check_id`, but no tool reads it back yet.
3. **Confirming a domain.** The operator confirms the link between a domain and a register entry with its own method. A later draft can define one channel for it, for example a code that the register or the regulator sends to the holder.
4. **Names and categories.** How the registry compares a name with the name in a register, and how it maps the categories of a register to lines, is the operator's method for now. The operator publishes it at `policy_url`.
5. **US states.** The rules files of the US states come later. The US file covers the common points and says that the rules differ by state.
6. **Data agreements.** The intermediaries of the United States, the United Kingdom and France need an agreement with NIPR, the FCA and ORIAS. The insurers of the United States need one with the NAIC. See [At launch](https://agenticinsuranceprotocol.org/spec/0.1/registry#at-launch).

---

Licensed under the [Apache License 2.0](https://github.com/Agentic-Insurance-Foundation/agentic-insurance-protocol/blob/main/LICENSE).
