Jsonpage · SIREN and SIRET API
INTEGRATION GUIDE

API documentation

Everything you need to add company and establishment lookups to your product.

01 / QUICK START

Get started in 2 minutes

The base URL of the API is https://api.jsonpage.com/v2. Each call sends your API key in the X-API-Key header. On this page, routes are written with their full path from api.jsonpage.com, for example /v2/companies/{id}.

1. Get your key: Get my key. The free account is instant and the key appears in your dashboard.

2. Make a call: this request reads a real company, FR-552032534, with its address and its verified VAT number.

curl "https://api.jsonpage.com/v2/companies/FR-552032534?include=address,vat" \
  -H "X-API-Key: YOUR_KEY"

3. Read the response: the complete response, nothing shortened. vat.status is valid when the number is confirmed by the European check; pending means the check has not completed yet, try again later.

{
  "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.)", "scheme": "FR-CJ" },
    "activity": { "nace": "70.10", "code": "70.10Z", "label": "Activités des sièges sociaux", "scheme": "FR-NAF-REV2" },
    "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"
    },
    "vat": { "number": "FR27552032534", "status": "valid", "checked_at": "2026-10-11T00:14:31Z", "source": "EU VAT check" }
  },
  "meta": {
    "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-09-29" }],
    "includes": { "address": "ok", "vat": "ok" }
  }
}
Postman collectionAvailable after free sign-up: download it from your dashboard. The discovery collection (no key inside, a few requests) downloads without an account.
Try it without installing anythingWithout an account, the homepage demo queries the API live with a real company. Once signed up, the Tester in your dashboard sends any request with your account, without writing code.
Before you startKeep the key on your server. Do not put it in JavaScript sent to the browser.

Node.js (fetch)

// Node.js 18 or later, ES module. The key is read from the environment.
const response = await fetch(
  "https://api.jsonpage.com/v2/companies/FR-552032534?include=address,vat",
  { headers: { "X-API-Key": process.env.JSONPAGE_API_KEY } }
);
if (!response.ok) throw new Error(`Jsonpage API: ${response.status}`);

const { data } = await response.json();
console.log(data.name, data.address?.formatted, data.vat?.status);

Python (requests)

import os
import requests

response = requests.get(
    "https://api.jsonpage.com/v2/companies/FR-552032534",
    params={"include": "address,vat"},
    headers={"X-API-Key": os.environ["JSONPAGE_API_KEY"]},
    timeout=10,
)
response.raise_for_status()

company = response.json()["data"]
print(company["name"], company["status"], company["vat"]["status"])

PHP (cURL)

<?php
$ch = curl_init('https://api.jsonpage.com/v2/companies/FR-552032534?include=address,vat');
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('JSONPAGE_API_KEY')],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($body === false || $status !== 200) {
    throw new RuntimeException("Jsonpage API: $status");
}

$company = json_decode($body, true)['data'];
echo $company['name'], ' ', $company['status'], ' ', $company['vat']['status'], PHP_EOL;

Ruby (net/http)

require "json"
require "net/http"

uri = URI("https://api.jsonpage.com/v2/companies/FR-552032534?include=address,vat")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("JSONPAGE_API_KEY")

response = Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 10) { |http| http.request(request) }
raise "Jsonpage API: #{response.code}" unless response.is_a?(Net::HTTPSuccess)

company = JSON.parse(response.body).fetch("data")
puts [company["name"], company["status"], company.dig("vat", "status")].join(" ")

The Node.js, Python, PHP and Ruby examples read the key from the JSONPAGE_API_KEY environment variable. The response and the list of blocks are described in the API v2 part.

Autocomplete in a form: go through your server

The browser calls an endpoint of your server, which adds the key and calls /v2/autocomplete. Example of a server-side route (Node.js):

import { createServer } from "node:http";

createServer(async (req, res) => {
  const incoming = new URL(req.url, "http://localhost");
  if (incoming.pathname !== "/api/companies/suggest") { res.writeHead(404).end(); return; }
  const q = (incoming.searchParams.get("q") ?? "").trim();
  res.setHeader("Content-Type", "application/json");
  if (q.length < 2) { res.end(JSON.stringify({ data: [] })); return; }

  const url = new URL("https://api.jsonpage.com/v2/autocomplete");
  url.search = new URLSearchParams({ q, limit: "8" });
  const response = await fetch(url, { headers: { "X-API-Key": process.env.JSONPAGE_API_KEY } });
  // Too short, rate limited…: no suggestion.
  res.end(response.ok ? await response.text() : JSON.stringify({ data: [] }));
}).listen(3000);

In the browser, wait about 150 ms after the last keystroke before calling your endpoint: one suggestion per typing pause, rather than one per key.

const input = document.querySelector("#company");
let timer;

input.addEventListener("input", () => {
  clearTimeout(timer);
  timer = setTimeout(async () => {
    const response = await fetch(`/api/companies/suggest?q=${encodeURIComponent(input.value)}`);
    const { data } = await response.json();
    // Show name, postal_code and city; keep id for the next step.
  }, 150);
});

Validate the identifiers entered

Before saving the form, your server checks the SIREN, SIRET and VAT number entered, in one call:

const params = new URLSearchParams({ id: "FR-652014051", vat: "FR14652014051" });
const response = await fetch(`https://api.jsonpage.com/v2/validate?${params}`, {
  headers: { "X-API-Key": process.env.JSONPAGE_API_KEY },
});
const { data } = await response.json();

if (!data.valid) {
  const failed = data.checks.filter((check) => !check.ok).map((check) => check.code);
  // For example ["vat_format"]: ask the user to correct the VAT number.
}

The /v2/autocomplete and /v2/validate endpoints are described in the Forms part.

02 / API V2 (MULTI-COUNTRY)

One format for several countries

The API v2 returns the same format for every country served, with the same key and the same plan. France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan and the United Kingdom are available.

Global identifier

Each company has a global identifier: the two-letter ISO 3166-1 country code, a hyphen, then the national registry number, without spaces or punctuation. Examples: FR-552032534 for a French SIREN, GB-00445790 for an 8-character UK company number, BE-0417497106 for a 10-digit Belgian enterprise number, CH-101374515 for a 9-digit Swiss UID, without the CHE prefix.

For the other countries: NO-923609016 for a 9-digit Norwegian organisation number, FI-01120389 for a Finnish Business ID (the 7 digits and the check digit, without hyphen; 0112038-9 is accepted), LV-40003245752 for an 11-digit Latvian registration number, AU-51824753556 for an 11-digit Australian Business Number (ABN), SG-196800306E for a Singapore UEN of 9 or 10 characters, JP-1180301018771 for a 13-digit Japanese corporate number, IE-104547 for an Irish company number of 1 to 7 digits, SE-5560427220 for a 10-digit Swedish organisation number, EE-10137025 for an 8-digit Estonian registry code and LT-110053842 for a 9-digit Lithuanian legal entity code.

The country is part of the identifier because national numbers overlap: a French SIREN and a Norwegian organisation number both have 9 digits. Reuse the identifier returned in data.id.

Available endpoints

AuthenticationBase URL: https://jsonpage.com. Send your API key in the X-API-Key header with every call; the examples read it from the JSONPAGE_API_KEY variable. Only the service health endpoints work without it. Click an endpoint to see its parameters, an example and its errors.

Jsonpage

GET/v2/companies/{id}Get a company's record

Returns a company's record from its global identifier. Without options, it holds the base fields: name, status, legal form, activity and dates. Add the address, the VAT number or other blocks with include.

Parameters

  • idrequiredin the path · text

    Country code, hyphen, then the registry number: FR-552032534, BE-0417497106, CH-101374515, NO-923609016, FI-01120389, LV-40003245752, IE-104547, SE-5560427220, EE-10137025, LT-110053842, AU-51824753556, SG-196800306E, JP-1180301018771, GB-00445790.

  • includeoptionalin the query ?… · comma-separated list

    Blocks to add, for example address,vat. None by default. Values: address, establishments, local, vat, signals, legal_events, officers, owners, sanctions. What each block holds: Blocks on demand.

  • fieldsoptionalin the query ?… · comma-separated list

    Keeps only these base fields, for example name,status. All by default; id is always returned.

Example

curl "https://api.jsonpage.com/v2/companies/CH-101374515?include=address" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": {
    "id": "CH-101374515",
    "country": "CH",
    "registry_id": "101374515",
    "name": "The Swatch Group AG",
    "status": "active",
    "legal_form": { "code": "0106", "label": "Société anonyme", "...": "..." },
    "address": { "postal_code": "2000", "city": "Neuchâtel", "...": "..." },
    "...": "..."
  },
  "meta": { "includes": { "address": "ok" }, "sources": [{ "...": "..." }] }
}

Possible errors

  • 400 invalid_identifier: malformed identifier (expected: country code, hyphen, number)
  • 400 unknown_include: unknown block in include
  • 404 country_not_supported: country not served yet
  • 404 not_found: no company with this identifier

Errors common to all endpoints (key, IP address, rate): Errors and limits.

Countries France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan and the United Kingdom. A block missing in a country is reported in meta.includes (not_available_in_country), without an error.

GET/v2/companies/{id}/establishmentsList a company's establishments

Returns a company's establishments (sites, shops, branches), page by page. For the next page, pass the next value to the after parameter; on the last page, next is null.

Parameters

  • idrequiredin the path · text

    Global identifier of the company, for example FR-552032534.

  • limitoptionalin the query ?… · integer

    Establishments per page: 20 by default, from 1 to 100.

  • afteroptionalin the query ?… · text

    The next value of the previous page. Absent: first page.

Example

curl "https://api.jsonpage.com/v2/companies/FR-552032534/establishments?limit=2" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": {
    "items": [
      { "registry_id": "55203253400414", "name": "...", "head_office": false, "...": "..." },
      { "registry_id": "...", "...": "..." }
    ],
    "next": "..."
  },
  "meta": { "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-10-01" }] }
}

Possible errors

  • 400 invalid_parameter: limit outside 1 to 100
  • 404 not_found: no company with this identifier
  • 404 not_available_in_country: no establishments in this country's register (Switzerland, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan, United Kingdom)

Errors common to all endpoints (key, IP address, rate): Errors and limits.

Countries France (14-digit SIRET) and Belgium (10-digit establishment unit number) only.

GET/v2/companies?q=…Search companies by name

Searches companies by name, in one or several countries. Exact names come first, then active companies. The whole search counts as a single request.

Parameters

  • qrequiredin the query ?… · text

    The name searched for. Every word of 2 characters or more must appear in the name; the last one can be the start of a word (dano finds DANONE).

  • countryoptionalin the query ?… · comma-separated list

    Countries to search, for example FR,BE. All by default. Values: FR, BE, CH, NO, LV, FI, AU, SG, JP, GB, IE, SE, EE, LT.

  • statusoptionalin the query ?… · text

    active keeps active companies only; any (the default) keeps every status.

  • limitoptionalin the query ?… · integer

    Maximum number of results: 20 by default, from 1 to 50.

Example

curl "https://api.jsonpage.com/v2/companies?q=swatch&country=CH&limit=5" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": [
    { "id": "CH-101374515", "name": "The Swatch Group AG", "status": "active", "...": "..." },
    { "id": "CH-...", "...": "..." }
  ],
  "meta": { "sources": [{ "name": "Official company register: Switzerland", "country": "CH", "kind": "register", "data_date": "2026-10-01" }] }
}

Possible errors

  • 400 query_too_short: no word of 2 characters or more in q
  • 400 invalid_parameter: invalid status or limit
  • 404 country_not_supported: country without name search

Errors common to all endpoints (key, IP address, rate): Errors and limits.

GET/v2/companies?registry_id=…Find a company by its number, without knowing the country

Looks for a national registry number in every country served and returns the companies that carry it, usually just one. The list is empty when none matches.

Parameters

  • registry_idrequiredin the query ?… · text

    The number, without the country code, for example 552032534. Spaces are ignored.

Example

curl "https://api.jsonpage.com/v2/companies?registry_id=552032534" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": [
    { "id": "FR-552032534", "country": "FR", "registry_id": "552032534", "name": "DANONE", "status": "active", "...": "..." }
  ],
  "meta": { "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-10-01" }] }
}

Possible errors

  • 400 invalid_parameter: neither q nor registry_id in the request

Errors common to all endpoints (key, IP address, rate): Errors and limits.

POST/v2/companies/batchGet up to 100 companies in one call

Returns several records in a single call, in the order asked. Each item holds data, or error when the company cannot be found. Each company in the batch counts as one request.

Parameters

  • idsrequiredin the JSON body · JSON list of strings

    The global identifiers, from 1 to 100, for example ["FR-552032534", "BE-0417497106"].

  • includeoptionalin the JSON body · JSON list of strings

    Blocks to add to each record, same values as for a single company. None by default.

Example

curl -X POST "https://api.jsonpage.com/v2/companies/batch" \
  -H "X-API-Key: $JSONPAGE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "ids": ["FR-552032534", "BE-0417497106"], "include": ["vat"] }'
{
  "data": [
    { "id": "FR-552032534", "data": { "id": "FR-552032534", "name": "DANONE", "...": "..." } },
    { "id": "BE-0417497106", "data": { "id": "BE-0417497106", "name": "Anheuser-Busch InBev", "...": "..." } }
  ],
  "meta": { "sources": [{ "...": "..." }] }
}

Possible errors

  • 400 invalid_json: unreadable body, larger than 64 KB, or with a field other than ids and include
  • 400 invalid_parameter: ids empty or longer than 100 items
  • 400 unknown_include: unknown block in include
  • 429 rate_limit_exceeded: the batch exceeds the requests you have left for the minute

