French company data from a SIREN or SIRET

GET /fr/company/{id} turns a French identifier into one normalised record built from the public registries: the open Recherche d’entreprises API (INSEE Sirene and INPI RNE data, no key) and, when the operator has configured a key, the INSEE Sirene API itself. Every answer says which source answered, when, and whether it came from the cache.

One call

A SIREN gives the company and its headquarters; a SIRET gives the same plus the establishment asked for under establishment.

curl — French company by SIREN (no key for the first 20 calls a day)
curl "https://veriport.io/api/v1/fr/company/356000000"

Where each field comes from

FieldSourceNote
name, legalForm, naf, status, dates, headcountBand, companyCategory, employer, address, establishmentsINSEE Sirene (through the open search API, or the INSEE API with a key)Codes are returned as published; labels for the common legal forms and the 16 headcount bands, the NAF section letter for every code.
officersINPI RNE open data (re-served by the open search API)Null when the source lists none or when the answer was built from INSEE alone. Persons: name, first names, role, birth year, nationality as published; companies: name, role, SIREN.
vatNumber.computedComputed: FR + (12 + 3 × (SIREN mod 97)) mod 97 + SIRENA computation, not a registration check: ask /vat/validate whether VIES knows it.
source.primary / insee / openData / fetchedOn / cacheThis serviceprimary: insee when the open search API failed and a key let the INSEE API answer alone.

Rate limits upstream, and what they mean for you

The open search API allows 7 requests a second shared by all its users; the INSEE API 30 a minute per application. Each instance paces its calls to stay inside those limits: a single lookup waits up to a few seconds for a slot, then answers from the cache (marked stale) or a 503 upstream_unavailable with Retry-After; a 429 from a registry pauses that registry for the time it asks. The bulk endpoint goes through the same pacing one identifier at a time, serving cached answers without waiting, so a list of 100 takes up to about fifteen seconds when nothing is cached.

Personal data

Sole traders (entrepreneurs individuels) are natural persons, and officers’ names are personal data, even when the register publishes them. Units that opposed publication (diffusion: "P") have their address withheld by the sources; units whose publication is restricted are not returned at all (404). Answers are cached at most 30 days and then deleted; use the data for the purpose you collected the identifier for (invoicing, KYB, supplier checks), not for prospecting lists.

What it is not

Not a Kbis extract: the legal proof of a company’s registration is the extract issued by the register (INPI / greffes), not an API answer. No financial statements, no beneficial owners (that register is not open), no court decisions. Not affiliated with INSEE, INPI or DINUM.

Questions

Do I need an INSEE key?
No. The service works on the open search API alone; the operator’s INSEE key, when configured, fills gaps and keeps answering when the search API is down.
How fresh is the data?
updatedOn carries the dates the sources give (registry, INSEE, RNE); source.fetchedOn is when we asked. A cached answer is at most 7 days old unless marked stale.

20 calls a day without a key.

Try it without a key

Sources