fr_search
Search French companies — returns identity, HQ, NAF, employees, directors, finances, matched establishments. At least one filter required.
⚠️ Enumeration capped at ~10,000 (page × per_page, per_page ≤ 25):
the API truncates without error beyond that. To enumerate a large
set exhaustively ("all companies in sector X in region Y" when there are
tens of thousands), switch to fr_stock_search (SIRENE parquet,
no cap). This tool remains the right choice for searching/qualifying (indexed,
fast, rich filters) as long as the result stays under ~10k.
⚠️ Geographic filters (departement, code_postal, commune) match ANY
establishment, NOT only the head office (siège). To target companies whose
SIÈGE is in a département, use fr_stock_search(departement=…, sieges_only=True).
⚠️ ca_min/ca_max do NOT qualify a company's size. The
filter applies to an amount whose unit varies by filing (euros or
thousands, sometimes from one year to the next for the same company) and whose
0 means "not declared" — so any upper bound brings back en masse
companies whose revenue is unknown, which biases toward the LARGEST.
Measured: tranche_effectif_salarie=51,52,53 & ca_max=400000 returns 12
results, all large companies, no true positive. To target by
size, use tranche_effectif_salarie or categorie_entreprise.
The finances block of the results carries the same caveats, flagged
line by line (alerte) — see finances_avertissement.
Spoken legal forms: people say "the SCI Untel", but the register rarely writes
the form into the name — so a query like "SCI ASC" only matches companies
literally NAMED that. On page 1, this tool detects such a prefix and ALSO runs
the name alone filtered on that form, appending the extra hits (flagged
matched_by="legal_form") and reporting what it did under legal_form_retry.
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "fr_search"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| naf | No | NAF activity codes, comma-separated (e.g. "62.01Z,62.02A"). | |
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| idcc | No | IDCC codes (conventions collectives), comma-separated. | |
| page | No | 1-based page number. | |
| query | No | Full-text search (company name, SIREN, brand…). | |
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| ca_max | No | Maximum turnover — ⚠️ NOT reliably in euros, see below. | |
| ca_min | No | Minimum turnover — ⚠️ NOT reliably in euros, see below. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| commune | No | INSEE commune code (COG, 5 digits — e.g. "67482" for Strasbourg). NOT a city name (a name raises "valeur non valide" — the API's French error message). For a place, pass `code_postal`, or use `fr_stock_search` (which resolves enseigne/commune by code too). | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| per_page | No | Page size (max 25). | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| employees | No | Employee-range codes (INSEE TEFEN) of the unité légale, comma-separated. | |
| code_postal | No | Postal code (e.g. "75001"). | |
| departement | No | Department code (e.g. "75"). | |
| nature_juridique | No | INSEE legal-form codes, comma-separated (e.g. "6540" for SCI, "5710" for SAS). Exact 4-digit codes only — an invalid value makes the API answer with the full list of valid ones. | |
| categorie_entreprise | No | INSEE size category — "PME", "ETI" or "GE". |