Errors common to all endpoints (key, IP address, rate): Errors and limits.

Forms

GET/v2/autocomplete?q=…Suggest companies while the user types

Returns a few light suggestions (name, city, postal code) for a form field. A registry number typed in returns its company directly. Call this endpoint from your server, to keep the key secret.

Parameters

  • qrequiredin the query ?… · text

    The text typed: a name, the start of a name, or a number (SIREN, SIRET, Belgian number, Swiss UID, Norwegian organisation number, Finnish Business ID, Latvian number, Australian ABN, Singapore UEN, Japanese corporate number, British company number).

  • countryoptionalin the query ?… · comma-separated list

    Countries to search, for example FR. All by default. Values: FR, BE, CH, NO, LV, FI, AU, SG, JP, GB, IE, SE, EE, LT.

  • statusoptionalin the query ?… · text

    active (the default) suggests active companies only; any suggests every status.

  • limitoptionalin the query ?… · integer

    Maximum number of suggestions: 8 by default, from 1 to 20.

Example

curl "https://api.jsonpage.com/v2/autocomplete?q=carrefour&limit=5" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": [
    { "id": "FR-652014051", "name": "CARREFOUR", "status": "active", "postal_code": "91300", "city": "MASSY", "kind": "company" },
    { "id": "FR-...", "...": "..." }
  ]
}

Possible errors

  • 400 query_too_short: no word of 2 characters or more in q
  • 400 invalid_parameter: invalid status or limit
  • 404 country_not_supported: country without name search

Errors common to all endpoints (key, IP address, rate): Errors and limits.

GET/v2/validateCheck an identifier, a SIRET or a VAT number

Checks the numbers typed in a form: format, existence, active company, and that they point to the same company. Give at least one. The response is 200 even when a value is invalid: valid tells whether every check passed, checks lists each one. Only leaving out every parameter gives 400 invalid_parameter.

Parameters

  • idoptionalin the query ?… · text

    Global identifier, for example FR-652014051.

  • siretoptionalin the query ?… · text

    14-digit SIRET of a French establishment. Spaces, dots and hyphens are ignored.

  • vatoptionalin the query ?… · text

    French, Belgian, Swiss, Norwegian, Finnish or Latvian VAT number, for example FR14652014051. Spaces, dots and hyphens are ignored.

  • eorioptionalin the query ?… · text

    EORI number, for example FR55203253400646: the check passes when the official service does not answer (unverifiable) and fails when the number is invalid. A French EORI is FR followed by the SIRET.

Example

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": "vat_format", "ok": true, "value": "FR14652014051" },
      { "code": "identifiers_match", "ok": true, "value": "FR-652014051" },
      { "code": "company_active", "ok": true, "value": "active" },
      { "...": "..." }
    ],
    "company": { "id": "FR-652014051", "name": "CARREFOUR", "...": "..." }
  }
}

Possible errors

  • 400 invalid_parameter: none of id, siret and vat

Errors common to all endpoints (key, IP address, rate): Errors and limits.

Countries id: France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan, United Kingdom. siret: France. vat: France, Belgium, Switzerland, Norway, Finland, Latvia, Sweden, Estonia, Lithuania. List of checks: Validation.

GET/v2/eori/{number}Check an EORI number

Checks an EORI number, the customs identifier of companies that import or export: its format, then whether the number exists with the official verification services (European Union and United Kingdom). Counts as one request, on every plan. The response is 200 with a status of valid, invalid, unverifiable (the official service is not answering: this is never an invalid number, retry later) or not_applicable (Switzerland and Norway, where the European EORI does not apply). name and address are present only if the company agreed to publish them. Each answer is reused for 24 hours.

Parameters

  • numberrequiredin the path · text

    Two-letter country code followed by up to 15 characters, for example FR55203253400646, DE1234567 or GB123456789000. Spaces, dots and hyphens are ignored.

Example

curl "https://api.jsonpage.com/v2/eori/DE1234567" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": {
    "eori": "DE1234567",
    "country": "DE",
    "status": "valid",
    "valid": true,
    "checked_at": "2026-10-11T12:00:00Z",
    "name": "EXEMPLE GMBH",
    "address": "Hauptstrasse 1, 10115, BERLIN, DE"
  }
}

Possible errors

  • 400 invalid_eori: not a country code followed by up to 15 characters
  • 400 country_not_supported: country without EORI verification
  • 503 eori_unavailable: EORI verification is not enabled on this server

Errors that apply to every endpoint (key, IP address, quota): Errors and limits.

Monitoring

PUT/v2/monitors/{id}Monitor a company

Adds a company to your monitoring list: each change detected then becomes an event. Answers 201 when it is added, 200 when it already was. No request body.

Parameters

  • idrequiredin the path · text

    Global identifier of the company, for example FR-552032534.

Example

curl -X PUT "https://api.jsonpage.com/v2/monitors/FR-552032534" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{ "data": { "company_id": "FR-552032534", "created": true } }

Possible errors

  • 400 invalid_identifier: malformed identifier (expected: country code, hyphen, number)
  • 403 monitor_limit_reached: your plan's limit of monitored companies is reached
  • 404 not_found: no company with this identifier
  • 503 monitoring_unavailable: monitoring temporarily unavailable; retry

Errors common to all endpoints (key, IP address, rate): Errors and limits.

DELETE/v2/monitors/{id}Stop monitoring a company

Removes a company from your monitoring list. Answers 204, with no body. Events already recorded can still be read.

Parameters

  • idrequiredin the path · text

    Global identifier of the company, for example FR-552032534.

Example

curl -X DELETE "https://api.jsonpage.com/v2/monitors/FR-552032534" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
HTTP/2 204

Possible errors

  • 400 invalid_identifier: malformed identifier (expected: country code, hyphen, number)
  • 404 not_monitored: the company is not in your list
  • 503 monitoring_unavailable: monitoring temporarily unavailable; retry

Errors common to all endpoints (key, IP address, rate): Errors and limits.

GET/v2/monitorsList the monitored companies

Returns your monitoring list, sorted by identifier, page by page. meta.count gives the number of monitored companies and meta.limit your plan's limit.

Parameters

  • limitoptionalin the query ?… · integer

    Results per page: 100 by default, from 1 to 1,000.

  • afteroptionalin the query ?… · text

    The next value of the previous page. Absent: first page.

Example

curl "https://api.jsonpage.com/v2/monitors?limit=100" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": [
    { "company_id": "FR-552032534", "created_at": "2026-10-02T09:12:44Z", "checked_at": "2026-10-02T10:00:03Z", "...": "..." }
  ],
  "next": null,
  "meta": { "count": 1, "limit": 1000 }
}

Possible errors

  • 400 invalid_parameter: limit outside 1 to 1,000
  • 503 monitoring_unavailable: monitoring temporarily unavailable; retry

Errors common to all endpoints (key, IP address, rate): Errors and limits.

GET/v2/eventsRead the changes detected

Returns the events of your monitored companies (address or status change, new notice…), oldest first. Keep the identifier of the last event processed and pass it to after on the next call.

Parameters

  • afteroptionalin the query ?… · text

    Returns only the events after this one, for example evt_41. Absent: from the oldest.

  • limitoptionalin the query ?… · integer

    Events per page: 100 by default, from 1 to 1,000.

  • company_idoptionalin the query ?… · text

    Returns only the events of this company, for example FR-552032534.

Example

curl "https://api.jsonpage.com/v2/events?after=evt_41&limit=100" \
  -H "X-API-Key: $JSONPAGE_API_KEY"
{
  "data": [
    {
      "id": "evt_42",
      "type": "company.address_changed",
      "company_id": "FR-552032534",
      "detected_at": "2026-10-03T04:00:00Z",
      "data": { "before": "75 AV DE LA GRANDE ARMEE 75116 PARIS", "after": "..." }
    }
  ],
  "next": "evt_42"
}

Possible errors

  • 400 invalid_parameter: invalid after or limit
  • 400 invalid_identifier: malformed company_id
  • 503 monitoring_unavailable: monitoring temporarily unavailable; retry

Errors common to all endpoints (key, IP address, rate): Errors and limits.

Webhooks, sent by the API to your server, are described in Webhooks.

Service health

GET/health/liveCheck that the service answers

Answers 200 as long as the service runs. No API key: handy for a monitoring probe.

Parameters

No parameters.

Example

curl "https://api.jsonpage.com/health/live"
{ "status": "ok" }
GET/health/readyCheck that the data is ready

Answers 200 with "status": "ready" when the service can serve data, otherwise 503. No API key.

Parameters

No parameters.

Example

curl "https://api.jsonpage.com/health/ready"
{ "status": "ready" }

Possible errors

  • 503: the service is not ready; retry later
GET/health/sourcesSee the state of the data by country

Gives, for each country, the state of the data (ok: up to date, stale: not refreshed, refreshing: refresh in progress), like the Service status page. No API key.

Parameters

No parameters.

Example

curl "https://api.jsonpage.com/health/sources"
{
  "status": "ok",
  "checked_at": "...",
  "sources": [
    { "country": "FR", "status": "ok" },
    { "...": "..." }
  ]
}

Base response

With no options, the response is about 0.5 KB and contains the same fields in every country: identifier, country, number, name, status (active, closed or unknown), legal form, activity with its European NACE code, and incorporation, closing and update dates. An unknown value is null, and a base field is never omitted.

curl "https://api.jsonpage.com/v2/companies/FR-552032534" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "FR-552032534",
    "country": "FR",
    "registry_id": "552032534",
    "name": "DANONE",
    "status": "closed",
    "legal_form": { "code": "5699", "label": "SA à directoire (s.a.i.)", "scheme": "FR-CJ" },
    "activity": { "nace": "70.10", "code": "70.10Z", "label": "Activités des sièges sociaux", "scheme": "FR-NAF-REV2" },
    "incorporated_on": "1955-01-01",
    "closed_on": null,
    "updated_at": "2024-03-22T13:26:06Z"
  },
  "meta": {
    "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-10-01" }]
  }
}

Blocks on request

Add the blocks you need with the include parameter, separated by commas. A block you do not request is neither read nor computed, and each call counts as one request whatever the blocks. An unknown block causes the unknown_include error instead of being ignored.

BlockContentCountries
addressHead office address: line, postal code, city, country and formatted address.France, Belgique, Suisse, Norvège, Finlande, Lettonie, Irlande, Suède, Estonie, Australie, Singapour, Japon, Royaume-Uni
establishmentsThe first 20 establishments and the cursor of the next page.France, Belgium, Norway
localFields specific to the country's register, as published.France, Belgique, Suisse, Norvège, Finlande, Lettonie, Australie, Singapour, Japon, Irlande, Suède, Estonie, Lituanie, Royaume-Uni
vatVAT number and the result of its verification.France, Belgium, Switzerland, Norway, Finland, Latvia, Sweden, Estonia, Lithuania
eoriProbable EORI of the head office (FR + SIRET) and the result of its check, never presented as certain.France
signalsSignals computed from the register; an empty list if none apply.France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan, United Kingdom
legal_eventsThe latest 20 legal notices, newest first.France
officersOfficers and appointed representatives.Not available yet
ownersCurrent persons with significant control (beneficial owners); an empty list if none.United Kingdom
sanctionsScreening against sanctions lists.France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan, United Kingdom

For each requested block, meta.includes reports ok, or not_available_in_country if the block is not available in this country yet; the block is then absent from data. This currently applies to officers in every country, and to establishments, vat and legal_events in the United Kingdom, to legal_events and owners in Belgium, to establishments, legal_events and owners in Switzerland, and to owners in France.

Norway: legal_events and owners are not available. Lithuania: address, establishments, legal_events and owners are not available. Finland, Latvia, Ireland, Sweden, Estonia, Australia, Singapore and Japan: establishments, legal_events and owners are not available.

curl "https://api.jsonpage.com/v2/companies/FR-552032534?include=vat,signals,officers" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "FR-552032534",
    "...": "...",
    "vat": { "number": "FR27552032534", "status": "valid", "checked_at": "2026-10-11T00:14:31Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-10-01" }],
    "includes": { "vat": "ok", "signals": "ok", "officers": "not_available_in_country" }
  }
}

Shortened response: the base fields are left out here.

vat.status is valid (number confirmed), invalid (number refused), pending (the European check has not answered yet: retry in a few seconds) or not_verified (no check was requested or possible).

The fields parameter limits the base response to the chosen fields, for example fields=name,status. The id field and the requested blocks are always kept.

Country specifics

The format is the same in all countries; only the numbering and the available blocks differ. The national activity code stays in activity.code and the register's original status in the local block.

