Tienes el número de una empresa francesa, de un formulario, una factura o un contrato, y quieres saber: ¿existe?, ¿cuál es su denominación?, ¿sigue activa? Este tutorial lo hace con la API de Fuentio, paso a paso, con cURL, Python y JavaScript, y muestra qué hacer cuando algo sale mal.
Lo que vas a aprender
- Cómo comprobar los dígitos de un SIREN antes de llamar a nada
- Cómo consultar una empresa por SIREN, SIRET o número de IVA
- Cómo buscar por nombre cuando no tienes número
- Cómo leer la respuesta, su fuente y su fecha
- Cómo gestionar cada error, y cuánto cuesta cada llamada
Paso 1: consigue una clave de API
Crea una clave gratuita con una petición (100 unidades al mes en el plan Free):
curl -X POST https://api.fuentio.com/v1/keys
Guárdala en una variable de entorno, nunca en tu código:
export FUENTIO_API_KEY="la clave que recibiste"
También puedes hacer algunas pruebas sin clave: la prueba sin clave permite 20 unidades al día por dirección.
Paso 2: comprueba el número antes de llamar
Una empresa francesa se identifica por su SIREN, de nueve cifras. Según el INSEE, la novena es un dígito de control, así que la mayoría de las erratas se detectan en local, gratis. La comprobación sigue el algoritmo de Luhn:
def siren_ok(siren: str) -> bool:
cifras = siren.replace(" ", "")
if len(cifras) != 9 or not cifras.isdigit():
return False
total = 0
for i, c in enumerate(reversed(cifras)):
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")) # última cifra cambiada: 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 te saltas este paso, la API hace la misma comprobación y te lo indica, gratis (ver el paso 6).
Paso 3: consulta la empresa por su SIREN
Una petición, una unidad:
curl https://api.fuentio.com/v1/companies/FR/441639465 -H "Authorization: Bearer $FUENTIO_API_KEY"
Con 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']}"})
cuerpo = r.json()
empresa = cuerpo["data"]
print(empresa["name"]["original"], empresa["status"]["value"], empresa["provenance"]["source"])
Con 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);
Los espacios, puntos y guiones del número se ignoran: 441 639 465 también funciona.
Paso 4: lee la respuesta
Cada respuesta tiene las mismas tres partes: data, meta y error. Esta es la respuesta real para Renault, abreviada:
{
"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
}
Los campos que conviene leer primero:
status.value(active, o un estado de cierre) ystatus.original_label, la palabra del registro. Una empresa francesa cerrada figura como «cesada», con la fecha que da el registro.name.original, la denominación tal como está registrada.provenance: la fuente, su enlace, su licencia y cuándo se comprobó. Guárdala con tu ficha.meta.stale:truesignifica que la fuente oficial no respondía y recibes la última copia comprobada, con su fecha. Decide si te basta para tu caso.
Paso 5: consulta por SIRET o IVA, o busca por nombre
Un SIRET identifica un establecimiento; la API lo resuelve a la empresa, porque los datos jurídicos pertenecen a la empresa:
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"
Sin número, busca por nombre (dos unidades). Filtra por código postal, municipio o estado para acotar, y recorre los resultados (page_size hasta 25):
curl "https://api.fuentio.com/v1/companies/search?country=FR&q=renault&postal_code=92100" -H "Authorization: Bearer $FUENTIO_API_KEY"
El meta de la búsqueda indica total, page, page_size y next_page. Cuando varias empresas comparten nombre, enseña las candidatas a una persona, o pide el SIREN: un nombre es una etiqueta; un número, una identidad.
Paso 6: gestiona cada error
Los errores usan el mismo sobre, con un error.code de una lista cerrada y un hint con el siguiente paso. Los que verás con números franceses:
invalid_identifier(400): el número tiene el formato de un SIREN pero sus dígitos de control son erróneos, por ejemplo el SIREN de Renault con la última cifra cambiada. Gratis.not_found(404): un número bien formado sin ficha pública. En Francia, la empresa puede haber pedido no difundirse. Este cuesta una unidad, porque es una respuesta real.rate_limited(429): demasiadas peticiones por segundo para tu plan. Espera los segundos que indica la cabeceraRetry-After.quota_exceeded(402): has gastado tus unidades;error.detailsindica tu límite y cuándo se renueva.upstream_unavailable(503, o 504 si la petición dura más de 30 segundos): la fuente oficial no responde y no hay una copia anterior que servir. Vuelve a intentarlo más tarde.
cuerpo = r.json()
if cuerpo["error"]:
print(cuerpo["error"]["code"], "-", cuerpo["error"]["hint"])
Salvo not_found con un número bien formado, los errores no cuestan nada.
¿Cuánto cuesta cada paso?
- Consulta por SIREN, SIRET o número de IVA: 1 unidad.
- Búsqueda por nombre: 2 unidades.
- La lista de cobertura: gratis.
Los planes están en la página de precios, y lo que cubrimos en Francia y España, en la página de cobertura.
Para entender cómo se cuenta todo esto en un alta de clientes empresa, lee qué es el KYB; para la parte española, lee el BORME explicado.
Límites. La fuente francesa no incluye procedimientos de insolvencia ni capital social. Las empresas que pidieron no difundirse no están. No se sirve ningún nombre de persona: administradores, socios y empresarios individuales quedan fuera de todas las respuestas. No se puede buscar por el nombre de una persona. La consulta dice lo que inscribe el registro; la decisión que tomes con ella sigue siendo tuya.
Preguntas frecuentes
¿Tengo que comprobar los dígitos yo mismo?
No, la API los comprueba y devuelve invalid_identifier gratis. Comprobarlos en local ahorra una petición y detecta erratas en tus propios formularios.
¿Por qué un SIREN bien formado devuelve not_found?
La empresa puede haber pedido no difundirse, así que la fuente oficial no la publica. Es una respuesta real, por eso cuesta una unidad.
¿Se puede consultar por SIRET?
Sí. La API resuelve el SIRET a su empresa y devuelve la ficha de la empresa, con el SIRET entre sus identificadores.
¿Está actualizada la respuesta?
Cada ficha lleva la hora en que comprobamos la fuente (last_verified_at) y la fecha de actualización de la propia fuente (source_updated_at).
Fuentes
- INSEE, definición del número SIREN: insee.fr
- INSEE, definición del número SIRET: insee.fr
- Annuaire des Entreprises: annuaire-entreprises.data.gouv.fr
- Licence Ouverte / Etalab 2.0: data.gouv.fr
