Cómo verificar una empresa francesa (SIREN/SIRET) por API en 2026

Un tutorial paso a paso: comprobar un SIREN, consultar una empresa francesa por SIREN, SIRET o IVA, buscar por nombre, leer la fuente y gestionar cada error.

· Por el equipo de Fuentio · 5 min de lectura

Imagen para compartir: «Cómo verificar una empresa francesa (SIREN/SIRET) por API en 2026» sobre el fondo de papel de Fuentio, con la etiqueta Tutorial.

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).

Una consulta por SIREN, paso a paso: el número de nueve cifras, el dígito de control (si es erróneo devuelve invalid_identifier y es gratis), la consulta GET /v1/companies/FR/441639465 y la respuesta con fuente, licencia y fecha de comprobación
De un número a una respuesta con fuente.

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) y status.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: true significa 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 cabecera Retry-After.
  • quota_exceeded (402): has gastado tus unidades; error.details indica 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.

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

← Todos los artículos · Canal RSS