France (FR)Belgium (BE)Switzerland (CH)Norway (NO)Finland (FI)Latvia (LV)Ireland (IE)Sweden (SE)Estonia (EE)Lithuania (LT)Australia (AU)Singapore (SG)Japan (JP)United Kingdom (GB)
CoverageOfficial French company registers and legal notices.Official Belgian company register: about 2 million active enterprises and their establishment units.Swiss commercial register: about 795,000 active legal entities.Norwegian register of legal entities: about 1.2 million active units, about 465,000 of them sole proprietorships, and about 870,000 establishments.Finnish business register: about 463,000 entities (companies, housing corporations, associations, foundations…).Latvian register of enterprises: about 218,000 active entities (companies, associations, foundations, farms, branches…) and about 237,000 struck-off entities.Irish register of companies: about 345,000 active companies (private companies limited by shares, designated activity companies, companies limited by guarantee, public limited companies, foreign companies…) and about 480,000 dissolved or struck-off companies.Swedish company registers: about 1.18 million active organisations (limited companies, partnerships, housing associations, cooperatives, associations, foundations, public bodies…) and about 1.03 million deregistered organisations. Sole traders are not served.Estonian register of enterprises: about 355,000 registered legal entities (private limited companies, apartment associations, associations, limited partnerships, public limited companies, foundations, cooperatives, local authorities…), operating, in liquidation or in bankruptcy. Sole proprietors are not served.Lithuanian register of legal entities: about 233,000 active legal entities (private limited companies, small partnerships, individual enterprises, associations, public institutions, cooperatives, local authorities…) and about 315,000 removed legal entities.Australian business number register: about 6.1 million active ABNs (companies, trusts, partnerships, superannuation funds, sole traders under their trading name…) and about 6.7 million cancelled ABNs.Singapore register of companies and businesses: about 635,000 active entities (local companies, sole proprietorships, partnerships, branches of foreign companies) and about 1.5 million struck-off, dissolved or ceased entities.Japanese register of corporate numbers: about 5.1 million active corporations and organisations (stock companies, limited companies, local governments, associations, foreign companies…) and about 780,000 closed ones. Sole proprietors have no number and are not included.United Kingdom companies register: about 5.7 million live companies, and their beneficial owners (persons with significant control).
NumberSIREN, 9 digits: FR-552032534.Enterprise number, 10 digits starting with 0 or 1, the last two being a modulo-97 check: BE-0417497106. The forms 0417.497.106, BE0417497106 and the old 9-digit number (BE-417497106) are accepted.UID, 9 digits after CHE, the last being a modulo-11 check digit: CH-105909036 for CHE-105.909.036. The forms CHE-105.909.036, CHE105909036 and CHE-105.909.036 MWST (or VAT, IVA) are accepted.Organisation number, 9 digits, the last one being a modulo-11 check digit: NO-923609016. The forms 923 609 016, NO923609016 and NO923609016MVA are accepted after the NO- prefix, or on their own for VAT.Business ID (Y-tunnus), 7 digits, a hyphen and a modulo-11 check digit: FI-01120389 for 0112038-9. The forms 0112038-9, 01120389, FI01120389 and 112038-9 are accepted.Registration number, 11 digits, with no published check digit: LV-40003245752. LV40003245752 is accepted.ABN, 11 digits whose first two make a modulo-89 check: AU-51824753556. The forms 51 824 753 556, ABN 51824753556 and AU51824753556 are accepted.UEN: 8 digits and a letter (businesses), 9 digits and a letter (local companies) or T, S or R, 2 digits, 2 letters, 4 digits and a letter (other entities), the last letter being a check letter: SG-196800306E. Lower case, spaces and the UEN prefix are accepted.Corporate number, 13 digits whose first is a check digit: JP-1180301018771. Full-width digits and spaces are accepted.Company number, 1 to 7 digits, with no published check digit: IE-104547. Leading zeros are ignored and IE104547 is accepted.Organisation number, 10 digits whose last one is a Luhn check: SE-5560427220. The forms 556042-7220, SE5560427220 and the VAT number SE556042722001 are accepted.Registry code, 8 digits whose last one is a check digit: EE-10137025. The forms 10137025, EE10137025 and the VAT number EE100210460 are accepted.Legal entity code, 9 digits whose last one is a check digit: LT-110053842. The forms 110053842 and LT110053842 (the VAT number) are accepted.Company number, 8 characters, sometimes with a prefix (SC, NI, OC…). Missing leading zeros are restored: GB-6 becomes GB-00000006.
statusA → active, C → closed.closed for a final juridical situation (bankruptcy closed, liquidation closed…); an enterprise in bankruptcy or liquidation stays active. The source lists active entities only: an enterprise that has ceased is no longer found.closed for an entity removed from the register; closed_on stays null, as the source gives no deletion date. A company in liquidation stays active.closed for a unit that has left the register; closed_on stays null, the date not being given. A unit in bankruptcy or liquidation stays active.closed for an entity whose end date has passed or that has left the data (closed_on is then null when the date is missing). An entity in bankruptcy or liquidation stays active.closed for a struck-off entity; closed_on is the date it was struck off. An entity in liquidation stays active.closed for a company that is dissolved, struck off, ceased or deleted from the register; closed_on is the dissolution date. A company in liquidation, in administration or proposed for strike-off stays active.closed for a deregistered organisation; closed_on is the deregistration date. An organisation in liquidation, bankruptcy or reorganisation stays active.closed for an entity that has left the data; closed_on is then null, as the date is not given. An entity in liquidation or in bankruptcy stays active (original status in local.status).closed for a removed legal entity; closed_on is the removal date. A legal entity in liquidation or in bankruptcy stays active (original status in local.legal_status).closed for a cancelled ABN; closed_on is the cancellation date.closed for any status other than “Live” (struck off, dissolved, ceased, converted…); closed_on stays null, as the date is not given. An entity “Gazetted To Be Struck Off” or in liquidation stays active.closed when a closure date is given (closed_on, reason in local.closure). incorporated_on is null: the date the number was assigned is in local.number_assigned_on.closed when the company is dissolved; a company in liquidation or administration stays active.
legal_formLegal category (FR-CJ).Belgian legal form (BE-JURIDICAL-FORM), label in French.eCH-0097 legal form (CH-LEGAL-FORM), label in French.Organisation form (NO-ORG-FORM), label in French for the main ones, otherwise in Norwegian.Company form (FI-COMPANY-FORM), label in French for the main ones, otherwise in English.Legal form of the register (LV-LEGAL-FORM), label in French for the main ones, otherwise in Latvian.Company type of the register (IE-COMPANY-TYPE), label in French for the main ones, otherwise in English.Organisation form of the register (SE-ORG-FORM), label in French; for organisations only the statistics register knows, a 2-digit legal form (SE-LEGAL-FORM).Legal form of the register (EE-LEGAL-FORM), label in French for the main ones, otherwise in Estonian.Legal form of the register (LT-LEGAL-FORM), 3-digit code, label in French for the main ones, otherwise in English; Lithuanian label in local.Entity type (AU-ENTITY-TYPE), label in French for the main ones, otherwise in English.Company or business form (SG-LEGAL-FORM: EPC, PC, PCS, SOLE, PART…), label in French; the entity type is in local.entity_type.Type of corporation (JP-LEGAL-FORM: 301 stock company, 302, 305…), label in French; the Japanese label is in local.legal_form_label_ja.British company category (GB-COMPANY-CATEGORY).
activityNAF rev. 2; NACE = first 4 digits.Main activity in the newest NACE-BEL version (BE-NACEBEL-2025); NACE rev. 2 = class of the NACE-BEL 2008 code.null: the source publishes no activity code (NOGA).5-digit SN2025 code (NO-SN2025), label in Norwegian; nace is null (nomenclature aligned on NACE rev. 2.1).5-digit TOL 2025 code (FI-TOL2025), label in English; nace is null (nomenclature aligned on NACE rev. 2.1); the few TOL 2008 codes (FI-TOL2008) give the NACE rev. 2 class.null: the register does not publish an activity code.NACE rev. 2 class of the register (IE-NACE-REV2), when it is given; label in French for most classes.5-digit SNI 2025 code (SE-SNI2025), with no label; nace is null (classification aligned with NACE rev. 2.1). The other codes are in local.Declared main activity, 5-digit EMTAK code (EE-EMTAK2025 or EE-EMTAK2008), label in Estonian; the NACE rev. 2 class is given for EMTAK 2008, nace is null for EMTAK 2025 (aligned with NACE rev. 2.1).null: the register does not publish an activity code.null: the register publishes no activity code.Primary SSIC code (SG-SSIC); nace is null.null: the register publishes no activity code.First SIC 2007 code; NACE rev. 2 when the 4-digit class exists, otherwise null.
updated_atDate of the record's latest update.null; the date of the data is in meta.sources.null; the date of the data is in meta.sources. incorporated_on is null too: the source gives no registration date.null; the date of the data is in meta.sources. incorporated_on is the founding date, or else the date of entry in the register.null; the date of the data is in meta.sources. incorporated_on is the registration date.null; the data date is in meta.sources. incorporated_on is the registration date.null; the data date is in meta.sources. incorporated_on is the date of first registration.null; the data date is in meta.sources. incorporated_on is the registration date.null; the data date is in meta.sources. incorporated_on is the registration date.null; the date of the data is in meta.sources. incorporated_on is the registration date.updated_at is the date the entry was last updated. incorporated_on is the day the ABN became active (unknown for a cancelled ABN).null; incorporated_on is the registration date.updated_at is the date the record was updated.null; the date of the data is in meta.sources.
Available blocksaddress, establishments, local, vat, signals, legal_events, sanctions.address (head office), establishments (establishment units), local (juridical situation, names, activities), vat, signals, sanctions.address (registered office), local (UID, register numbers, purpose, municipality, canton, translated names, other registered offices), vat, signals, sanctions.address (business address), establishments (sub-units), local (form, sector, employees, capital, dates), vat (status in the VAT register), signals, sanctions.address, local (parallel and auxiliary names, trade register, VAT, situation), vat, signals, sanctions.address, local (register, reason for strike-off), vat, signals, sanctions.address, local (original type and status, county, Eircode, dates of the annual return and of the accounts), signals, sanctions.address (postal address), local (formatted number, ongoing proceeding, deregistration reason, other activity codes, other names), vat, signals, sanctions.address, local (original status, form label, subtype, municipalities), vat (when the register gives a VAT number), signals, sanctions.local (code, Lithuanian label of the form, legal status and its date), vat, signals, sanctions.address (state and postcode only), local (ACN, state, trading names, GST status), signals, sanctions.address (full address with block, street, level, unit and postal code), local (entity type, register status, due dates of accounts and annual return, secondary activity, former names), signals, sanctions.address (in Japanese: prefecture, municipality, street, postal code), local (name reading in katakana, English name and address when they exist, prefecture and municipality codes, closure reason, successor number), signals, sanctions.address (registered office), local (status, category, SIC codes, accounts and confirmation statement due dates, previous names), signals, owners (persons with significant control), sanctions.
Not availableowners (the register of beneficial owners is no longer public since 31 July 2024).legal_events, owners (the source does not publish them).establishments, legal_events, owners (the source does not publish them).legal_events, owners (not published).establishments, legal_events, owners (not published).address, establishments, legal_events, owners (not published).establishments, legal_events, owners (not published).establishments, legal_events, owners (not published).vat (the Irish VAT number cannot be derived from the company number), establishments, legal_events, owners (not published).establishments, legal_events, owners (not published).establishments, legal_events, owners (not published); vat (VAT is not verified for Australia: the GST status is in local).establishments, legal_events, owners (not published); vat (VAT is not verified for Singapore).establishments, legal_events, owners (not published); vat (VAT is not verified for Japan).establishments (the United Kingdom register has none), vat (EU VAT verification no longer covers the United Kingdom since Brexit), legal_events.

United Kingdom example: a block that is not available in the country is reported in meta.includes, without an error.

curl "https://api.jsonpage.com/v2/companies/GB-00445790?include=address,signals,vat" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "GB-00445790",
    "country": "GB",
    "registry_id": "00445790",
    "name": "TESCO PLC",
    "status": "active",
    "...": "...",
    "address": { "...": "..." },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: United Kingdom", "country": "GB", "kind": "register", "data_date": "2026-10-01" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "not_available_in_country" }
  }
}

Shortened, illustrative response. The /v2/companies/GB-00445790/establishments endpoint returns 404 not_available_in_country.

Belgium

Belgian enterprises come from the official Belgian company register. The global identifier is BE- followed by the 10-digit enterprise number, for example BE-0417497106. The API also accepts BE-0417.497.106, BE-BE0417497106 and the old 9-digit number (BE-417497106), and always returns the 10-digit form in data.id. The last two digits are a check: 97 minus the remainder of the first eight divided by 97. A number with a wrong check returns the 400 invalid_identifier error.

