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).
É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) etstatus.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:truesignifie 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êteRetry-After.quota_exceeded(402) : vos unités sont épuisées ;error.detailsindique 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.
Limites. La source française ne contient ni procédures collectives ni capital social. Les entreprises qui ont demandé à ne pas être diffusées n’y figurent pas. Aucun nom de personne n’est servi : dirigeants, associés et entrepreneurs individuels sont absents de toutes les réponses. Aucune recherche par nom de personne n’est possible. La vérification indique ce qu’enregistre le registre ; la décision que vous en tirez reste la vôtre.
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
- INSEE, définition du numéro SIREN : insee.fr
- INSEE, définition du numéro SIRET : insee.fr
- Annuaire des Entreprises : annuaire-entreprises.data.gouv.fr
- Licence Ouverte / Etalab 2.0 : data.gouv.fr
