Comment vérifier une entreprise française (SIREN/SIRET) par API en 2026

Un tutoriel pas à pas : contrôler un SIREN, chercher une entreprise française par SIREN, SIRET ou numéro de TVA, par nom, lire la source et gérer chaque erreur.

· Par l’équipe Fuentio · 5 min de lecture

Image de partage : « Comment vérifier une entreprise française (SIREN/SIRET) par API en 2026 » sur le fond papier de Fuentio, avec l’étiquette Tutoriel.

Vous avez le numéro d’une entreprise française, tiré d’un formulaire, d’une facture ou d’un contrat, et vous voulez savoir : existe-t-elle, quelle est sa dénomination, est-elle toujours active ? Ce tutoriel le fait avec l’API Fuentio, étape par étape, en cURL, Python et JavaScript, et montre quoi faire quand quelque chose se passe mal.

Ce que vous allez apprendre

  • Comment contrôler les chiffres d’un SIREN avant tout appel
  • Comment chercher une entreprise par SIREN, SIRET ou numéro de TVA
  • Comment chercher par nom quand vous n’avez pas de numéro
  • Comment lire la réponse, sa source et sa date
  • Comment gérer chaque erreur, et ce que coûte chaque appel

Étape 1 : obtenir une clé d’API

Créez une clé gratuite en une requête (100 unités par mois avec l’offre Free) :

curl -X POST https://api.fuentio.com/v1/keys

Gardez-la dans une variable d’environnement, jamais dans votre code :

export FUENTIO_API_KEY="la clé reçue"

Vous pouvez aussi faire quelques essais sans clé : l’essai sans clé permet 20 unités par jour et par adresse.

Étape 2 : contrôler le numéro avant l’appel

Une entreprise française est identifiée par son SIREN, à neuf chiffres. Selon l’INSEE, le neuvième chiffre est un chiffre de contrôle : la plupart des fautes de frappe se repèrent localement, gratuitement. Le contrôle suit l’algorithme de Luhn :

def siren_ok(siren: str) -> bool:
    chiffres = siren.replace(" ", "")
    if len(chiffres) != 9 or not chiffres.isdigit():
        return False
    total = 0
    for i, c in enumerate(reversed(chiffres)):
        n = int(c) * (2 if i % 2 else 1)
        total += n - 9 if n > 9 else n
    return total % 10 == 0

print(siren_ok("441639465"))  # Renault : True
print(siren_ok("441639465"[:-1] + "6"))  # dernier chiffre changé : False
function sirenOk(siren) {
  const d = siren.replace(/\s/g, "");
  if (!/^\d{9}$/.test(d)) return false;
  let total = 0;
  [...d].reverse().forEach((c, i) => {
    let n = Number(c) * (i % 2 ? 2 : 1);
    total += n > 9 ? n - 9 : n;
  });
  return total % 10 === 0;
}

Si vous sautez cette étape, l’API fait le même contrôle et vous le signale, gratuitement (voir l’étape 6).

Une recherche par SIREN, étape par étape : le numéro à neuf chiffres, le chiffre de contrôle (faux, il renvoie invalid_identifier, gratuitement), la recherche GET /v1/companies/FR/441639465 et la réponse avec la source, la licence et la date de vérification
D’un numéro à une réponse sourcée.

Étape 3 : chercher l’entreprise par son SIREN

Une requête, une unité :

curl https://api.fuentio.com/v1/companies/FR/441639465 -H "Authorization: Bearer $FUENTIO_API_KEY"

Avec Python (httpx) :

import os, httpx

r = httpx.get("https://api.fuentio.com/v1/companies/FR/441639465",
              headers={"Authorization": f"Bearer {os.environ['FUENTIO_API_KEY']}"})
corps = r.json()
entreprise = corps["data"]
print(entreprise["name"]["original"], entreprise["status"]["value"], entreprise["provenance"]["source"])

Avec JavaScript (fetch) :

const res = await fetch("https://api.fuentio.com/v1/companies/FR/441639465", {
  headers: { Authorization: `Bearer ${process.env.FUENTIO_API_KEY}` },
});
const { data, meta, error } = await res.json();
console.log(data.name.original, data.status.value, data.provenance.source);

Les espaces, points et tirets dans le numéro sont ignorés : 441 639 465 fonctionne aussi.

Étape 4 : lire la réponse

Chaque réponse a les trois mêmes parties : data, meta et error. Voici la réponse réelle pour Renault, abrégée :