curl "https://api.jsonpage.com/v2/companies/BE-0417497106?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "BE-0417497106",
    "country": "BE",
    "registry_id": "0417497106",
    "name": "Anheuser-Busch InBev",
    "status": "active",
    "legal_form": { "code": "014", "label": "Société anonyme", "scheme": "BE-JURIDICAL-FORM" },
    "activity": { "nace": "70.10", "code": "70100", "label": "Activités des sièges sociaux", "scheme": "BE-NACEBEL-2025" },
    "incorporated_on": "1977-08-02",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "Grand-Place 1", "postal_code": "1000", "city": "Bruxelles", "country": "BE", "formatted": "Grand-Place 1, 1000 Bruxelles" },
    "vat": { "number": "BE0417497106", "status": "valid", "checked_at": "2026-10-11T00:14:31Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Belgium", "country": "BE", "kind": "register", "data_date": "2026-10-02" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Belgian VAT number is BE followed by the enterprise number; it is checked as in France (pending on the first call, then valid or invalid). The labels of the legal form, the activity and the juridical situation are in French; the address is in French when the source gives it, otherwise in Dutch.

The local block holds the Belgian register record as is:

"local": {
  "enterprise_number": "0417.497.106",
  "status": "AC",
  "juridical_situation": { "code": "000", "label": "Situation normale", "scheme": "BE-JURIDICAL-SITUATION" },
  "type_of_enterprise": "2",
  "juridical_form": { "code": "014", "label": "Société anonyme", "scheme": "BE-JURIDICAL-FORM" },
  "start_date": "1977-08-02",
  "names": [
    { "language": "fr", "type": "legal", "value": "Anheuser-Busch InBev" },
    { "language": "fr", "type": "abbreviation", "value": "AB Inbev" },
    { "language": "nl", "type": "legal", "value": "Anheuser-Busch InBev" },
    "..."
  ],
  "activities": [
    { "code": "70100", "nace_version": "2025", "group": "006", "classification": "MAIN", "label": "Activités des sièges sociaux" },
    { "code": "70100", "nace_version": "2008", "group": "001", "classification": "MAIN", "label": "Activités des sièges sociaux" },
    "..."
  ]
}
FieldContent
enterprise_numberEnterprise number in its official form, 0417.497.106.
statusOriginal register status (AC: active).
juridical_situationJuridical situation: code, label and scheme BE-JURIDICAL-SITUATION, for example 000 “Situation normale”. It yields the insolvency_proceedings and liquidation signals.
type_of_enterprise1 natural person, 2 legal person.
juridical_form, start_dateLegal form (same as legal_form) and start date of the enterprise.
namesEvery registered name: language (fr, nl, de, en, or empty when the language is unknown), type (legal, abbreviation or commercial) and value. The base name field is the legal name, in French when it exists.
activitiesEvery registered activity: code, nace_version (2003, 2008 or 2025), group (register activity group, 001 for VAT), classification (MAIN main, SECO secondary, ANCI ancillary) and label.

The base activity field is the main activity in the newest NACE-BEL version, the VAT group first; activity.nace is the NACE rev. 2 class taken from the NACE-BEL 2008 code.

Establishments are the establishment units recorded in the Belgian register: /v2/companies/BE-0417497106/establishments lists them page by page. registry_id is their 10-digit number, which starts with 2; name is their commercial name, otherwise the legal name; activity is their main activity and opened_on their start date. head_office is always false: the register does not designate a head office among the units, and the head office address is in the address block.

{
  "registry_id": "2102217256",
  "name": "Anheuser-Busch InBev",
  "head_office": false,
  "status": "active",
  "activity": { "nace": "70.10", "code": "70100", "label": "Activités des sièges sociaux", "scheme": "BE-NACEBEL-2025" },
  "opened_on": "1976-10-01",
  "address": { "line": "Avenue Joseph-Prévers 26", "postal_code": "4020", "city": "Liège", "country": "BE", "formatted": "Avenue Joseph-Prévers 26, 4020 Liège" }
}

Signals in Belgium: insolvency_proceedings for an opened bankruptcy, a judicial composition, a moratorium or a judicial reorganisation, and liquidation for a dissolution or liquidation in progress; their detail is the label of the juridical situation. recently_created and closed follow the same rules as in the other countries. Only active entities are in the source: an enterprise that has ceased is no longer found (404 not_found), and monitoring reports it with the company.removed_from_register event.

Name search: every name recorded in the Belgian register is searchable, legal name, abbreviation or commercial name, in every language. For example, GET /v2/companies?q=ab+inbev&country=BE finds Anheuser-Busch InBev first. Validation accepts Belgian VAT numbers: GET /v2/validate?vat=BE0417497106.

Switzerland

Swiss companies come from the Swiss commercial register: about 795,000 active legal entities of every form (companies limited by shares, limited liability companies, sole proprietorships, cooperatives, associations, foundations, branches…). The global identifier is CH- followed by the 9 digits of the UID, without the CHE prefix: CH-105909036 for CHE-105.909.036. The API also accepts CH-105.909.036, CH-CHE-105.909.036 and CH-CHE-105.909.036 MWST, and always returns the 9-digit form in data.id; search by number, autocomplete, validation and enrichment accept the UID as is (CHE-105.909.036, CHE105909036, CHE-105.909.036 MWST, or with VAT or IVA). The last digit is a modulo-11 check digit (eCH-0097 standard): a number with a wrong check digit returns the 400 invalid_identifier error.

curl "https://api.jsonpage.com/v2/companies/CH-101374515?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "CH-101374515",
    "country": "CH",
    "registry_id": "101374515",
    "name": "The Swatch Group AG",
    "status": "active",
    "legal_form": { "code": "0106", "label": "Société anonyme", "scheme": "CH-LEGAL-FORM" },
    "activity": null,
    "incorporated_on": null,
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "c/o Caisse de pensions Swatch Group, faubourg de l'Hôpital 3", "postal_code": "2000", "city": "Neuchâtel", "country": "CH", "formatted": "c/o Caisse de pensions Swatch Group, faubourg de l'Hôpital 3, 2000 Neuchâtel" },
    "vat": { "number": "CHE-116.294.121 MWST", "status": "valid", "checked_at": "2026-10-03T22:39:43Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Switzerland", "country": "CH", "kind": "register", "data_date": "2026-10-03" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Swiss VAT number is the UID followed by MWST (VAT in French, IVA in Italian); it is verified too. For a member of a VAT group, as here, the number returned is the group's, which the company invoices with. The legal form label is in French; the name and address are those of the register, in the language of the registration.

The local block holds the commercial register record. Nestlé is a single legal entity with two registered offices, in Cham and in Vevey:

curl "https://api.jsonpage.com/v2/companies/CH-105909036?include=local" \
  -H "X-API-Key: VOTRE_CLE"
"local": {
  "uid": "CHE-105.909.036",
  "ehra_id": 126286,
  "chid": "CH17030010013",
  "legal_form": { "code": "0106", "label_fr": "Société anonyme", "label_de": "Aktiengesellschaft", "label_en": "Company limited by shares" },
  "purpose": "Beteiligung an Industrie-, Dienstleistungs-, Handels- und Finanzunternehmungen, …",
  "municipality": { "bfs_number": "1702", "name": "Cham" },
  "canton": "ZG",
  "names": [
    { "language": "", "value": "Nestlé AG" },
    { "language": "en", "value": "Nestlé Ltd." },
    { "language": "fr", "value": "Nestlé S.A." }
  ],
  "other_registrations": [
    {
      "ehra_id": 126288,
      "chid": "CH55000672935",
      "name": "Nestlé S.A.",
      "status": "active",
      "municipality": { "bfs_number": "5890", "name": "Vevey" },
      "canton": "VD",
      "address": { "line": "Avenue Nestlé 55", "postal_code": "1800", "city": "Vevey", "country": "CH", "formatted": "Avenue Nestlé 55, 1800 Vevey" }
    }
  ],
  "last_listed_on": null
}
FieldContent
uidUID in its official form, CHE-105.909.036.
ehra_id, chidNumber of the entity in the federal register, an integer, and cantonal register number, for example CH17030010013.
legal_formeCH-0097 legal form: code and labels label_fr, label_de and label_en.
purposePurpose of the company as registered, in the language of the register.
municipality, cantonMunicipality of the registered office (bfs_number, the official municipality number, and name) and two-letter canton, for example ZG.
namesRegistered name (empty language) and its registered translations (language de, fr, it, en or rm), with value. The base name field is the registered name.
other_registrationsFurther registered offices of the same legal entity: ehra_id, chid, name, status, municipality, canton and address; [] when there are none.
last_listed_onRemoved entities only: the last day the register listed the entity; null otherwise.

Signals in Switzerland: liquidation when the registered name carries the legal mention “in Liquidation” (“en liquidation”, “in liquidazione”); its detail says so. closed means an entity removed from the register. recently_created does not apply, as the source has no registration date. The Swiss register has no establishments: /v2/companies/CH-101374515/establishments returns 404 not_available_in_country, and the establishments, legal_events and owners blocks are reported as not_available_in_country in meta.includes.

Name search: the registered name and its translations (German, French, Italian, English) are searchable. For example, GET /v2/companies?q=swatch&country=CH finds Swatch AG and The Swatch Group AG. In autocomplete, a UID typed (CHE-101.374.515) returns the company directly; sole proprietorships (form 0101) have the kind person. Validation accepts Swiss VAT numbers: GET /v2/validate?vat=CHE-105.909.036+MWST.

Norway

Norwegian units come from the Norwegian register of legal entities: about 1.2 million active units of every form (companies limited by shares, associations, condominiums, sole proprietorships…) and their establishments. The global identifier is NO- followed by the 9 digits of the organisation number: NO-923609016. The last digit is a modulo-11 check digit: a number with a wrong check digit returns the 400 invalid_identifier error. Sole proprietorships are served under their business name; no officers and no contact details are provided. A bare 9-digit organisation number reads as a SIREN in an enrichment file: write it NO-923609016 or with its VAT number.

curl "https://api.jsonpage.com/v2/companies/NO-923609016?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "NO-923609016",
    "country": "NO",
    "registry_id": "923609016",
    "name": "EQUINOR ASA",
    "status": "active",
    "legal_form": { "code": "ASA", "label": "Société anonyme publique", "scheme": "NO-ORG-FORM" },
    "activity": { "nace": null, "code": "06.100", "label": "Utvinning av råolje", "scheme": "NO-SN2025" },
    "incorporated_on": "1972-09-18",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "Forusbeen 50", "postal_code": "4035", "city": "STAVANGER", "country": "NO", "formatted": "Forusbeen 50, 4035 STAVANGER" },
    "vat": { "number": "NO923609016MVA", "status": "valid", "checked_at": "2026-10-10T00:00:00Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Norway", "country": "NO", "kind": "register", "data_date": "2026-10-10" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Norwegian VAT number is NO, the organisation number and MVA (NO923609016MVA); it is read in the official VAT register, without waiting: valid if the unit is registered there, invalid otherwise. Establishments are the register's sub-units: /v2/companies/NO-923609016/establishments or include=establishments. The local block holds the register record:

curl "https://api.jsonpage.com/v2/companies/NO-923609016?include=local" \
  -H "X-API-Key: VOTRE_CLE"
"local": {
  "organisation_number": "923 609 016",
  "legal_form": { "code": "ASA", "label": "Société anonyme publique", "scheme": "NO-ORG-FORM" },
  "legal_form_label_no": "Allmennaksjeselskap",
  "registered_on": "1995-03-12",
  "founded_on": "1972-09-18",
  "in_business_enterprise_register": true,
  "vat_registered": true,
  "vat_registered_on": "1989-07-01",
  "institutional_sector": { "code": "1120", "label": "Statlig eide aksjeselskaper mv.", "scheme": "NO-SECTOR" },
  "employees": 21272,
  "capital": { "amount": 5976872600, "currency": "NOK", "type": "Aksjekapital" },
  "municipality": "STAVANGER",
  "last_listed_on": null
}

Signals in Norway: insolvency_proceedings for a bankruptcy or a restructuring procedure (since gives the opening date), liquidation for a dissolution or liquidation in progress, compulsory ones included, and closed for a unit that has left the register. Name search: GET /v2/companies?q=equinor&country=NO; sole proprietorships have the kind person in autocomplete.

Finland

Finnish entities come from the Finnish business register: about 463,000 entities (companies, housing corporations, associations, foundations…). The global identifier is FI- followed by the 8 characters of the Business ID (Y-tunnus), without the hyphen: FI-01120389 for 0112038-9. The API also accepts FI-0112038-9 and the number written without its leading zeros, and always returns the 8-character form in data.id; search by number, autocomplete, validation and enrichment accept the Business ID as is (0112038-9). The last digit is a modulo-11 check digit: a number with a wrong check digit returns the 400 invalid_identifier error. No data about persons is provided.

curl "https://api.jsonpage.com/v2/companies/FI-0112038-9?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "FI-01120389",
    "country": "FI",
    "registry_id": "01120389",
    "name": "Nokia Oyj",
    "status": "active",
    "legal_form": { "code": "17", "label": "Société anonyme publique (Oyj)", "scheme": "FI-COMPANY-FORM" },
    "activity": { "nace": null, "code": "70100", "label": "Activities of head offices", "scheme": "FI-TOL2025" },
    "incorporated_on": "1896-12-19",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "Karakaari 7", "postal_code": "02610", "city": "ESPOO", "country": "FI", "formatted": "Karakaari 7, 02610 ESPOO" },
    "vat": { "number": "FI01120389", "status": "valid", "checked_at": "2026-10-10T20:59:03Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Finland", "country": "FI", "kind": "register", "data_date": "2026-10-10" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Finnish VAT number is FI followed by the 8 digits of the Business ID; it is verified the same way as in France and Belgium, with the same statuses. Signals in Finland: insolvency_proceedings for a bankruptcy or a company restructuring, liquidation for a liquidation in progress (since gives the date of the situation), and closed for an entity whose end date has passed or that has left the data. The local block gives the form and its label, the trade register status, the VAT registration and its date, the situation, the municipality code and the parallel and auxiliary names (other_names). Establishments, legal notices and beneficial owners are not available.

Latvia

Latvian entities come from the Latvian register of enterprises: about 218,000 active entities of every form (limited liability companies, joint-stock companies, individual merchants, associations, foundations, farms, branches…) and about 237,000 struck-off entities, with the date they were struck off in closed_on. The global identifier is LV- followed by the 11 digits of the registration number: LV-40003245752. This number has no published check digit: only its format is verified, and a well-formed but unknown number returns 404 not_found. The address is the register's, the city is derived from it. The register publishes neither an activity code nor establishments: activity is null.

curl "https://api.jsonpage.com/v2/companies/LV-40003245752?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "LV-40003245752",
    "country": "LV",
    "registry_id": "40003245752",
    "name": "Air Baltic Corporation AS",
    "status": "active",
    "legal_form": { "code": "AS", "label": "Société anonyme", "scheme": "LV-LEGAL-FORM" },
    "activity": null,
    "incorporated_on": "1995-02-08",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "Mārupes nov., Mārupes pag., Lidosta \"Rīga\", Tehnikas iela 3", "postal_code": "LV-1053", "city": "Mārupes", "country": "LV", "formatted": "Mārupes nov., Mārupes pag., Lidosta \"Rīga\", Tehnikas iela 3, LV-1053" },
    "vat": { "number": "LV40003245752", "status": "valid", "checked_at": "2026-10-10T20:59:02Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Latvia", "country": "LV", "kind": "register", "data_date": "2026-10-10" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Latvian VAT number is LV followed by the registration number; it is verified the same way as in France and Belgium, with the same statuses. Signals in Latvia: closed with the strike-off date in since, and liquidation when the registered name carries the liquidation mention (“Likvidējamā”). The local block gives the register of entry (register) and, for a struck-off entity, the reason (termination: liquidated or reorganised).

Ireland

Irish companies come from the Irish register of companies: about 345,000 active companies of every form (private companies limited by shares, designated activity companies, companies limited by guarantee, public limited companies, foreign companies registered in Ireland…) and about 480,000 dissolved or struck-off companies, with their dissolution date in closed_on. The global identifier is IE- followed by the company number, 1 to 7 digits, without leading zeros: IE-104547. This number has no published check digit: only its format is verified, and a well-formed but unknown number returns 404 not_found. The activity is the NACE rev. 2 class of the register, when it is given. The register publishes no establishments.

curl "https://api.jsonpage.com/v2/companies/IE-231235?include=address,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "IE-231235",
    "country": "IE",
    "registry_id": "231235",
    "name": "BROWN BROTHERS HARRIMAN TRUSTEE SERVICES (IRELAND) LIMITED",
    "status": "active",
    "legal_form": { "code": "1153", "label": "Société privée par actions (LTD)", "scheme": "IE-COMPANY-TYPE" },
    "activity": { "nace": "64.99", "code": "64.99", "label": "Autres activités des services financiers, hors assurance et caisses de retraite, n.c.a.", "scheme": "IE-NACE-REV2" },
    "incorporated_on": "1995-03-29",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "30 HERBERT STREET, DUBLIN 2", "postal_code": "D02 W329", "city": "DUBLIN 2", "country": "IE", "formatted": "30 HERBERT STREET, DUBLIN 2, D02 W329" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Ireland", "country": "IE", "kind": "register", "data_date": "2026-10-11" }],
    "includes": { "address": "ok", "signals": "ok" }
  }
}

