Jsonpage · SIREN- en SIRET-API

API om SIREN en btw-nummer van uw e-facturen te controleren

Een Franse e-factuur bevat het SIREN-nummer van de klant en, afhankelijk van het geval, het SIRET en het btw-nummer van beide partijen. Een fout nummer of een gesloten onderneming ontdekt u te laat, bij de afwijzing van de factuur.

01 / WAAROM

Waarom nummers controleren vóór de factuur

Deze pagina laat zien hoe u die nummers met een API-aanroep controleert voordat u een factuur uitreikt of die van een leverancier boekt, met voorbeelden in curl, JavaScript, Python, PHP en Ruby.

De elektronische facturatie wordt in Frankrijk gefaseerd ingevoerd: alle ondernemingen moeten vanaf september 2026 elektronische facturen kunnen ontvangen, en het uitreiken breidt zich vanaf september 2027 uit naar kmo's en micro-ondernemingen. De officiële kalender staat op impots.gouv.fr (in het Frans). Het SIREN-nummer van de klant wordt een vermelding op de factuur: zie wat e-facturatie verandert voor het SIREN-nummer en de lijst met verplichte vermeldingen.

Twee momenten lenen zich voor een automatische controle. Bij het uitreiken controleert u de koper: het nummer bestaat, de onderneming is actief, het SIRET en het btw-nummer wijzen naar dezelfde onderneming. Bij ontvangst controleert u de verkoper voordat u boekt en betaalt, wat ook het risico op een valse factuur verkleint.

Wat de API controleertDe identificatienummers en de onderneming waarnaar ze verwijzen. De factuur zelf controleert ze niet: bestandsformaat en inhoud vallen onder uw facturatiesoftware of uw platform.
02 / AANROEP

Eén aanroep voor SIRET en btw-nummer

De route GET /v2/validate neemt een globale identificatie, een SIRET, een btw-nummer of meerdere tegelijk. Elke controle komt terug met haar resultaat, en valid is alleen waar als alle controles slagen. De API-sleutel gaat in de header X-API-Key.

curl "https://api.jsonpage.com/v2/validate?siret=55203253400646&vat=FR27552032534" \
  -H "X-API-Key: $JSONPAGE_API_KEY"

Antwoord (fragment):

{
  "data": {
    "valid": true,
    "checks": [
      { "code": "siret_format", "ok": true, "value": "55203253400646" },
      { "code": "siret_key", "ok": true, "value": "55203253400646" },
      { "code": "vat_format", "ok": true, "value": "FR27552032534" },
      { "code": "identifiers_match", "ok": true, "value": "FR-552032534" },
      { "code": "company_exists", "ok": true, "value": "FR-552032534" },
      { "code": "company_active", "ok": true, "value": "active" },
      { "code": "vat_registered", "ok": true, "value": "valid" }
    ],
    "company": { "id": "FR-552032534", "name": "DANONE", "status": "active" }
  }
}

Spaties, punten en streepjes worden in het SIRET en het btw-nummer genegeerd, zodat u de invoer niet vooraf hoeft op te schonen. Btw-nummers van alle landen van de Europese Unie worden aanvaard, niet alleen Franse.

03 / RESULTAAT

Het resultaat lezen en beslissen

Stop niet bij valid: de lijst checks zegt welke controle mislukte, en dus wat u aan uw tegenpartij moet vragen.

ResultaatWat het betekentWat te doen vóór de factuur
valid: trueAlle controles zijn geslaagd.Ga door: de factuur uitreiken of boeken.
siret_key of vat_format misluktHet nummer is verkeerd ingevoerd: een tikfout of een foute controlesleutel.Corrigeer het nummer aan de bron en voer de controle opnieuw uit.
company_active misluktHet nummer bestaat, maar de onderneming of de vestiging is gesloten.Vraag de klant of leverancier om een actueel nummer voordat u verdergaat.
identifiers_match misluktHet SIRET en het btw-nummer wijzen niet naar dezelfde onderneming.Laat het juiste paar nummers bevestigen.
vat unverifiableDe dienst van het land antwoordde niet: het nummer is niet als fout aangemerkt.Probeer het later opnieuw; behandel het niet als ongeldig.

Voor een reeks nummers, bijvoorbeeld een heel klantenbestand vóór de eerste factureringsronde, doet de pagina Klantenbestand de controle zonder programmeren, en de werkwijze om een klantenbestand op te schonen beschrijft de stappen.

04 / CODE

Codevoorbeelden

Dezelfde controle in vier talen, om aan uw facturatiesoftware of ERP te koppelen. De sleutel wordt uit een omgevingsvariabele gelezen: zet hem nooit in een pagina of in een toepassing die aan gebruikers wordt verspreid.