{
  "data": {
    "id": "FR-SIREN-441639465",
    "identifiers": [
      {"scheme": "FR_SIREN", "value": "441639465", "primary": true},
      {"scheme": "FR_SIRET", "value": "44163946500091", "primary": false},
      {"scheme": "EU_VAT", "value": "FR63441639465", "primary": false}
    ],
    "name": {"original": "RENAULT"},
    "legal_form": {"original_code": "5510", "original_label": "SA nationale à conseil d'administration", "elf_code": "1NF1"},
    "status": {"value": "active", "original_label": "Active", "as_of": "2025-12-06"},
    "incorporation_date": "2002-04-01",
    "registered_address": {"street": "122 B AVENUE DU GENERAL LECLERC", "postal_code": "92100", "locality": "BOULOGNE-BILLANCOURT", "country": "FR"},
    "activity": {"original_code": "64.20Z", "nace_rev2": "64.20", "label_en": "Activities of holding companies"},
    "provenance": {
      "source": "fr_recherche_entreprises",
      "source_url": "https://recherche-entreprises.api.gouv.fr/search?q=441639465&per_page=1",
      "license": "Licence Ouverte / Etalab 2.0 (Annuaire des Entreprises, INSEE Sirene); officers: INPI RNE reuse licence",
      "last_verified_at": "2026-10-05T14:02:11Z",
      "source_updated_at": "2026-10-05",
      "coverage_level": "full"
    }
  },
  "meta": {"source": "fr_recherche_entreprises", "last_verified_at": "2026-10-05T14:02:11+00:00", "stale": false},
  "error": null
}

Les champs à lire en premier :

  • status.value (active, ou un état de fermeture) et status.original_label, le mot du registre. Une entreprise française fermée est « cessée », avec la date donnée par le registre.
  • name.original, la dénomination telle qu’enregistrée.
  • provenance : la source, son lien, sa licence et la date de vérification. Gardez-la avec votre fiche.
  • meta.stale : true signifie que la source officielle ne répondait pas et que vous recevez la dernière copie vérifiée, avec sa date. À vous de voir si cela suffit pour votre usage.

Étape 5 : chercher par SIRET, par numéro de TVA ou par nom

Un SIRET désigne un établissement ; l’API remonte à l’entreprise, puisque les informations juridiques appartiennent à l’entreprise :

curl https://api.fuentio.com/v1/companies/FR/44163946500091 -H "Authorization: Bearer $FUENTIO_API_KEY"
curl https://api.fuentio.com/v1/companies/FR/FR63441639465 -H "Authorization: Bearer $FUENTIO_API_KEY"

Sans numéro, cherchez par nom (deux unités). Filtrez par code postal, commune ou statut pour affiner, et parcourez les résultats (page_size jusqu’à 25) :

curl "https://api.fuentio.com/v1/companies/search?country=FR&q=renault&postal_code=92100" -H "Authorization: Bearer $FUENTIO_API_KEY"

Le meta de la recherche indique total, page, page_size et next_page. Quand plusieurs entreprises portent le même nom, montrez les candidates à une personne, ou demandez le SIREN : un nom est une étiquette, un numéro est une identité.

Étape 6 : gérer chaque erreur

Les erreurs utilisent la même enveloppe, avec un error.code tiré d’une liste fermée et un hint pour la suite. Celles que vous rencontrerez avec des numéros français :

  • invalid_identifier (400) : le numéro a le format d’un SIREN mais ses chiffres de contrôle sont faux, par exemple le SIREN de Renault avec son dernier chiffre changé. Gratuit.
  • not_found (404) : un numéro bien formé sans fiche publique. En France, l’entreprise a pu demander à ne pas être diffusée. Celle-ci coûte une unité, car c’est une vraie réponse.
  • rate_limited (429) : trop de requêtes par seconde pour votre offre. Attendez le nombre de secondes indiqué dans l’en-tête Retry-After.
  • quota_exceeded (402) : vos unités sont épuisées ; error.details indique votre limite et sa date de renouvellement.
  • upstream_unavailable (503, ou 504 si la requête dure plus de 30 secondes) : la source officielle ne répond pas et aucune copie antérieure n’est disponible. Réessayez plus tard.
corps = r.json()
if corps["error"]:
    print(corps["error"]["code"], "-", corps["error"]["hint"])

Sauf not_found sur un numéro bien formé, les erreurs ne coûtent rien.

Que coûte chaque étape ?

  • Recherche par SIREN, SIRET ou numéro de TVA : 1 unité.
  • Recherche par nom : 2 unités.
  • La liste de couverture : gratuite.

Les offres sont sur la page Tarifs, et ce que nous couvrons en France et en Espagne sur la page Couverture.

Pour comprendre les numéros français, lisez les registres d’entreprises français expliqués ; pour la place de cette vérification dans l’entrée en relation, lisez ce qu’est le KYB.

Questions fréquentes

Dois-je contrôler les chiffres moi-même ?

Non, l’API les contrôle et renvoie invalid_identifier gratuitement. Contrôler localement évite un aller-retour et repère les fautes dans vos propres formulaires.

Pourquoi un SIREN bien formé renvoie-t-il not_found ?

L’entreprise a pu demander à ne pas être diffusée : la source officielle ne la publie pas. C’est une vraie réponse, qui coûte donc une unité.

Peut-on chercher par SIRET ?

Oui. L’API remonte du SIRET à l’entreprise et renvoie sa fiche, avec le SIRET parmi ses identifiants.

La réponse est-elle à jour ?

Chaque fiche porte l’heure de notre vérification de la source (last_verified_at) et la date de mise à jour de la source elle-même (source_updated_at).

Sources

← Tous les articles · Flux RSS