The Irish VAT number cannot be derived from the company number: the vat block is not available in Ireland and is reported as not_available_in_country. Signals in Ireland: closed with the dissolution date in since, liquidation for a company in liquidation, insolvency_proceedings for an examinership or an administration, strike_off_proposed when strike-off is proposed, and confirmation_statement_overdue when the annual return is late. The local block gives the company type and the original status with their code, the county, the Eircode and the dates of the last annual return, the next due date and the last accounts.

Sweden

Swedish organisations come from the official Swedish company registers: about 1.18 million active organisations of every form (limited companies, general and limited partnerships, housing associations, cooperatives, associations, foundations, public bodies, foreign entities…) and about 1.03 million deregistered organisations, with their deregistration date in closed_on. The global identifier is SE- followed by the 10 digits of the organisation number: SE-5560427220. The last digit is a Luhn check, which is verified; a well-formed but unknown number returns 404 not_found. Sole traders and estates, identified by a personal number, are not served, and the c/o part of the address is not kept. The activity is the first SNI 2025 code, with no label; the other codes are in local.other_activities.

curl "https://api.jsonpage.com/v2/companies/SE-5560427220?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "SE-5560427220",
    "country": "SE",
    "registry_id": "5560427220",
    "name": "H & M Hennes & Mauritz AB",
    "status": "active",
    "legal_form": { "code": "AB", "label": "Société anonyme (aktiebolag)", "scheme": "SE-ORG-FORM" },
    "activity": { "nace": null, "code": "70100", "label": null, "scheme": "SE-SNI2025" },
    "incorporated_on": "1943-08-07",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "Mäster Samuelsgatan 46 A", "postal_code": "106 38", "city": "STOCKHOLM", "country": "SE", "formatted": "Mäster Samuelsgatan 46 A, 106 38 STOCKHOLM" },
    "vat": { "number": "SE556042722001", "status": "valid", "checked_at": "2026-10-11T08:12:40Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Sweden", "country": "SE", "kind": "register", "data_date": "2026-10-11" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Swedish VAT number is SE, the organisation number and 01; it is verified the same way as in France and Belgium, with the same statuses. Signals in Sweden: closed with the deregistration date in since, liquidation for a liquidation in progress, and insolvency_proceedings for a bankruptcy, a company reorganisation, a composition negotiation or a resolution (since gives the date of the situation). The local block gives the formatted organisation number (556042-7220), the ongoing proceeding, the deregistration reason, business_active (registered for VAT, F-tax or as an employer), the other activity codes, the other names (special business names, names in other languages) and marketing_restriction when the organisation has opted out of advertising.

Estonia

Estonian entities come from the Estonian register of enterprises: about 355,000 registered legal entities of every form (private limited companies, public limited companies, limited and general partnerships, associations, apartment associations, foundations, cooperatives, branches, local authorities…), operating, in liquidation or in bankruptcy. The global identifier is EE- followed by the 8 digits of the registry code: EE-10137025. The last digit is a check digit, which is verified; a well-formed but unknown code returns 404 not_found. The VAT number (EE100210460) is also accepted in place of the code. Sole proprietors, whose name is a person's name, are not served. An entity that leaves the register is kept as closed, with no end date. The activity is the declared main activity (EMTAK code, label in Estonian).

curl "https://api.jsonpage.com/v2/companies/EE-10137025?include=address,vat,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "EE-10137025",
    "country": "EE",
    "registry_id": "10137025",
    "name": "Tieto Estonia AS",
    "status": "active",
    "legal_form": { "code": "AS", "label": "Société anonyme (aktsiaselts)", "scheme": "EE-LEGAL-FORM" },
    "activity": { "nace": null, "code": "62101", "label": "Programmeerimine", "scheme": "EE-EMTAK2025" },
    "incorporated_on": "1996-12-27",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "A. H. Tammsaare tee 47", "postal_code": "11316", "city": "Tallinn", "country": "EE", "formatted": "A. H. Tammsaare tee 47, Kristiine linnaosa, Tallinn, Harju maakond, 11316" },
    "vat": { "number": "EE100210460", "status": "valid", "checked_at": "2026-10-11T08:12:40Z", "source": "EU VAT check" },
    "signals": []
  },
  "meta": {
    "sources": [{ "name": "Official company register: Estonia", "country": "EE", "kind": "register", "data_date": "2026-10-11" }],
    "includes": { "address": "ok", "signals": "ok", "vat": "ok" }
  }
}

The Estonian VAT number (EE followed by 9 digits) is read in the register: it cannot be derived from the code. It is verified the same way as in France and Belgium, with the same statuses; the vat block is absent when the entity has no VAT number. Signals in Estonia: liquidation for an entity in liquidation, insolvency_proceedings for an entity in bankruptcy, and closed for an entity that has left the data. The local block gives the original status, the Estonian label of the form and its subtype, and the hierarchy of municipalities of the address.

Lithuania

Lithuanian legal entities come from the Lithuanian register of legal entities: about 233,000 active legal entities of every form (private limited companies, public limited companies, small partnerships, individual enterprises, associations, public institutions, foundations, cooperatives, branches, local authorities…) and about 315,000 removed legal entities, with their removal date in closed_on. The global identifier is LT- followed by the 9 digits of the legal entity code: LT-110053842. The last digit is a check digit, which is verified; a well-formed but unknown code returns 404 not_found. The register publishes neither an address, nor an activity code, nor establishments: address is reported as not_available_in_country and activity is null. The name of an individual enterprise is anonymised by the register itself.

curl "https://api.jsonpage.com/v2/companies/LT-110053842?include=vat,signals,local" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "LT-110053842",
    "country": "LT",
    "registry_id": "110053842",
    "name": "Akcinė bendrovė \"Lietuvos geležinkeliai\"",
    "status": "active",
    "legal_form": { "code": "320", "label": "Société anonyme (AB)", "scheme": "LT-LEGAL-FORM" },
    "activity": null,
    "incorporated_on": "1991-12-24",
    "closed_on": null,
    "updated_at": null,
    "vat": { "number": "LT110053842", "status": "valid", "checked_at": "2026-10-11T08:12:40Z", "source": "EU VAT check" },
    "signals": [],
    "local": { "legal_entity_code": "110053842", "legal_form_label_lt": "Akcinė bendrovė", "legal_status": { "code": "0", "label": "No legal proceedings", "scheme": "LT-LEGAL-STATUS" }, "legal_status_label_lt": "Teisinis statusas neįregistruotas", "legal_status_since": "2021-12-16" }
  },
  "meta": {
    "sources": [{ "name": "Official company register: Lithuania", "country": "LT", "kind": "register", "data_date": "2026-10-12" }],
    "includes": { "vat": "ok", "signals": "ok", "local": "ok" }
  }
}

The Lithuanian VAT number is LT followed by the legal entity code; it is verified the same way as in France and Belgium, with the same statuses. Signals in Lithuania: closed with the removal date in since, liquidation for a liquidation in progress, and insolvency_proceedings for a bankruptcy or a restructuring (since gives the date of the status). The local block gives the legal entity code, the Lithuanian label of the form, and the original legal status with its code and date.

Australia

Australian entities come from the Australian register of business numbers: about 6.1 million active ABNs (companies, trusts, partnerships, superannuation funds, sole traders…) and about 6.7 million cancelled ABNs, with the cancellation date in closed_on. The name of a person is never kept: a sole trader is served under its trading name, and a sole trader without a trading name is not served. The global identifier is AU- followed by the 11 digits of the ABN: AU-51824753556. The check digits (modulo 89) are verified, and a well-formed but unknown number returns 404 not_found. The register publishes neither a street nor an activity code: the address is limited to the state and the postcode (formatted is “VIC 3000”), and activity is null. The ACN of companies is in the local block.

curl "https://api.jsonpage.com/v2/companies/AU-33051775556?include=address,local,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "AU-33051775556",
    "country": "AU",
    "registry_id": "33051775556",
    "name": "TELSTRA CORPORATION LIMITED",
    "status": "active",
    "legal_form": { "code": "PUB", "label": "Société cotée australienne", "scheme": "AU-ENTITY-TYPE" },
    "activity": null,
    "incorporated_on": "1999-11-01",
    "closed_on": null,
    "updated_at": "2024-02-15",
    "address": { "line": null, "postal_code": "3000", "city": null, "country": "AU", "formatted": "VIC 3000" },
    "signals": [],
    "local": {
      "abn": "33 051 775 556",
      "acn": "051 775 556",
      "state": "VIC",
      "entity_type_label": "Australian Public Company",
      "gst": { "registered": true, "status": "ACT", "since": "2000-07-01" },
      "other_names": [{ "type": "trading", "value": "TELSTRA" }]
    }
  },
  "meta": {
    "sources": [{ "name": "Official business register: Australia", "country": "AU", "kind": "register", "data_date": "2026-10-07" }],
    "includes": { "address": "ok", "local": "ok", "signals": "ok" }
  }
}

VAT is not verified for Australia: the vat block is not available there. Registration for the goods and services tax (GST), the Australian equivalent of VAT, is given as published in the local block (gst.registered, gst.status and gst.since), without verification. Signals in Australia: closed with the cancellation date in since, and recently_created. The local block also gives the ACN, the state and the trading names (other_names).

Singapore

Singapore entities come from the Singapore register of companies and businesses: about 635,000 active entities (local companies, sole proprietorships, partnerships, branches of foreign companies) and about 1.5 million struck-off, dissolved or ceased entities, which remain available. The global identifier is SG- followed by the UEN: SG-196800306E for a local company (9 digits and a letter), SG-T05LL0003J for another entity (for example a limited liability partnership), a business number having 8 digits and a letter. The check letter is verified, and a well-formed but unknown number returns 404 not_found. The activity is the primary SSIC code (SG-SSIC), with no NACE equivalent. The register gives no end date: closed_on stays null for a closed entity. Sole proprietorships (form SOLE) are served under their trading name.

curl "https://api.jsonpage.com/v2/companies/SG-196800306E?include=address,local,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "SG-196800306E",
    "country": "SG",
    "registry_id": "196800306E",
    "name": "DBS BANK LTD.",
    "status": "active",
    "legal_form": { "code": "PCS", "label": "Société publique par actions", "scheme": "SG-LEGAL-FORM" },
    "activity": { "nace": null, "code": "64120", "label": null, "scheme": "SG-SSIC" },
    "incorporated_on": "1968-07-16",
    "closed_on": null,
    "updated_at": null,
    "address": { "line": "12 MARINA BOULEVARD, MARINA BAY FINANCIAL CENTRE", "postal_code": "018982", "city": "Singapore", "country": "SG", "formatted": "12 MARINA BOULEVARD, MARINA BAY FINANCIAL CENTRE, Singapore 018982" },
    "signals": [],
    "local": {
      "uen": "196800306E",
      "entity_type": { "code": "LC", "label": "Société locale", "scheme": "SG-ENTITY-TYPE" },
      "register_status": "Live Company",
      "uen_issued_on": "1968-07-16",
      "accounts_due_on": "2027-07-31",
      "annual_return_on": "2026-06-03",
      "secondary_activity": null,
      "former_names": ["THE DEVELOPMENT BANK OF SINGAPORE"],
      "sole_proprietor": false
    }
  },
  "meta": {
    "sources": [{ "name": "Official business register: Singapore", "country": "SG", "kind": "register", "data_date": "2026-10-11" }],
    "includes": { "address": "ok", "local": "ok", "signals": "ok" }
  }
}