JavaScript

async function checkParty(siret, vat) {
  const url = new URL("https://api.jsonpage.com/v2/validate");
  url.searchParams.set("siret", siret);
  url.searchParams.set("vat", vat);
  const res = await fetch(url, { headers: { "X-API-Key": process.env.JSONPAGE_API_KEY } });
  if (!res.ok) throw new Error("HTTP " + res.status);
  const { data } = await res.json();
  const failed = data.checks.filter((c) => !c.ok).map((c) => c.code);
  return { valid: data.valid, failed, company: data.company };
}

Python

import os
import requests


def check_party(siret, vat):
    r = requests.get(
        "https://api.jsonpage.com/v2/validate",
        params={"siret": siret, "vat": vat},
        headers={"X-API-Key": os.environ["JSONPAGE_API_KEY"]},
        timeout=10,
    )
    r.raise_for_status()
    data = r.json()["data"]
    failed = [c["code"] for c in data["checks"] if not c["ok"]]
    return data["valid"], failed, data["company"]

PHP

function checkParty(string $siret, string $vat): array
{
    $url = "https://api.jsonpage.com/v2/validate?" . http_build_query(["siret" => $siret, "vat" => $vat]);
    $context = stream_context_create(["http" => [
        "header" => "X-API-Key: " . getenv("JSONPAGE_API_KEY"),
        "timeout" => 10,
    ]]);
    $body = file_get_contents($url, false, $context);
    if ($body === false) {
        throw new RuntimeException("Request failed");
    }
    $data = json_decode($body, true)["data"];
    $failed = array_column(array_filter($data["checks"], fn ($c) => !$c["ok"]), "code");
    return [$data["valid"], $failed, $data["company"]];
}

Ruby

require "net/http"
require "json"

def check_party(siret, vat)
  uri = URI("https://api.jsonpage.com/v2/validate")
  uri.query = URI.encode_www_form(siret: siret, vat: vat)
  req = Net::HTTP::Get.new(uri, "X-API-Key" => ENV.fetch("JSONPAGE_API_KEY"))
  res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
  raise "HTTP #{res.code}" unless res.is_a?(Net::HTTPSuccess)

  data = JSON.parse(res.body)["data"]
  failed = data["checks"].reject { |c| c["ok"] }.map { |c| c["code"] }
  [data["valid"], failed, data["company"]]
end
05 / GRENZEN

Wat de API niet doet

De API controleert nummers en de onderneming waarnaar ze verwijzen. Ze valideert het factuurbestand niet (structuur, velden, conformiteit met het vereiste formaat), stuurt de factuur niet naar een platform en vervangt het advies van uw boekhouder niet. Een btw-nummer dat "momenteel niet verifieerbaar" is, is geen fout nummer: probeer het later opnieuw.

Wat het volume betreft zijn de routes per minuut beperkt; daarboven is het antwoord 429 met een header Retry-After: wacht zo lang voordat u opnieuw probeert. Voor een grote reeks beperkt de batchroute (100 ondernemingen per aanroep) het aantal aanroepen. Zie de documentatie.

06 / VEELGESTELDE VRAGEN

Veelgestelde vragen

Moet ik het SIREN vóór elke factuur controleren?+

Minstens bij het aanmaken van de klant of leverancier, en daarna wanneer een factuur wordt afgewezen of een betalingsgegeven wijzigt. Een controle bij het uitreiken voorkomt dat u een factuur naar een gesloten onderneming of een fout nummer stuurt.

Valideert de API mijn e-factuur?+

Nee. Ze controleert de identificatienummers (SIREN, SIRET, btw) en de onderneming waarnaar ze verwijzen. Formaat en inhoud van het factuurbestand hangen af van uw software of platform.

Kan ik het btw-nummer van een buitenlandse leverancier controleren?+

Ja. De controleroute aanvaardt btw-nummers van de landen van de Europese Unie. Antwoordt de dienst van het land niet, dan is het resultaat "niet verifieerbaar", wat niet hetzelfde is als een ongeldig nummer.

Heb ik een betaald account nodig?+

Nee, het gratis account geeft toegang tot alle routes, met 100 verzoeken per minuut en 1.000 verzoeken per dag. Betaalde abonnementen heffen het daglimiet op.

Wat als SIRET en btw-nummer niet overeenkomen?+

Vraag uw tegenpartij het paar nummers te bevestigen voordat u factureert. De lijst met controles toont of het SIRET bestaat, actief is en naar dezelfde onderneming wijst als het btw-nummer.

07 / GERELATEERDE ARTIKELEN

Verder lezen

API

Probeer het met uw eigen nummers

Het gratis account geeft toegang tot de controleroute: 100 verzoeken per minuut, zonder bankkaart.