Jsonpage · API SIREN et SIRET

API pour vérifier le SIREN et la TVA de vos factures électroniques

Une facture électronique porte le SIREN du client et, selon les cas, le SIRET et le numéro de TVA des deux parties. Un numéro faux ou une entreprise fermée se découvrent trop tard, au rejet de la facture.

01 / ENJEU

Pourquoi contrôler les numéros avant la facture

Cette page montre comment contrôler ces numéros avec un appel d'API avant d'émettre une facture ou de comptabiliser celle d'un fournisseur, avec des exemples en curl, JavaScript, Python, PHP et Ruby.

La facturation électronique se met en place en France par étapes : toutes les entreprises doivent pouvoir recevoir des factures électroniques depuis septembre 2026, et l'émission s'étend aux PME et aux micro-entreprises à partir de septembre 2027. Le calendrier officiel est détaillé sur impots.gouv.fr. Le SIREN du client devient une mention de la facture : voir ce que change la facture électronique pour le SIREN et la liste des mentions obligatoires.

Deux moments se prêtent à un contrôle automatique. À l'émission, vous vérifiez l'acheteur : son numéro existe, l'entreprise est active, le SIRET et la TVA désignent la même entreprise. À la réception, vous vérifiez le vendeur avant de comptabiliser et de payer, ce qui limite aussi le risque de fausse facture.

Ce que l'API contrôleLes numéros d'identification et l'entreprise qu'ils désignent. Elle ne contrôle pas la facture elle-même : son format de fichier et son contenu relèvent de votre logiciel de facturation ou de votre plateforme.
02 / APPEL

Un appel pour le SIRET et la TVA

La route GET /v2/validate accepte un identifiant global, un SIRET, un numéro de TVA, ou plusieurs à la fois. Chaque contrôle revient avec son résultat, et valid n'est vrai que si tous les contrôles passent. La clé API se place dans l'en-tête X-API-Key.

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

Réponse (extrait) :

{
  "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" }
  }
}

Les espaces, points et tirets sont ignorés dans le SIRET et la TVA, ce qui évite de nettoyer la saisie avant l'appel. La TVA de tous les pays de l'Union européenne est acceptée, pas seulement la TVA française.

03 / RÉSULTAT

Lire le résultat et décider

Ne vous arrêtez pas à valid : la liste checks dit quel contrôle a échoué, et donc quoi demander à votre interlocuteur.

RésultatCe que cela veut direQue faire avant la facture
valid: trueTous les contrôles sont passés.Poursuivre : émettre ou comptabiliser la facture.
siret_key ou vat_format en échecLe numéro est mal saisi : faute de frappe ou clé fausse.Corriger le numéro à la source, puis relancer le contrôle.
company_active en échecLe numéro existe, mais l'entreprise ou l'établissement est fermé.Demander au client ou au fournisseur un numéro à jour avant de continuer.
identifiers_match en échecLe SIRET et le numéro de TVA ne désignent pas la même entreprise.Faire confirmer le bon couple de numéros.
vat unverifiableLe service du pays n'a pas répondu : le numéro n'est pas déclaré faux.Réessayer plus tard ; ne pas le traiter comme invalide.

Pour un lot de numéros, par exemple tout un fichier clients avant la première campagne de facturation, la page Fichier clients fait le contrôle sans programmation, et la méthode pour nettoyer un fichier clients détaille les étapes.

04 / CODE

Exemples de code

Le même contrôle dans quatre langages, à brancher sur votre logiciel de facturation ou votre ERP. La clé est lue dans une variable d'environnement : ne la placez jamais dans une page ou une application distribuée aux utilisateurs.

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

Ce que l'API ne fait pas

L'API vérifie des numéros et l'entreprise qu'ils désignent. Elle ne valide pas le fichier de facture (sa structure, ses champs, sa conformité au format exigé), ne transmet pas la facture à une plateforme et ne remplace pas l'avis de votre expert-comptable. Un numéro de TVA « non vérifiable pour le moment » n'est pas un numéro faux : réessayez plus tard.

Côté volume, les routes sont limitées par minute ; au-delà, la réponse est 429 avec un en-tête Retry-After : attendez ce délai avant de relancer. Pour un lot important, la route de fiches en lot (100 entreprises par appel) réduit le nombre d'appels. Voir la documentation.

06 / QUESTIONS FRÉQUENTES

Questions fréquentes

Faut-il vérifier le SIREN avant chaque facture ?+

Au minimum à la création du client ou du fournisseur, puis quand une facture est rejetée ou qu'un paiement change. Un contrôle à l'émission évite d'envoyer une facture à une entreprise fermée ou à un numéro faux.

L'API valide-t-elle ma facture électronique ?+

Non. Elle contrôle les numéros d'identification (SIREN, SIRET, TVA) et l'entreprise qu'ils désignent. Le format et le contenu du fichier de facture dépendent de votre logiciel ou de votre plateforme.

Peut-on vérifier la TVA d'un fournisseur étranger ?+

Oui. La route de contrôle accepte les numéros de TVA des pays de l'Union européenne. Si le service du pays ne répond pas, le résultat est « non vérifiable », ce qui n'équivaut pas à un numéro invalide.

Faut-il un compte payant ?+

Non, le compte gratuit donne accès à toutes les routes, avec 100 requêtes par minute et 1 000 requêtes par jour. Les forfaits payants lèvent le plafond quotidien.

Que faire si le SIRET et la TVA ne correspondent pas ?+

Demandez à votre interlocuteur de confirmer le couple de numéros avant de facturer. La liste des contrôles indique si le SIRET existe, s'il est actif et s'il désigne la même entreprise que la TVA.

07 / RESSOURCES LIÉES

Pour aller plus loin

API

Testez sur vos propres numéros

Le compte gratuit donne accès à la route de contrôle : 100 requêtes par minute, sans carte bancaire.