VAT is not verified for Singapore: the vat block is not available there, and the register does not give the registration for the goods and services tax (GST). Signals in Singapore: closed (without a date), recently_created, strike_off_proposed for an entity “Gazetted To Be Struck Off”, liquidation for a voluntary winding up and insolvency_proceedings for a compulsory winding up or judicial management, with the register status in detail. The local block gives the entity type, the register status as published, the due dates of the accounts and the annual return, the secondary activity and the former names (former_names).

Japan

Japanese corporations come from the Japanese register of corporate numbers: about 5.1 million active corporations and organisations (stock companies, limited companies, local governments, associations, foreign companies with an office in Japan…) and about 780,000 closed ones, with their closure date in closed_on. Sole proprietors have no number and are not served. The global identifier is JP- followed by the 13 digits of the corporate number: JP-1180301018771. The first digit is a check digit, which is verified; a well-formed but unknown number returns 404 not_found. The name and the address are in Japanese: the reading of the name in katakana, and the English name and address (when the corporation declared them) are in the local block. The register publishes neither an activity code nor a creation date: activity and incorporated_on are null, and the date the number was assigned is in local.number_assigned_on. The name search finds a text of at least 2 characters anywhere in the Japanese name, the katakana reading or the English name.

curl "https://api.jsonpage.com/v2/companies/JP-1180301018771?include=address,local,signals" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "JP-1180301018771",
    "country": "JP",
    "registry_id": "1180301018771",
    "name": "トヨタ自動車株式会社",
    "status": "active",
    "legal_form": { "code": "301", "label": "Société par actions (kabushiki kaisha)", "scheme": "JP-LEGAL-FORM" },
    "activity": null,
    "incorporated_on": null,
    "closed_on": null,
    "updated_at": "2019-04-23",
    "address": { "line": "トヨタ町1番地", "postal_code": "471-0826", "city": "豊田市", "country": "JP", "formatted": "〒471-0826 愛知県豊田市トヨタ町1番地" },
    "signals": [],
    "local": {
      "corporate_number": "1180301018771",
      "name_kana": "トヨタジドウシャ",
      "name_en": null,
      "address_en": null,
      "prefecture": "愛知県",
      "prefecture_code": "23",
      "municipality_code": "23211",
      "number_assigned_on": "2015-10-05",
      "last_change_on": "2019-04-10",
      "closure": null,
      "legal_form_label_ja": "株式会社"
    }
  },
  "meta": {
    "sources": [{ "name": "Official corporate register: Japan", "country": "JP", "kind": "register", "data_date": "2026-10-11" }],
    "includes": { "address": "ok", "local": "ok", "signals": "ok" }
  }
}

VAT is not verified for Japan: the vat block is not available there. Signals in Japan: closed with the closure date in since. The local block also gives the closure reason (closure: liquidation completed, dissolved by merger, closed by the registrar) and the number of the corporation that took over after a merger (successor_number).

VAT

In France, the intra-community VAT number is computed from the SIREN; Jsonpage then verifies that it is valid. No request waits for this check: it runs in the background, and its date is in checked_at.

In Belgium, the VAT number is BE followed by the enterprise number, for example BE0417497106; it is verified the same way, with the same statuses.

In Switzerland, the VAT number is the UID followed by MWST, for example CHE-101.374.515 MWST; it is verified too. The statuses are the same, plus unavailable when the check could not be completed; it is then retried later. For a member of a VAT group, the number returned is the group's, which the company invoices with: Nestlé (CH-105909036) returns CHE-116.281.710 MWST.

In Finland, Latvia and Sweden, the VAT number is FI, LV or SE followed by the registry number (FI01120389, LV40003245752) or by the organisation number and 01 (SE556042722001); it is verified the same way, with the same statuses. In Norway, the number NO923609016MVA is read in the official VAT register: the status is valid or invalid, never pending.

No VAT verification is made for Australia, Singapore and Japan: the vat block is not available there, and the vat parameter of GET /v2/validate does not accept their numbers.

StatusMeaning
pendingNumber computed, check scheduled: request the record again a few seconds later.
validThe number is confirmed.
invalidThe number is not recognised.
not_verifiedNumber computed but not checked by this server.
unavailableSwitzerland only: the check could not be completed; it is retried later.

EORI

The EORI number is the customs identifier of a company that imports or exports. A French company usually has FR followed by the SIRET of its head office as its EORI. Two ways to use it: GET /v2/eori/{number} checks any number (European Union, United Kingdom; Switzerland and Norway answer not_applicable), and the eori block of a French record (?include=eori) tests the head office EORI.

The number in the eori block is derived from the SIRET, not read from a register: it is always presented as probable (probable: true, basis: "head_office_siret"). status: "valid" says that this number exists with customs, not that the company uses it. An official service that does not answer gives unverifiable with valid: null, never invalid: retry later.

name_match compares the name customs hold for the EORI with the name of the company: true when they designate the same company (case, accents, punctuation and legal forms ignored), false otherwise, for example for an EORI held by a subsidiary. For a French EORI the company name comes from the register; for any other number, pass it in the company_name parameter. The field is absent when one of the two names is unknown.

Answers are reused for 24 hours per number, and calls to the official services are spaced out: a file of several thousand partners is better handled with the file enrichment of the customer area (columns eori_number and eori_valid), which also accepts EORI numbers in the identifier column. GET /v2/validate accepts the eori parameter.

Signals

Signals are computed from the register record, with the same codes in every country. Each signal contains code, since (the date the situation started, when the register gives it) and detail. A closed company receives only closed.

SignalMeaningCountries
closedCompany closed or dissolved.France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan, United Kingdom
recently_createdIncorporated less than 12 months ago.France, Belgique, Norvège, Finlande, Lettonie, Irlande, Suède, Estonie, Lituanie, Australie, Singapour, Royaume-Uni
insolvency_proceedingsInsolvency proceedings under way; the detail gives the latest judgment in France, the juridical situation in Belgium, the type of procedure in Norway and Finland, the register status in Ireland, the ongoing proceeding in Sweden, the register status in Estonia, the legal status in Lithuania.France, Belgique, Norvège, Finlande, Irlande, Suède, Estonie, Lituanie, Singapour, Royaume-Uni
strike_off_proposedCompulsory strike-off proposed.Irlande, Singapour, Royaume-Uni
liquidationDissolution or liquidation in progress, outside bankruptcy; the detail gives the juridical situation in Belgium, the mention in the name in Switzerland and Latvia, the situation in Norway and Finland, the register status in Ireland, the ongoing proceeding in Sweden, the register status in Estonia, the legal status in Lithuania.Belgique, Suisse, Norvège, Finlande, Lettonie, Irlande, Suède, Estonie, Lituanie, Singapour
accounts_overdueAnnual accounts overdue.United Kingdom
confirmation_statement_overdueConfirmation statement overdue.Ireland, United Kingdom
dormantDormant company.United Kingdom

Legal announcements

The legal_events block contains the official legal notices published since 2008: insolvency proceedings, conciliations, professional recoveries, deregistrations, sales, registrations and miscellaneous notices. Names of natural persons and the free text of judgments are never stored; the url link leads to the full official announcement.

{
  "id": "A202601892890",
  "published_on": "2026-10-02",
  "family": "insolvency",
  "type": "initial",
  "judgment": {
    "family": "Jugement d'ouverture",
    "nature": "Jugement d'ouverture de liquidation judiciaire",
    "date": "2026-09-21"
  },
  "court": "Greffe du Tribunal de Commerce de Foix",
  "source": "Legal notices: France",
  "url": "..."
}
FieldContent
idIdentifier of the announcement.
published_onPublication date.
familyinsolvency, conciliation, professional_recovery, deregistration, sale, registration or other.
typeinitial, correction (corrected notice) or cancellation (cancelled notice).
judgmentFamily, nature and date of the judgment; null for an announcement without a judgment.
courtCourt or registry that issued the announcement.
source, urlOrigin of the announcement and link to its official version.

The insolvency_proceedings signal reads these judgments from newest to oldest: a closing judgment ends the procedure; an opening, a conversion to liquidation or a plan keeps it open. A cancelled announcement is ignored.

Beneficial owners

The owners block, available for the United Kingdom, lists the beneficial owners of the company (persons with significant control) recorded in the United Kingdom register; their date appears in meta.sources. Only current persons are returned, never those who have ceased to have control. Addresses are never returned, nor the day of birth: only the month and year, as in the register. The block is [] when no person is declared.

In France, owners is reported as not_available_in_country in meta.includes: the register of beneficial owners is no longer public since 31 July 2024. Access is reserved to authorities, obliged professionals and persons with a legitimate interest.

curl "https://api.jsonpage.com/v2/companies/GB-00445790?include=owners,sanctions" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "GB-00445790",
    "...": "...",
    "owners": [
      {
        "kind": "individual",
        "name": "Mr John Smith",
        "nationality": "British",
        "country_of_residence": "England",
        "birth": { "year": 1970, "month": 5 },
        "control": {
          "shares": { "min": 50, "max": 75 },
          "voting_rights": { "min": 25, "max": 100 },
          "appoints_directors": true,
          "significant_influence": false,
          "via": ["trust"]
        },
        "natures_of_control": ["ownership-of-shares-50-to-75-percent-as-trust", "voting-rights-more-than-25-percent", "right-to-appoint-and-remove-directors"],
        "notified_on": "2016-04-06",
        "sanctioned": false
      }
    ],
    "sanctions": { "...": "..." }
  },
  "meta": {
    "sources": [
      { "name": "Official company register: United Kingdom", "country": "GB", "kind": "register", "data_date": "2026-10-01" },
      { "name": "Beneficial ownership register: United Kingdom", "country": "GB", "kind": "ownership", "data_date": "2026-09-30" }
    ],
    "includes": { "owners": "ok", "sanctions": "ok" }
  }
}

Shortened, illustrative response: the person is fictitious.

FieldContent
kindindividual (natural person), corporate_entity (company on a register), legal_person (other legal person) or super_secure (person protected by the United Kingdom register).
nameName as published; null for super_secure.
nationality, country_of_residence, birthIndividuals only, omitted otherwise. birth contains year and month, never the day.
control.shares, control.voting_rightsBand held, in percent, { "min", "max" } (for example 25 to 50, 50 to 75, 75 to 100), or null.
control.appoints_directorsRight to appoint or remove a majority of the directors.
control.significant_influenceSignificant influence or control by other means.
control.viafirm and/or trust when control is held through a firm or a trust; [] otherwise.
natures_of_controlRaw codes of the United Kingdom register, as recorded.
notified_onStart date of the control notified to the United Kingdom register.
identificationCorporate owners only, omitted otherwise: registration_number, country_registered, legal_form.
sanctionedtrue when the United Kingdom register marks the person as sanctioned.

Sanctions

The sanctions block, available for France, Belgium, Switzerland, Norway, Finland, Latvia, Ireland, Sweden, Estonia, Lithuania, Australia, Singapore, Japan and the United Kingdom, compares the company with the main official international and national sanctions lists: European Union (EU), United Nations (UN), France (FR), United Kingdom (UK) and United States (US). Only listed entities (legal persons) are compared, never natural persons.

curl "https://api.jsonpage.com/v2/companies/FR-552032534?include=sanctions" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": {
    "id": "FR-552032534",
    "...": "...",
    "sanctions": {
      "status": "no_match",
      "matches": [],
      "lists": [
        { "list": "EU", "name": "Sanctions list: European Union", "published_at": "2026-09-22", "entities": 1776 },
        { "list": "UN", "name": "Sanctions list: United Nations", "published_at": "2026-10-01", "entities": 275 },
        { "list": "FR", "name": "Sanctions list: France", "published_at": "2026-10-02", "entities": 1924 },
        { "list": "United Kingdom", "name": "Sanctions list: United Kingdom", "published_at": "2026-10-02", "entities": 1645 },
        { "list": "US", "name": "Sanctions list: United States", "published_at": "2026-10-02", "entities": 10037 }
      ]
    }
  },
  "meta": { "sources": [{ "...": "..." }], "includes": { "sanctions": "ok" } }
}

Shortened, illustrative response: the entity counts change with the lists.

StatusMeaning
matchThe company's number (SIREN, Belgian enterprise number, Swiss UID, Norwegian, Finnish or Latvian number, or company number) is listed as a registration number of the same country. Only the EU list gives the country of these numbers.
possible_matchThe company name equals a listed name or alias once case, accents, punctuation and legal forms are ignored. To be checked: it may be a namesake.
no_matchNo match by number or by name.

Each item of matches contains list (EU, UN, FR, UK or US), reference (the entity's reference in its list), name (main listed name), match_type (identifier or name) and listed_on (listing date, when the list gives it). lists gives, for each list, its name, its publication date and the number of entities compared.

Indicative result. A no_match is not a guarantee: a sanctioned entity can be listed under another name, without a number, or be controlled by a listed person. This screening does not replace your own due diligence obligations (KYC, anti-money-laundering), as stated in the Terms.

Establishments

The /v2/companies/{id}/establishments endpoint returns establishments page by page. The limit parameter ranges from 1 to 100 (default 20). Each page contains items and next. Pass the value of next to the after parameter to get the next page. On the last page, next is null.

curl "https://api.jsonpage.com/v2/companies/FR-552032534/establishments?limit=50&after=55203253400414" \
  -H "X-API-Key: VOTRE_CLE"

Each establishment contains registry_id (the SIRET in France, the establishment unit number in Belgium, the sub-unit number in Norway), name, head_office, status, activity, opened_on and address.

Name search

GET /v2/companies?q={name} searches companies by name. Every word of 2 characters or more must appear in the name; the last word can be the start of a word of 3 letters or more ("dano" finds DANONE). Case, accents and punctuation are ignored.

curl "https://api.jsonpage.com/v2/companies?q=danone" \
  -H "X-API-Key: VOTRE_CLE"

curl "https://api.jsonpage.com/v2/companies?q=tesco&country=GB&status=active&limit=5" \
  -H "X-API-Key: VOTRE_CLE"

curl "https://api.jsonpage.com/v2/companies?q=proximus&country=BE" \
  -H "X-API-Key: VOTRE_CLE"

curl "https://api.jsonpage.com/v2/companies?q=swatch&country=CH" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": [
    { "id": "FR-552032534", "country": "FR", "registry_id": "552032534", "name": "DANONE", "status": "active", "...": "..." },
    { "id": "FR-...", "...": "..." }
  ],
  "meta": { "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-10-01" }] }
}

