# SIREN / SIRET API: French company data

Source: https://veriport.io/siren-siret-api (published 2026-10-28)

A SIREN or SIRET API turns the nine- or fourteen-digit identifier a French supplier or customer gives you into the registry record behind it: who the company is, whether it is active, where it sits, what it does, how big it is, who runs it. Veriport normalises the identifier (SIREN, SIRET or French VAT number), reads the open Recherche d’entreprises API (INSEE Sirene and INPI RNE data) and, when the operator configured a key, the INSEE Sirene API, and returns one record with its source and the day it was fetched, cached 7 days and served marked stale when the registries are down.

- One identifier in, one normalised record out: SIREN, SIRET or `FRxx` VAT number are all accepted and checked (Luhn, La Poste’s exception) before any registry is asked.
- Cached 7 days, served marked stale up to 30 days when the registries do not answer, then deleted: officers’ names are personal data and are not kept longer.
- The record names its source (`source.primary`, `source.openData[]`) and `source.fetchedOn`; a non-diffusible company answers what the law allows to be published and says so.
- The upstream is free at 7 requests a second shared by everyone; what you pay for is the normalisation, the cache, the degraded path and one key for VAT, IBAN and company checks together.

## The answer, field by field

La Poste by SIREN:

| Field | What it says |
|---|---|
| `siren`, `name`, `legalName`, `acronym` | The identifier and the names the registry holds. |
| `legalForm` | INSEE’s legal category code and its label (SAS, SARL, SA, EI…). |
| `naf` | The NAF rév. 2 activity code with its section and the section’s label. |
| `status`, `createdOn`, `ceasedOn` | Active or ceased, with the dates. |
| `headcountBand`, `companyCategory`, `employer` | INSEE’s headcount band and PME/ETI/GE category, with their reference year. |
| `address`, `headquarters`, `establishment` | The registered address, the head office establishment (SIRET), and the establishment you asked for when you sent a SIRET. |
| `officers[]` | Directors and representatives from the INPI register, where the open data gives them. |
| `vatNumber` | The French VAT number computed from the SIREN (and the active numbers the registry lists): validate it on `/vat/validate` before relying on it. |
| `source` | `primary` (which registry answered), `insee` (whether the INSEE API was used), `openData[]`, `fetchedOn`, and `cache` (`hit`, `ageSeconds`, `stale`: a stale cache is served only during an outage). |
| `updatedOn` | The dates the registries last updated the record (Sirene, INSEE, RNE). |

```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
    }
  }
}
```

## When the registries are down: the degraded path

The open search API is free and shared by every caller at 7 requests a second; it has slow days. A company you asked for in the last 7 days is answered from the cache; between 7 and 30 days it is served marked `stale: true` only when the registries do not answer; beyond that, a 503 `upstream_unavailable` with `retryAfter`, never counted.

## The same call in six languages

One GET, the key optional for the first 20 calls a day.

```bash
curl "https://veriport.io/api/v1/fr/company/356000000"
# with a key, once you have one:
# curl -H "Authorization: Bearer vp_live_YOUR_KEY" "https://veriport.io/api/v1/fr/company/356000000"
```

```javascript
const KEY = process.env.VERIPORT_KEY; // optional for the first calls of the day
const res = await fetch("https://veriport.io/api/v1/fr/company/356000000", { headers: KEY ? { Authorization: "Bearer " + KEY } : {} });
const body = await res.json();
if (!res.ok) {
  // RFC 9457 problem document: body.code is stable, body.detail is for humans
  if (body.code === "upstream_unavailable") console.warn("upstream down, retry in", body.retryAfter, "s");
  throw new Error(body.code + ": " + body.detail);
}
console.log(body.name, body.status, body.source.primary);
```

```python
import os, requests

key = os.environ.get("VERIPORT_KEY")  # optional for the first calls of the day
r = requests.get("https://veriport.io/api/v1/fr/company/356000000", headers={"Authorization": f"Bearer {key}"} if key else {}, timeout=15)
body = r.json()
if not r.ok:
    # RFC 9457 problem document: body["code"] is stable, body["detail"] is for humans
    if body.get("code") == "upstream_unavailable":
        print("upstream down, retry in", body.get("retryAfter"), "s")
    raise RuntimeError(f"{body.get('code')}: {body.get('detail')}")
print(body["name"], body["status"], body["source"]["primary"])
```

