French company registry
Looks the identifier up (spaces and dots removed; a French VAT number is accepted and its SIREN used), checks its Luhn key, then asks the open Recherche d'entreprises API (INSEE Sirene + INPI RNE data, 7 requests a second shared by everyone) and, when the operator has configured an INSEE key, the INSEE Sirene API for the unité légale. Answers are cached 7 days (served marked stale up to 30 days when the registries are down) and normalised: legal form, NAF code and section, status, address, headcount band, company category, establishments, the computed VAT number, officers where the open RNE data gives them. Every answer carries source (which APIs answered, cache hit and age) and fetchedOn. A SIRET answers the company with that establishment under establishment.
About the sources
Built from the open Recherche d’entreprises API (DINUM; INSEE Sirene and INPI RNE data; 7 requests a second shared by all its users) and, when the operator configured a key, the INSEE Sirene API (30 a minute). Cached 7 days; served marked stale up to 30 days when the registries are down; deleted after. Not a Kbis extract; not affiliated with INSEE, INPI or DINUM.
/fr/company/{id}French company by SIREN or SIRET
Looks the identifier up (spaces and dots removed; a French VAT number is accepted and its SIREN used), checks its Luhn key, then asks the open Recherche d'entreprises API (INSEE Sirene + INPI RNE data, 7 requests a second shared by everyone) and, when the operator has configured an INSEE key, the INSEE Sirene API for the unité légale. Answers are cached 7 days (served marked stale up to 30 days when the registries are down) and normalised: legal form, NAF code and section, status, address, headcount band, company category, establishments, the computed VAT number, officers where the open RNE data gives them. Every answer carries source (which APIs answered, cache hit and age) and fetchedOn. A SIRET answers the company with that establishment under establishment.
- Tiers
- anonymousfreecreditsplan
- Cost
- 1 call (cached or live); 0 on 404 or 503
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| id* | path | string | SIREN (9 digits), SIRET (14 digits) or a French VAT number; spaces and dots allowed.Example: 356000000 |
Request
curl "https://veriport.io/api/v1/fr/company/356000000"Response 200
The company.
| Field | Type | Description |
|---|---|---|
| siren* | string | |
| name | string | null | Full name as the registry shows it. |
| legalName | string | null | |
| acronym | string | null | |
| legalForm* | object | |
| legalForm.code | string | null | INSEE catégorie juridique. |
| legalForm.label | string | null | Null for codes outside the carried list; the code is still returned. |
| naf* | object | |
| naf.code | string | null | NAF rév. 2 (APE) code. |
| naf.section | string | null | |
| naf.sectionLabel | string | null | |
| status* | "active" | "ceased" | null | |
| createdOn | string | null (date) | |
| ceasedOn | string | null (date) | |
| headcountBand | object | null | |
| headcountBand.code | string | |
| headcountBand.label | string | null | |
| headcountBand.year | string | null | |
| companyCategory | object | null | |
| companyCategory.code | "PME" | "ETI" | "GE" | |
| companyCategory.label | string | null | |
| companyCategory.year | string | null | |
| employer | boolean | null | |
| diffusion | string | null | O full publication, P partial (opposition): individuals’ addresses are then withheld by the sources. |
| address* | FrAddress | |
| headquarters | object | |
| establishment | object | The establishment asked for when the query was a SIRET. |
| establishments | object | |
| establishments.total | integer | null | |
| establishments.open | integer | null | |
| vatNumber* | object | |
| vatNumber.computed | string | FR + key + SIREN, computed; not a registration check. |
| vatNumber.activeNumbers | array | null | |
| vatNumber.note | string | |
| officers | array | null | From the open INPI RNE data as re-served by the search API; null when the source gives none. |
| updatedOn | object | |
| updatedOn.registry | string | null | |
| updatedOn.insee | string | null | |
| updatedOn.rne | string | null | |
| source* | object | |
| source.primary | "recherche_entreprises" | "insee" | insee when the open search API failed and the answer was built from the INSEE Sirene API alone (officers are then null). |
| source.insee | boolean | True when the INSEE Sirene API was also consulted (operator key configured). |
| source.openData | string[] | |
| source.fetchedOn | string (date-time) | When the registry was asked (the cache fill time for a cached answer). |
| source.cache | object |
{
"siren": "356000000",
"name": "LA POSTE",
"legalName": "LA POSTE",
"acronym": null,
"legalForm": {
"code": "5510",
"label": "SA nationale à conseil d’administration"
},
"naf": {
"code": "53.10Z",
"section": "H",
"sectionLabel": "Transportation and storage"
},
"status": "active",
"createdOn": "1991-01-01",
"ceasedOn": null,
"headcountBand": {
"code": "53",
"label": "10,000 employees or more",
"year": "2023"
},
"companyCategory": {
"code": "GE",
"label": "Large enterprise (GE)",
"year": "2023"
},
"employer": true,
"diffusion": "O",
"address": {
"street": "9 RUE DU COLONEL PIERRE AVIA",
"postalCode": "75015",
"city": "PARIS",
"cityCode": "75115",
"country": "FR",
"full": "9 RUE DU COLONEL PIERRE AVIA 75015 PARIS"
},
"headquarters": {
"siret": "35600000000048",
"isHeadquarters": true,
"status": "active",
"naf": "53.10Z",
"address": {
"street": "9 RUE DU COLONEL PIERRE AVIA",
"postalCode": "75015",
"city": "PARIS",
"cityCode": "75115",
"country": "FR",
"full": "9 RUE DU COLONEL PIERRE AVIA 75015 PARIS"
},
"createdOn": "2014-01-01",
"closedOn": null,
"tradeName": null,
"headcountBand": null
},
"establishment": null,
"establishments": {
"total": 12345,
"open": 9876
},
"vatNumber": {
"computed": "FR39356000000",
"activeNumbers": [
"FR39356000000"
],
"note": "computed from the SIREN; validate it with GET /vat/validate before relying on it."
},
"officers": [
{
"type": "person",
"name": "EXEMPLE",
"firstNames": "PRÉNOM",
"role": "Président du conseil d’administration",
"birthYear": null,
"nationality": "Française",
"siren": null
}
],
"updatedOn": {
"registry": "2026-10-20",
"insee": "2026-10-19",
"rne": "2026-10-18"
},
"source": {
"primary": "recherche_entreprises",
"insee": false,
"openData": [
"recherche_entreprises",
"inpi_rne"
],
"fetchedOn": "2026-10-24T09:14:03Z",
"cache": {
"hit": false,
"ageSeconds": 0,
"stale": false
}
}
}Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, RateLimit-Policy, X-Quota-Remaining, X-Tier.
Errors
- 400
invalid_parameter— A parameter is missing or malformed. - 401
unauthorized— The API key is missing, unknown or revoked. - 402
quota_exceeded— Monthly allowance and credits are used up. - 404
not_found— No such resource. - 429
rate_limited— Too many requests per second. - 503
upstream_unavailable— The public registry did not answer and no cached answer exists.
/fr/company/bulkUp to 100 French companies in one request
Monthly plan only. Each identifier is answered as GET /fr/company/{id} would, in order; the upstream calls are paced inside the shared 7 requests a second of the open API (and 30 a minute for INSEE when configured), with cached answers served first. Each answered item counts one call; refused items are problem documents in place and cost nothing.
- Tiers
- plan
- Cost
- 1 call per answered item
Request body
Media types: application/json.
| Field | Type | Description |
|---|---|---|
| ids* | string[] |
{
"ids": [
"356000000",
"35600000000048",
"FR40303265045"
]
}Request
curl -X POST -H "Authorization: Bearer vp_live_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"ids":["356000000","35600000000048","FR40303265045"]}' \
"https://veriport.io/api/v1/fr/company/bulk"Response 200
One result per identifier, in order.
| Field | Type | Description |
|---|---|---|
| results | object[] | |
| counted | integer |
Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, RateLimit-Policy, X-Quota-Remaining, X-Tier.
Errors
- 400
invalid_parameter— A parameter is missing or malformed. - 401
unauthorized— The API key is missing, unknown or revoked. - 402
quota_exceeded— Monthly allowance and credits are used up. - 403
forbidden_for_tier— This option is not included in your tier. - 429
rate_limited— Too many requests per second.
Sources
- API Recherche d’entreprises — open search API over INSEE Sirene and INPI RNE data (no key, 7 requests a second), OpenAPI document — DINUM / Annuaire des Entreprises, consulted 2026-10-24
- INSEE — API Sirene 3.11 (siren/{siren}, siret/{siret}), key-based through the INSEE API portal, 30 requests a minute — INSEE, consulted 2026-10-24. Called only when INSEE_SIRENE_API_KEY is set; never from this build.
- INPI — Registre national des entreprises (RNE), open data on company officers (dirigeants) re-served by the Recherche d’entreprises API — INPI, consulted 2026-10-24
- INSEE — Nomenclature d’activités française (NAF rév. 2) and the legal-category (catégorie juridique) and headcount-band code lists — INSEE, consulted 2026-10-24