Shortened, illustrative response.

Parameters (q, country, status, limit): name, type, default value and limits in the endpoint details, among the available endpoints.

Result order: exact names first (legal forms such as SA, SAS, SARL, LTD or PLC are ignored when comparing, so "danone" finds DANONE first), then active companies, then companies before sole traders, then relevance. For a very common word, relevance ranking stops after 400 ms and results are served without it, so that they stay fast.

Each result is a base record, identical to that of GET /v2/companies/{id}; include and fields do not apply. The whole search counts as a single request, whatever the number of results. Protected units (diffusion status "P") have no name and cannot be found by name.

Search-specific errors: 400 query_too_short (no word of 2 characters or more), 400 invalid_parameter (invalid status or limit), 404 country_not_supported (country without name search), 503 search_unavailable (search not available on the server yet).

Lookup by number

If you only know the national number, GET /v2/companies?registry_id=552032534 lists the companies with this number in every country served, usually just one. The response is an empty list if none matches.

Batch requests

The POST /v2/companies/batch endpoint accepts up to 100 identifiers and the blocks you need. Each company in the batch counts as one request against your plan's rate limit. The response keeps the requested order; each item contains data, or error if the company is not found or the identifier is invalid.

curl -X POST "https://api.jsonpage.com/v2/companies/batch" \
  -H "X-API-Key: VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{ "ids": ["FR-552032534", "FR-000000001"], "include": ["vat"] }'
{
  "data": [
    { "id": "FR-552032534", "data": { "id": "FR-552032534", "...": "..." } },
    { "id": "FR-000000001", "data": null, "error": { "code": "not_found", "message": "No company with this identifier." } }
  ],
  "meta": { "sources": [{ "name": "Official company register: France", "country": "FR", "kind": "register", "data_date": "2026-10-01" }] }
}

Caching and ETag

Responses from GET v2 endpoints carry an ETag header. Send its value back in the If-None-Match header of your next request. If the record has not changed, the API responds with 304 and no body.

curl -i "https://api.jsonpage.com/v2/companies/FR-552032534" \
  -H "X-API-Key: VOTRE_CLE" \
  -H 'If-None-Match: "3f9a0c1d2b4e5f6a7b8c9d0e"'
03 / ERRORS AND LIMITS

Handle responses

All v2 errors share the same format, with a stable code, a message in English and a link to this documentation.

{
  "error": {
    "code": "invalid_identifier",
    "message": "A French registry number is a 9-digit SIREN.",
    "docs": "https://jsonpage.com/docs#erreurs"
  }
}
HTTP statusError codeMeaning
400invalid_identifierMalformed global identifier, or a number in the wrong format for this country.
400unknown_includeUnknown block in include.
400invalid_parameter, invalid_jsonParameter out of range, or invalid batch request body.
400query_too_shortName search without any word of 2 characters or more.
401invalid_api_keyMissing or invalid key.
403ip_not_allowedRequest from an IP address that is not in the account's allowlist (Pro).
403product_not_enabledProduct not enabled on the account; enable it from the dashboard.
403monitor_limit_reachedThe plan's limit of monitored companies is reached.
404not_foundNo company with this identifier.
404country_not_supportedCountry not served yet, or without name search.
404not_available_in_countryThis country's register has no establishments.
404not_monitoredCompany not on your monitoring list.
429rate_limit_exceededPlan rate exceeded; the Retry-After header gives the wait time.
429daily_limit_reachedDaily cap of the Discovery plan (free) reached (1,000 requests, reset at midnight UTC). Switch to the Standard plan to lift the cap.
500data_unavailableData temporarily unreadable; retry.
503server_busyService temporarily busy; retry with backoff.
503search_unavailableName search not available on this server yet.
503monitoring_unavailableMonitoring not available on this server yet.

Rates: Discovery 100/min, Standard 1,000/min, Pro with no plan-specific rate cap. There is no monthly quota. To preserve availability, Pro has a fair-use ceiling of 10,000 requests/min per account.

Rate and monitoring limits apply per product. Keys, log retention, the IP allowlist, the SLA and support follow the account's best plan.

The rate refills continuously over one minute. The X-RateLimit-Remaining header of every response tells how many requests are still available. On 429 and 503, the Retry-After header gives the delay to wait, in seconds. A batch request counts as many requests as companies asked for. The Discovery plan (free) also has a cap of 1,000 requests per day, reset at midnight UTC: beyond it the API answers 429 daily_limit_reached (fields message, message_en and upgrade_url) with Retry-After until midnight UTC. The X-Daily-Limit and X-Daily-Remaining headers give the cap and what is left. Paid plans have no daily cap.

Rate limit headers and retries

Two headers describe the state of your rate: X-RateLimit-Remaining, present on every successful response, gives the number of requests still available in the rolling minute of your plan; Retry-After, sent with 429 rate_limit_exceeded and 503 server_busy, gives the delay to wait in seconds. There is no X-RateLimit-Limit or X-RateLimit-Reset header: your plan's limit is shown in the dashboard and on the pricing page.

Recommended retry policy: retry only on 429, 503 and network errors, never on another 4xx error (the request must be fixed, sending it again changes nothing). Wait for the Retry-After value when present, otherwise use an exponential delay (1 s, 2 s, 4 s, 8 s…) with jitter so that all your clients do not restart together, and give up after 5 attempts.

Node.js

async function getWithRetry(url, attempts = 5) {
  for (let attempt = 0; attempt < attempts; attempt++) {
    let response;
    try {
      response = await fetch(url, { headers: { "X-API-Key": process.env.JSONPAGE_API_KEY } });
    } catch {
      response = null; // network error: retry
    }
    if (response && response.status !== 429 && response.status !== 503) return response; // success or 4xx: no retry
    const wait = Number(response?.headers.get("Retry-After")) * 1000 || 2 ** attempt * 1000;
    await new Promise((resolve) => setTimeout(resolve, wait + Math.random() * 500)); // jitter
  }
  throw new Error("Jsonpage API: still unavailable after retries");
}
04 / MONITORING AND WEBHOOKS

Get notified of changes

Add companies to your monitoring list: each monitored company is compared with the official registers, legal notices, beneficial owners and sanctions lists. Each difference becomes an event, which you read with GET /v2/events or receive on your webhook. The state recorded when the company is added is the baseline: no event is created for the past.

Each call to these endpoints counts as one request, like any other call. Webhook deliveries are not counted.

curl -X PUT "https://api.jsonpage.com/v2/monitors/FR-552032534" \
  -H "X-API-Key: VOTRE_CLE"
{ "data": { "company_id": "FR-552032534", "created": true } }
curl "https://api.jsonpage.com/v2/monitors?limit=100" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": [
    { "company_id": "FR-552032534", "created_at": "2026-10-02T09:12:44Z", "checked_at": "2026-10-02T10:00:03Z" }
  ],
  "next": null,
  "meta": { "count": 1, "limit": 1000 }
}

checked_at is null until the company has been compared for the first time. meta.count is the number of monitored companies and meta.limit the limit of your plan. When a page is full, pass next to the after parameter; on the last page, next is null.

Limits per plan

PlanMonitored companies
Discovery2
Standard1,000
Pro10,000

Webhooks are included in every plan. Beyond the limit, PUT returns 403 monitor_limit_reached: plan limit reached, upgrade to a higher plan to monitor more companies. You are alerted by email at 80 % and 100 % of the limit. Companies already monitored keep working, and adding one of them again still returns 200. A CSV import in the dashboard adds companies up to the limit and reports how many were skipped.

Reading events

Events are returned oldest first. Their evt_… identifiers increase, without being necessarily consecutive. Pass the identifier of the last event you processed to the after parameter: next gives the identifier of the last event of the page, or null when there is no new event. In that case, keep your own cursor for the next call. Events stay readable for 90 days.

curl "https://api.jsonpage.com/v2/events?after=evt_41&limit=100" \
  -H "X-API-Key: VOTRE_CLE"
{
  "data": [
    {
      "id": "evt_42",
      "type": "company.address_changed",
      "company_id": "FR-552032534",
      "detected_at": "2026-10-03T04:00:00Z",
      "data": {
        "before": "75 AV DE LA GRANDE ARMEE 75116 PARIS",
        "after": "7 RUE HENRI SAINTE-CLAIRE DEVILLE 92500 RUEIL-MALMAISON"
      }
    }
  ],
  "next": "evt_42"
}

Illustrative response.

Event types

TypeWhendata
company.status_changedThe status changes (active, closed, unknown).before, after
company.name_changedThe name changes.before, after
company.address_changedThe formatted address of the head office changes.before, after
company.activity_changedThe national activity code changes.before, after
company.legal_form_changedThe legal form code changes.before, after
company.removed_from_registerThe company is no longer in the register.{}
signal.addedA signal appears.code, since, detail
signal.removedA signal disappears.code
legal_event.publishedA new legal notice is published (France).event: the same object as the legal_events block
sanctions.changedThe status or the matches of the sanctions screening change.before, after, added, removed, matches
owner.addedA person with significant control is added (United Kingdom).kind, name
owner.removedA person with significant control is no longer declared (United Kingdom).kind, name

The monitored signals are insolvency_proceedings, liquidation, strike_off_proposed, accounts_overdue, confirmation_statement_overdue and dormant. closed and recently_created never produce a signal event: a closure is already reported by company.status_changed. For sanctions.changed, before and after are statuses (no_match, possible_match, match), added and removed list matches as LIST:reference, and matches holds the current matches, in the format of the sanctions block. A field that the country does not provide never produces an event.

{
  "id": "evt_57",
  "type": "sanctions.changed",
  "company_id": "GB-01234567",
  "detected_at": "2026-10-03T05:00:00Z",
  "data": {
    "before": "no_match",
    "after": "match",
    "added": ["US:EXAMPLE-1"],
    "removed": [],
    "matches": [{ "list": "US", "reference": "EXAMPLE-1", "name": "EXAMPLE TRADING LTD", "match_type": "identifier", "listed_on": "2026-10-02", "programs": ["RUSSIA-EO14024"] }]
  }
}

Fictitious event.

A change is only detected once the official source has published it. Monitoring is provided on a best-effort basis, with no guarantee of completeness or delay, as stated in the Terms.

Webhooks

Set up your webhook in the dashboard, Monitoring section: one HTTPS URL per account, on a public host. Private, loopback and link-local addresses are refused, and redirects are not followed. The dashboard shows the whsec_… signing secret, which you can regenerate, and lets you send a signed test event. This test event does not appear in GET /v2/events; the "Send a test event" button shows the HTTP status, the duration and any error, and sending is limited to 10 per hour.

Each event is sent as a POST request whose JSON body is the event object, with these headers:

POST /webhooks/jsonpage HTTP/1.1
Content-Type: application/json
Jsonpage-Event-Id: evt_42
Jsonpage-Signature: t=1791000000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd

{"id":"evt_42","type":"company.address_changed","company_id":"FR-552032534","detected_at":"2026-10-03T04:00:00Z","data":{"before":"…","after":"…"}}

Verify the signature

Each request is signed with your webhook's whsec_… secret. Only process an event once its signature is verified. The header format is Jsonpage-Signature: t=<Unix seconds>,v1=<hex>; the algorithm is HMAC-SHA256, computed with your secret over the string <t>.<raw body> (the time t, a dot, then the bytes exactly as received), and hex encoded.

Steps: read the raw body before any JSON decoding, extract t and v1, recompute the HMAC, compare it with v1 in constant time, then reject the request if t is more than 5 minutes (300 seconds) away from your clock, to block replays. Answer 400 when the signature is invalid.

Node.js

import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody: the request body as received (Buffer or string), header: the Jsonpage-Signature value.
export function verify(rawBody, header = "", secret = process.env.JSONPAGE_WEBHOOK_SECRET) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const t = Number(parts.t);
  if (!t || !parts.v1 || Math.abs(Date.now() / 1000 - t) > 300) return false;
  const expected = createHmac("sha256", secret).update(`${parts.t}.`).update(rawBody).digest("hex");
  return parts.v1.length === expected.length && timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
}

Python

import hashlib
import hmac
import os
import time

SECRET = os.environ["JSONPAGE_WEBHOOK_SECRET"].encode()  # whsec_…

def verify(raw_body: bytes, header: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(",") if "=" in p)
    try:
        t = int(parts["t"])
    except (KeyError, ValueError):
        return False
    if abs(time.time() - t) > 300:
        return False
    signed = parts["t"].encode() + b"." + raw_body
    expected = hmac.new(SECRET, signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts.get("v1", ""))

PHP

<?php
function verify(string $rawBody, string $header, string $secret): bool {
    $parts = [];
    foreach (explode(',', $header) as $part) {
        [$key, $value] = array_pad(explode('=', $part, 2), 2, '');
        $parts[$key] = $value;
    }
    $t = (int) ($parts['t'] ?? 0);
    if ($t === 0 || empty($parts['v1']) || abs(time() - $t) > 300) {
        return false;
    }
    $expected = hash_hmac('sha256', $t . '.' . $rawBody, $secret);
    return hash_equals($expected, $parts['v1']);
}