```php
<?php
$key = getenv("VERIPORT_KEY") ?: null; // optional for the first calls of the day
$ch = curl_init("https://veriport.io/api/v1/fr/company/356000000");
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 15, CURLOPT_HTTPHEADER => $key ? ["Authorization: Bearer $key"] : []]);
$body = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
if ($status >= 400) {
    // RFC 9457 problem document: $body["code"] is stable, $body["detail"] is for humans
    throw new RuntimeException(($body["code"] ?? "error") . ": " . ($body["detail"] ?? ""));
}
var_dump($body["name"], $body["status"], $body["source"]["primary"]);
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

func main() {
	req, _ := http.NewRequest("GET", "https://veriport.io/api/v1/fr/company/356000000", nil)
	if key := os.Getenv("VERIPORT_KEY"); key != "" { // optional for the first calls of the day
		req.Header.Set("Authorization", "Bearer "+key)
	}
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var body map[string]any
	json.NewDecoder(res.Body).Decode(&body)
	if res.StatusCode >= 400 {
		// RFC 9457 problem document: body["code"] is stable, body["detail"] is for humans
		panic(fmt.Sprintf("%v: %v", body["code"], body["detail"]))
	}
	fmt.Println(body["name"], body["status"], body["source"].(map[string]any)["primary"])
}
```

```csharp
using System.Net.Http.Headers;
using System.Text.Json;

var http = new HttpClient();
var key = Environment.GetEnvironmentVariable("VERIPORT_KEY"); // optional for the first calls of the day
if (!string.IsNullOrEmpty(key)) http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
var res = await http.GetAsync("https://veriport.io/api/v1/fr/company/356000000");
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
    // RFC 9457 problem document: "code" is stable, "detail" is for humans
    throw new Exception($"{body.RootElement.GetProperty("code")}: {body.RootElement.GetProperty("detail")}");
}
Console.WriteLine(body.RootElement.GetProperty("name") + " " + body.RootElement.GetProperty("status") + " " + body.RootElement.GetProperty("source").GetProperty("primary"));
```

## Price per 1,000 calls, against the alternatives

Competitors’ figures are read from their public pricing pages on 2026-10-28 at full use of the included volume; a range means several tiers. Ours include the tax of your country, charged by Stripe as merchant of record.

The French data vendors (Pappers, Infogreffe, societe.com) sell documents and subscriptions rather than per-call lookups, so no per-1,000 figure is comparable; the honest comparison is with the free upstream.

| Offer | Price | Included | Per 1,000 | Billing |
|---|---|---|---|---|
| [API Recherche d’entreprises](https://recherche-entreprises.api.gouv.fr/) (DINUM) | free | 7 requests/s shared | $0 | No key, no cache, no SLA, raw records |
| [INSEE Sirene API](https://portail-api.insee.fr/) | free | 30 requests/min | $0 | Key, quotas, raw INSEE records |
| **Veriport** 2,000 pack | $9 once | 2,000 calls, 12 months | $4.50 | Prepaid, no renewal |
| **Veriport** 10,000 pack | $29 once | 10,000 calls, 12 months | $2.90 | Prepaid, no renewal |
| **Veriport** monthly plan | $15 / month | 5,000 calls + bulk | $3.00 | Subscription, cancel any time |

> Free before any of this: 100 calls a month with a key, 20 a day without one. A 4xx or 5xx is never counted.

## What it is not

Not a Kbis extract and not affiliated with INSEE, INPI or DINUM: the record is the open data of the registries, normalised. Not a credit score, not beneficial-ownership data (the RBE is not open), not a monitoring service; re-validation on a schedule is on the roadmap.

## Questions

### Why pay when api.gouv.fr is free?

If one lookup now and then is all you need, do not pay: call the open API, the guide shows how. The paid tiers are for the system that checks every new French customer or supplier and wants a normalised record, a cache that bridges outages, a stable error contract and the same key that checks VAT numbers and IBANs.

### Can I send a French VAT number?

Yes: `FR` + 2 characters + the SIREN. The API computes and checks the key, extracts the SIREN and answers the company; the VAT number is not validated on VIES by this endpoint (use /vat/validate for that).

### What about companies that opted out of publication?

INSEE marks them non-diffusible; the registry then publishes a reduced record and the API returns what is published, with `diffusion` set accordingly. Nothing is reconstructed from other sources.

## Read next

- [Reference: GET /fr/company/{id}](https://veriport.io/docs/fr-company)
- [French company data: the sources and the cache](https://veriport.io/docs/french-company-data)
- [API Sirene: what the free API gives you](https://veriport.io/guides/api-sirene-what-the-free-government-api-gives-you)
- [En français : API SIRET gratuite](https://veriport.io/fr/api-siret)
- [En français : vérifier un SIRET](https://veriport.io/fr/verifier-un-siret)
- [The VAT validation API](https://veriport.io/vat-validation-api)

## Sources

- API Recherche d’entreprises — open search API over INSEE Sirene and INPI RNE data (no key, 7 requests a second), OpenAPI document — https://recherche-entreprises.api.gouv.fr/docs/ (2026-10-24)
- INSEE — API Sirene 3.11 (siren/{siren}, siret/{siret}), key-based through the INSEE API portal, 30 requests a minute — https://portail-api.insee.fr/ (2026-10-24)
- INPI — Registre national des entreprises (RNE), open data on company officers (dirigeants) re-served by the Recherche d’entreprises API — https://www.inpi.fr/le-registre-national-des-entreprises (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 — https://www.insee.fr/fr/information/2406147 (2026-10-24)
