The SIREN and SIRET format
The SIREN identifies a company (the legal unit) with 9 digits. The SIRET identifies one of its establishments with 14 digits: the SIREN followed by an internal 5-digit number (NIC). Both end with a check digit calculated with the Luhn algorithm, which makes it possible to spot a typing error without querying a database.
| Number | Length | Identifies | Example |
|---|---|---|---|
| SIREN | 9 digits | The company (legal unit) | 552032534 |
| SIRET | 14 digits | An establishment: SIREN + NIC (5 digits) | 55203253400646 |
The API accepts numbers the way your users type them, with spaces, dots or hyphens. In responses, each company carries a global identifier: the country code, a hyphen, then the national number (FR-552032534). For more on the format, see the difference between SIREN and SIRET and the SIREN number.
Reading a company record by its SIREN
A GET /v2/companies/FR-{siren} request returns the record. Additional blocks (address, VAT, signals, legal notices, establishments) are requested with the include parameter, so you only pay in response time for what you read.
curl "https://api.jsonpage.com/v2/companies/FR-552032534?include=address" \
-H "X-API-Key: $JSONPAGE_API_KEY"
{
"data": {
"id": "FR-552032534",
"country": "FR",
"registry_id": "552032534",
"name": "DANONE",
"status": "active",
"legal_form": { "code": "5599", "label": "SA à conseil d'administration (s.a.i.)" },
"activity": { "nace": "70.10", "code": "70.10Z", "label": "Activités des sièges sociaux" },
"incorporated_on": "1955-01-01",
"closed_on": null,
"updated_at": "2026-09-10T11:14:57Z",
"address": {
"line": "59 RUE LA FAYETTE",
"postal_code": "75009",
"city": "PARIS",
"country": "FR",
"formatted": "59 RUE LA FAYETTE, 75009 PARIS"
}
},
"meta": {
"sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-09-29" }],
"includes": { "address": "ok" }
}
}
Abridged response: the classification identifiers (scheme) of the legal_form and activity blocks are omitted here.
For establishments, GET /v2/companies/FR-{siren}/establishments lists those of the company, page by page. All routes are described in the documentation and in the OpenAPI specification.
Searching by name and completing a form
GET /v2/companies?q=danone searches companies by name, and GET /v2/companies?registry_id=552032534 finds a company from its national number alone. For a form field, GET /v2/autocomplete returns lightweight suggestions (name, city, postal code) as the user types; call it from your server to keep the key secret.
curl "https://api.jsonpage.com/v2/autocomplete?q=carrefour&limit=1" \
-H "X-API-Key: $JSONPAGE_API_KEY"
{
"data": [
{ "id": "FR-652014051", "name": "CARREFOUR", "status": "active", "postal_code": "91300", "city": "MASSY", "kind": "company" }
]
}
Validating an entered SIREN or SIRET
GET /v2/validate checks the numbers in a form in a single call: format, check digit, existence, active company, and consistency between the SIREN, the SIRET and the VAT number. The response is 200 even when a value is invalid: valid tells you whether all checks passed, and checks details each one.
curl "https://api.jsonpage.com/v2/validate?id=FR-652014051&vat=FR14652014051" \
-H "X-API-Key: $JSONPAGE_API_KEY"
{
"data": {
"valid": true,
"checks": [
{ "code": "id_format", "ok": true, "value": "FR-652014051" },
{ "code": "siren_key", "ok": true, "value": "652014051" },
{ "code": "vat_format", "ok": true, "value": "FR14652014051" },
{ "code": "identifiers_match", "ok": true, "value": "FR-652014051" },
{ "code": "company_exists", "ok": true, "value": "FR-652014051" },
{ "code": "company_active", "ok": true, "value": "active" },
{ "code": "vat_registered", "ok": true, "value": "valid" }
],
"company": { "id": "FR-652014051", "name": "CARREFOUR", "status": "active", "...": "..." }
}
}
A malformed identifier returns the error 400 invalid_identifier, an unknown identifier 404 not_found. To verify a VAT number, see the intra-EU VAT verification API page.
Examples in your language
The key is read from the environment; it stays on your server.
JavaScript
const res = await fetch("https://api.jsonpage.com/v2/companies/FR-552032534", {
headers: { "X-API-Key": process.env.JSONPAGE_API_KEY },
});
const { data } = await res.json();
console.log(data.name, data.status);
Python
import os, requests
res = requests.get(
"https://api.jsonpage.com/v2/companies/FR-552032534",
headers={"X-API-Key": os.environ["JSONPAGE_API_KEY"]},
)
data = res.json()["data"]
print(data["name"], data["status"])
PHP
<?php
$ch = curl_init("https://api.jsonpage.com/v2/companies/FR-552032534");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["X-API-Key: " . getenv("JSONPAGE_API_KEY")],
]);
$data = json_decode(curl_exec($ch), true)["data"];
echo $data["name"], " ", $data["status"];
Ruby
require "net/http"
require "json"
uri = URI("https://api.jsonpage.com/v2/companies/FR-552032534")
req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV["JSONPAGE_API_KEY"])
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)["data"]
puts "#{data["name"]} #{data["status"]}"
Limits and pricing
Plans have fixed prices: Discovery at €0, Standard at €19 excl. VAT per month and Pro at €129 excl. VAT per month. The rate is 100, 1,000 and 10,000 requests per minute, with no monthly quota; the Discovery plan (free) is also capped at 1,000 requests per day. Fixed price, no credits, no overage billed. Details are on the Pricing page.
Frequently asked questions
What is the difference between a SIREN and a SIRET?+
The SIREN has 9 digits and identifies the company. The SIRET has 14 digits and identifies one of its establishments: it is the SIREN followed by an internal 5-digit number.
Does the API accept a SIREN entered with spaces?+
Yes. Spaces, dots and hyphens in the SIREN and SIRET are ignored; a malformed number returns the invalid_identifier error.
How do I find a SIREN from a company name?+
With search by name, GET /v2/companies?q=, or with autocomplete, GET /v2/autocomplete, designed for form fields.
Does the API flag a closed company?+
Yes. Each record carries its status (active or closed) and its closing date when there is one, and the validation route indicates whether the company is active.
Is there a monthly request quota?+
No. Limits apply to the rate per minute: 100 requests with the Discovery plan (free), 1,000 with Standard and 10,000 with Pro. Fixed price, no credits, no overage billed. Only the Discovery plan (free) has an additional cap of 1,000 requests per day, reset at midnight UTC.