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.

GET/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

NameInTypeDescription
id*pathstringSIREN (9 digits), SIRET (14 digits) or a French VAT number; spaces and dots allowed.Example: 356000000

Request

curl
curl "https://veriport.io/api/v1/fr/company/356000000"

Response 200

The company.

FieldTypeDescription
siren*string
namestring | nullFull name as the registry shows it.
legalNamestring | null
acronymstring | null
legalForm*object
legalForm.codestring | nullINSEE catégorie juridique.
legalForm.labelstring | nullNull for codes outside the carried list; the code is still returned.
naf*object
naf.codestring | nullNAF rév. 2 (APE) code.
naf.sectionstring | null
naf.sectionLabelstring | null
status*"active" | "ceased" | null
createdOnstring | null (date)
ceasedOnstring | null (date)
headcountBandobject | null
headcountBand.codestring
headcountBand.labelstring | null
headcountBand.yearstring | null
companyCategoryobject | null
companyCategory.code"PME" | "ETI" | "GE"
companyCategory.labelstring | null
companyCategory.yearstring | null
employerboolean | null
diffusionstring | nullO full publication, P partial (opposition): individuals’ addresses are then withheld by the sources.
address*FrAddress
headquartersobject
establishmentobjectThe establishment asked for when the query was a SIRET.
establishmentsobject
establishments.totalinteger | null
establishments.openinteger | null
vatNumber*object
vatNumber.computedstringFR + key + SIREN, computed; not a registration check.
vatNumber.activeNumbersarray | null
vatNumber.notestring
officersarray | nullFrom the open INPI RNE data as re-served by the search API; null when the source gives none.
updatedOnobject
updatedOn.registrystring | null
updatedOn.inseestring | null
updatedOn.rnestring | 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.inseebooleanTrue when the INSEE Sirene API was also consulted (operator key configured).
source.openDatastring[]
source.fetchedOnstring (date-time)When the registry was asked (the cache fill time for a cached answer).
source.cacheobject
200 OK · application/json
{
  "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

  • 400invalid_parameter — A parameter is missing or malformed.
  • 401unauthorized — The API key is missing, unknown or revoked.
  • 402quota_exceeded — Monthly allowance and credits are used up.
  • 404not_found — No such resource.
  • 429rate_limited — Too many requests per second.
  • 503upstream_unavailable — The public registry did not answer and no cached answer exists.
POST/fr/company/bulk

Up 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.

FieldTypeDescription
ids*string[]
application/json
{
  "ids": [
    "356000000",
    "35600000000048",
    "FR40303265045"
  ]
}

Request

curl
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.

FieldTypeDescription
resultsobject[]
countedinteger

Headers: RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset, RateLimit-Policy, X-Quota-Remaining, X-Tier.

Errors

  • 400invalid_parameter — A parameter is missing or malformed.
  • 401unauthorized — The API key is missing, unknown or revoked.
  • 402quota_exceeded — Monthly allowance and credits are used up.
  • 403forbidden_for_tier — This option is not included in your tier.
  • 429rate_limited — Too many requests per second.

Sources