// $rawBody = file_get_contents('php://input');
// $header = $_SERVER['HTTP_JSONPAGE_SIGNATURE'] ?? '';

Ruby

require "openssl"

# raw_body: the request body as received, header: the Jsonpage-Signature value.
def verify(raw_body, header, secret)
  parts = header.to_s.split(",").map { |part| part.split("=", 2) }.to_h
  t = parts["t"].to_i
  return false if t.zero? || parts["v1"].nil? || (Time.now.to_i - t).abs > 300

  expected = OpenSSL::HMAC.hexdigest("SHA256", secret, "#{t}.#{raw_body}")
  expected.bytesize == parts["v1"].bytesize && OpenSSL.fixed_length_secure_compare(expected, parts["v1"])
end

Deliveries and retries

A 2xx answer within 15 seconds is a success. Otherwise (another status, timeout, connection failure), the delivery is retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h, then marked as failed. A failed event stays readable through GET /v2/events. A delivery may arrive more than once or out of order: deduplicate on the event identifier (id or the Jsonpage-Event-Id header) and answer quickly, handling the event after the answer if needed.

Monitoring errors

400 invalid_identifier (malformed global identifier), 400 invalid_parameter (invalid limit or after), 403 monitor_limit_reached (plan limit reached), 404 not_found (PUT of a company that is not in the register), 404 not_monitored (DELETE of a company you do not monitor), 503 monitoring_unavailable (monitoring not available on the server yet).

05 / FORMS: AUTOCOMPLETE AND VALIDATION

Complete and check what users type

Two endpoints for client or supplier onboarding forms, invoices (supplier SIRET and VAT) and simple company identity checks: /v2/autocomplete suggests companies while the user types, /v2/validate checks the identifiers entered. Each call counts as one request.

Without coding: the plugins for WooCommerce, WordPress, Shopify and PrestaShop use these two endpoints and add company autocomplete and a verified VAT number to your shop.

Autocomplete

GET /v2/autocomplete answers from the name index only, without reading the full record, in a few milliseconds on the server. Words follow the name search rules: every word of 2 characters or more must appear in the name, the last one can be the start of a word. If the text typed is a registry number (SIREN, SIRET, Belgian enterprise number, Swiss UID, Norwegian organisation number, Finnish Business ID, Latvian registration number, Australian ABN, Singapore UEN, Japanese corporate number or British company number), the matching company is returned directly; a SIRET returns its company.

curl "https://api.jsonpage.com/v2/autocomplete?q=carrefour&limit=5" \
  -H "X-API-Key: YOUR_KEY"
{
  "data": [
    { "id": "FR-652014051", "name": "CARREFOUR", "status": "active", "postal_code": "91300", "city": "MASSY", "kind": "company" },
    { "id": "FR-...", "...": "..." }
  ]
}

Shortened, illustrative response.

Parameters (q, country, status, limit): name, type, default value and limits in the endpoint details, among the available endpoints.

Each suggestion contains id (the global identifier to reuse), name, status, postal_code and city (null when unknown) and kind: company for a company, person for a sole trader. The order is that of the name search: exact names, then active companies, then companies before sole traders. For the full record, then call GET /v2/companies/{id} with the chosen id.

Errors: 400 query_too_short (no word of 2 characters or more), 400 invalid_parameter (invalid status or limit), 404 country_not_supported (country without name search). Responses carry an ETag, like the other v2 GET endpoints.

In a formCall the endpoint from your server, never directly from the browser: the API key would be visible. Wait about 150 ms after the last keystroke before each call. See the server-side route example in the quick start.

Validation

GET /v2/validate accepts id (global identifier, for example FR-552032534), siret and vat, in any combination, with at least one of them. Spaces, dots and hyphens in the SIRET and the VAT number are ignored. The response says whether everything is valid, details each check and returns the company's base record with its address.

curl "https://api.jsonpage.com/v2/validate?id=FR-652014051&vat=FR14652014051" \
  -H "X-API-Key: YOUR_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",
      "country": "FR",
      "registry_id": "652014051",
      "name": "CARREFOUR",
      "status": "active",
      "...": "...",
      "address": { "...": "...", "postal_code": "91300", "city": "MASSY" },
      "vat": { "number": "FR14652014051", "status": "valid", "checked_at": "...", "source": "EU VAT check" }
    }
  }
}

Shortened response: the base fields are omitted here.

CheckVerifies
id_formatThe global identifier is well formed for a country served; in Switzerland, Norway and Finland, the modulo-11 check digit of the UID, the organisation number or the Business ID is verified. In Australia, the modulo-89 check of the ABN is verified too. In Singapore, the check letter of the UEN is verified too. In Japan, the check digit of the corporate number is verified too.
siren_keyThe SIREN check digit (Luhn) is correct (France).
siret_formatThe SIRET has 14 digits.
siret_keyThe SIRET check digit (Luhn) is correct; La Poste establishments follow their own rule.
siret_existsThe establishment exists in the register.
siret_activeThe establishment is active.
vat_formatThe VAT number is well formed: in France, the one computed from the SIREN; in Belgium, BE followed by an enterprise number with a correct check; in Switzerland, the UID with a correct check digit, followed by MWST, VAT or IVA; in Norway, NO, an organisation number with a correct check digit and MVA; in Finland, FI followed by the 8 characters of a Business ID with a correct check digit; in Latvia, LV followed by 11 digits; in Sweden, SE, an organisation number with a correct check digit and 01; in Estonia, EE followed by 9 digits; in Lithuania, LT followed by the 9 digits of the code.
vat_country_supportedThe country of the VAT number is supported (France, Belgium, Switzerland, Norway, Finland, Latvia, Sweden, Estonia or Lithuania); always failed for another country.
identifiers_matchAll identifiers point to the same company.
company_existsThe company exists in the register.
company_activeThe company is active.
vat_registeredVerification status of the VAT number: valid, pending (check in progress, retry a few seconds later), not_verified and unavailable (check not completed) pass; invalid fails.

valid is true only if every check returned succeeded. Only relevant checks are returned: a check that depends on a failed one is omitted (a malformed SIRET is not looked up). company is returned even when the establishment or the company is closed, to say what the identifiers point to; it is null when the identifiers do not point to the same company or when the company is not found. The response is not cached for more than 60 seconds (Cache-Control: private, max-age=60).

Belgian example: a Belgian VAT number is enough, the API derives the company from it. Dots are ignored, so BE0417.497.106 is accepted.

curl "https://api.jsonpage.com/v2/validate?vat=BE0417497106" \
  -H "X-API-Key: YOUR_KEY"
{
  "data": {
    "valid": true,
    "checks": [
      { "code": "vat_country_supported", "ok": true, "value": "BE0417497106" },
      { "code": "vat_format", "ok": true, "value": "BE0417497106" },
      { "code": "company_exists", "ok": true, "value": "BE-0417497106" },
      { "code": "company_active", "ok": true, "value": "active" },
      { "code": "vat_registered", "ok": true, "value": "valid" }
    ],
    "company": {
      "id": "BE-0417497106",
      "country": "BE",
      "registry_id": "0417497106",
      "name": "Anheuser-Busch InBev",
      "status": "active",
      "...": "...",
      "address": { "...": "...", "postal_code": "1000", "city": "Bruxelles" },
      "vat": { "number": "BE0417497106", "status": "valid", "checked_at": "...", "source": "EU VAT check" }
    }
  }
}

Swiss example: a Swiss VAT number is enough too, with or without dots, spaces and the MWST, VAT or IVA mention.

curl "https://api.jsonpage.com/v2/validate?vat=CHE-105.909.036+MWST" \
  -H "X-API-Key: YOUR_KEY"
{
  "data": {
    "valid": true,
    "checks": [
      { "code": "vat_country_supported", "ok": true, "value": "CHE105909036MWST" },
      { "code": "vat_format", "ok": true, "value": "CHE105909036MWST" },
      { "code": "company_exists", "ok": true, "value": "CH-105909036" },
      { "code": "company_active", "ok": true, "value": "active" },
      { "code": "vat_registered", "ok": true, "value": "valid" }
    ],
    "company": {
      "id": "CH-105909036",
      "country": "CH",
      "registry_id": "105909036",
      "name": "Nestlé AG",
      "status": "active",
      "...": "...",
      "address": { "...": "...", "postal_code": "6330", "city": "Cham" },
      "vat": { "number": "CHE-116.281.710 MWST", "status": "valid", "checked_at": "...", "source": "EU VAT check" }
    }
  }
}

Nestlé is a member of a VAT group: the number typed does point to the company, and the vat block gives the group's number, which it invoices with.

Example in Norway, Finland, Latvia, Sweden, Estonia or Lithuania: a VAT number is enough too, NO923609016MVA (with or without spaces), FI01120389 or LV40003245752. For a Norwegian number, vat_registered is valid if the unit is registered for VAT and fails otherwise.

curl "https://api.jsonpage.com/v2/validate?vat=NO923609016MVA" \
  -H "X-API-Key: VOTRE_CLE"
curl "https://api.jsonpage.com/v2/validate?id=FR-652014051&siret=55203253400414" \
  -H "X-API-Key: YOUR_KEY"
{
  "data": {
    "valid": false,
    "checks": [
      { "code": "id_format", "ok": true, "value": "FR-652014051" },
      { "code": "siren_key", "ok": true, "value": "652014051" },
      { "code": "siret_format", "ok": true, "value": "55203253400414" },
      { "code": "siret_key", "ok": true, "value": "55203253400414" },
      { "code": "identifiers_match", "ok": false, "value": "FR-552032534" }
    ],
    "company": null
  }
}

The SIRET belongs to another company (FR-552032534): the identifiers do not match.

Error: 400 invalid_parameter when none of the three parameters is given. A malformed identifier is not an error: it gives a failed id_format.

06 / CUSTOMER AREA: KEYS, ENRICHMENT, LISTS, EXPORTS

Manage your account in the dashboard

These features are used in the dashboard, signed in to your account: they are not public API endpoints and they do not need an API key.

API keys

You can have up to 1, 3 or 10 active keys at the same time depending on the plan (Discovery (free), Standard, Pro), each with a name. Rotating a key creates a new key with the same name: the old one keeps working for 24 hours, so that you can replace it on your servers, and is then disabled. A revoked key is rejected at once with 401 invalid_api_key.

Allowed IP addresses (Pro)

With Pro, restrict the use of your keys to at most 20 IP addresses or CIDR ranges, IPv4 or IPv6 (for example 203.0.113.10 or 2001:db8::/32). The list applies to every key of the account; a request from another address gets 403 ip_not_allowed. An empty list accepts every address.

Request log

The log lists every API call (date, method, path with its parameters, status code and duration) over 7 days on Discovery, 30 days on Standard and 90 days on Pro. Response bodies are not kept.

Enrich a file

Upload a CSV file and choose the identifier column: SIREN, SIRET, VAT number or global identifier. Only that column is sent. The completed file, a semicolon-separated CSV, contains input, id, found, name, status, legal_form, activity_code, activity_label, nace, address, postal_code, city, country, vat_number, vat_status, incorporated_on, closed_on, signals, insolvency, sanctions, error. A file holds up to 10,000 rows on Standard and 100,000 on Pro; the Discovery plan allows 100 enriched rows per month. Each row counts as one request. One file is processed at a time per account; the result can be downloaded for 7 days.

Company lists (Standard and Pro)

Filter French companies by activity (NAF code such as 62.01Z or division such as 62), department (69, 2A, 974), legal category and creation period. The preview gives the number of companies and ten examples; the CSV file contains siren, id, name, naf, naf_label, legal_category, legal_category_label, created_at, address, postal_code, city, department. Quota: 1,000 rows per calendar month on Standard, 50,000 on Pro. Only active companies whose data is public are included, never sole traders. You remain responsible for complying with the GDPR and direct marketing rules (see the terms).

Exports of your data (Standard and Pro)

Your monitored companies, your events and your request log can be downloaded as CSV files that open directly in spreadsheet software.

07 / BEST PRACTICES

A reliable integration

  • Store the global identifier returned in data.id (FR-552032534, BE-0417497106, CH-101374515, NO-923609016, FI-01120389, LV-40003245752, IE-104547, SE-5560427220, EE-10137025, LT-110053842, AU-51824753556, SG-196800306E, JP-1180301018771, GB-00445790) and reuse it as is. Check a number typed by a user with /v2/validate first.
  • Ask include only for the blocks you need: a block not asked for is neither read nor computed, and the response stays light.
  • Keep the API key on your server. To change it, renew it: the old one stays valid for 24 hours.
  • On 429 or 503, wait for the Retry-After delay, then retry with increasing delays.
  • Send the ETag back in If-None-Match so as not to read an unchanged record again, and read several companies at once with POST /v2/companies/batch.
  • To follow customers or suppliers, prefer monitoring (webhooks or GET /v2/events) to reading their records again and again.
  • Respect the partial diffusion status P of French companies (local.diffusion_status) and the terms of use of the data.

Also see the SLA page for the availability commitment of the Pro plan.

08 / DATA SOURCE

Data source

Jsonpage relies on the official company registers of the countries covered and on public regulatory information: insolvency proceedings, international sanctions lists, VAT number status. Jsonpage collects, checks, harmonises and enriches this information to offer one format whatever the country, with verified identifiers and readable statuses.

Every response gives the date of the data used in meta.sources, and the service status can be checked at any time.

LEARN MORE

A question about the service?

The FAQ covers data, request limits and how to use the service.

Read the FAQ