Referencia de la API REST

La API de ENTIA,
con el contrato que de verdad se sirve.

Identidad empresarial europea verificada contra registros oficiales, por HTTP. Esta página documenta lo que responde el gateway: cabeceras reales, cuerpos de error medidos y, donde el contrato tiene una trampa, la trampa. Las herramientas de datos comparten contrato con el servidor MCP y no se duplican aquí.

Base
https://api.entia.systems
Autenticación
x-entia-key
Formato
JSON UTF-8
Residencia
UE sociedad en Estonia

01Primera llamada

Una respuesta real, sin registrarse, y cómo leerla.

Una llamada que funciona sin registrarse, para comprobar la conexión y ver la forma de la respuesta:

Sin credencialshell
curl -s 'https://api.entia.systems/api/v1/demo/lookup?q=A28015865'
Respuesta REAL medida el 2026-08-27json
{
  "found": true,
  "query": "A28015865",
  "entity": {
    "name": "TELEFONICA SA",
    "legal_id": "A28015865",
    "country_code": "ES",
    "sector": "tecnologia",
    "city": "MADRID"
  },
  "access_level": "trace_preview",
  "gated_fields": [
    "trust_score",
    "borme",
    "gleif",
    "signature",
    "full_dossier",
    "source_chain",
    "contact_depth",
    "economic_profile"
  ],
  "upgrade_url": "https://entia.systems/mcp-setup",
  "upgrade_teaser": {
    "field": "trust_score",
    "masked_value": "••• · SIGNAL",
    "unlocked_by_tier": "signal",
    "why": "Registry-corroborated trust composite (BORME / VIES / GLEIF)"
  },
  "checkout": {
    "tier": "signal",
    "price_eur_month": 29,
    "url": "https://api.entia.systems/api/v1/mcp/checkout?tier=signal",
    "method": "GET"
  },
  "source_signal": {
    "source": "VIES",
    "status": "valid",
    "claim": "EU VAT registered (European Commission VIES)"
  },
  "_meta": {
    "redacted_for_trace": true,
    "revenue_guard": "entity_lookup_full_data_requires_paid_tier"
  }
}
Cómo leer esta respuesta

Fíjate en gated_fields. La respuesta nombra lo que no te está dando en vez de omitirlo en silencio, y checkout trae la ruta exacta para abrirlo. Un agente puede decidir si le compensa pagar sin que nadie le explique nada.

Corolario para tu código: no leas trust_score sin comprobar antes access_level. Sin clave no viene, y ese es el fallo más común al integrar.

Con credencial

Autenticadashell
curl -s 'https://api.entia.systems/api/v1/v3/entity_lookup?query=A28015865' \
  -H "x-entia-key: $ENTIA_KEY"
El error que arrastraba esta página

La cabecera se llama x-entia-key. No es X-ENTIA-API-KEY: ese nombre aparecía en todos los ejemplos de la versión anterior de esta página y devolvía 401 en todos los casos.

02Las tres claves

Tres credenciales distintas viajan en la misma cabecera. No son intercambiables.

ENTIA emite tres tipos de credencial distintos que viajan en la misma cabecera, x-entia-key. Cubren superficies que no se solapan y una no sirve para la otra. Confundirlas es el error de integración más caro, porque el síntoma siempre es el mismo 401.

Suscripción MCPPrepago Profile StoreSecreto interno
Quién la emite/api/v1/mcp/register (TRACE) o el checkout de StripeAlta y recarga de saldo del Profile StoreNadie. Es un secreto único de la plataforma
Cómo se cobraCuota mensual por planSe debita saldo en euros por peticiónNo se cobra
Qué abre/api/v1/v3/*, /v1/profile/{query}, /v1/verify/vat/{vat_id}/api/v1/profile-store/…/v1/entity, /v1/entity/fast, /v1/search, /v1/enhance
¿Puedes tenerla?Sí, es la de clienteSí, es de clienteNo. Es interna
Cuatro endpoints que nunca fueron públicos

Los cuatro endpoints de la tercera columna —/v1/entity, /v1/entity/fast, /v1/search y /v1/enhance— aparecían documentados como endpoints de cliente. No lo son. Se comparan contra el secreto único de la plataforma, así que ninguna clave comprada por checkout los abre: un cliente de pago recibe 401 siempre, haga lo que haga. Se retiran de esta referencia.

Cómo conseguir una clave

Ciclo de vidashell
# 1 · Gratuita, nivel TRACE, sin tarjeta
curl -s -X POST https://api.entia.systems/api/v1/mcp/register \
  -H 'Content-Type: application/json' \
  -d '{"email":"tu@empresa.com"}'

# 2 · Plan de pago: 303 a Stripe Checkout
curl -sI 'https://api.entia.systems/api/v1/mcp/checkout?tier=signal'

# 3 · Comprobar qué plan tiene una clave
curl -s https://api.entia.systems/api/v1/mcp/key/validate -H "x-entia-key: $ENTIA_KEY"

Tras el pago, la clave se revela en /mcp-dashboard. Los planes SCALE y ENTERPRISE no tienen checkout público: se contratan por /api/v1/mcp/enterprise/contact o en fv@entia.systems.

Formas de mandarla

FamiliaFormas aceptadas
/api/v1/v3/*solo x-entia-key
/v1/profile, /v1/verify/vatx-entia-key, Authorization: Bearer o ?api_key=
/api/v1/profile-store/…solo x-entia-key (allowlist propia)
Mayúsculas en el nombre de la cabecera

Los nombres de cabecera HTTP no distinguen mayúsculas. Esta referencia escribe x-entia-key y los manifiestos del MCP escriben X-ENTIA-Key: es la misma cabecera y las dos formas funcionan.

X-ENTIA-API-KEY es otra cabecera distinta, no una variante de esta. La leen endpoints internos y se compara contra un secreto de plataforma: ninguna clave de cliente se acepta por ahí. Si tus llamadas devuelven 401 y estás usando ese nombre, ese es el motivo.

Sobre el parámetro de consulta

No mandes la clave en ?api_key= si puedes evitarlo: acaba en los registros de acceso de cualquier proxy intermedio. Se acepta por compatibilidad, no por recomendación.

03Endpoints

Qué hay, quién puede llamarlo y qué descuenta.

Estado y descubrimiento

RutaAccesoQué devuelveCuota
GET/healthsin claveEstado del gateway. Sonda de disponibilidad.no cuenta
GET/api/v1/statussin claveEstado agregado de la plataforma.no cuenta
GET/api/v1/stats/livesin claveTamaño del corpus: entidades, países, fuentes y actos BORME. Devuelve null en lo que no puede acreditar y lo declara en _unverified.no cuenta

Consulta sin credencial

RutaAccesoQué devuelveCuota
GET/api/v1/demo/lookup?q=sin claveResolución de entidad sin credencial. Devuelve identidad y declara qué retiene en gated_fields.no cuenta · 10/min por IP

Datos verificados · /api/v1/v3/*

Esta familia es la misma capacidad que sirve el MCP, con envoltorio HTTP en vez de JSON-RPC. Los parámetros, la semántica de cada campo, las trampas de cada respuesta y los ejemplos medidos están documentados una sola vez, en la referencia de herramientas MCP, para que las dos superficies no puedan contradecirse.

EndpointParámetrosTier mínimoEquivalente MCP
/api/v1/v3/entity_lookupquery, countryTRACE+entity_lookup
/api/v1/v3/search_entitiesq, country, city, sector, limitTRACE+search_entities
/api/v1/v3/verify_vatqueryTRACE+verify_vat
/api/v1/v3/get_showcase—TRACE+get_showcase
/api/v1/v3/zone_profilepostal_codeSIGNAL+zone_profile
/api/v1/v3/ai_ready_profilequerySIGNAL+solo REST — retirada del MCP público
/api/v1/v3/get_competitorssector, city, limitBUILD+get_competitors
/api/v1/v3/full_dossierqueryINTEGRATE+get_full_dossier
/api/v1/v3/professional_lookupqueryEnt. + DPAprofessional_lookup
Por qué hay un endpoint REST sin herramienta MCP

ai_ready_profile es el caso interesante: se retiró del MCP público el 17 de agosto porque sus arranques en frío agotaban el tiempo de espera, y el criterio de revisión de los directorios de conectores es que toda herramienta listada responda correctamente con parámetros válidos — una que falla puede tumbar la revisión del servidor entero, no solo la suya. Sigue viva aquí, en REST, desde SIGNAL. Retirada no es borrada.

Identidad · /v1/*

RutaAccesoQué devuelveCuota
GET/v1/profile/{query}clavePerfil de entidad por nombre, CIF o identificador. Acepta ?country= como pista.1 llamada
GET/v1/verify/vat/{vat_id}claveValidación de IVA europeo. Normaliza mayúsculas, espacios y guiones, auto-prefija ES a un CIF español sin prefijo y traduce GR a EL.1 llamada
Validación de IVAshell
curl -s https://api.entia.systems/v1/verify/vat/IE6388047V -H "x-entia-key: $ENTIA_KEY"

Devuelve valid, vat_id, country_code, name, address, source y _meta. Nombre y dirección dependen del país: Irlanda los divulga, España no —la administración española no publica esos campos por VIES—. Para el nombre legal español usa /api/v1/v3/entity_lookup, que lo resuelve contra el registro mercantil.

Planes y ciclo de la clave

RutaAccesoQué haceCuota
GET/api/v1/mcp/planssin claveCatálogo de planes con precio, cuota, overage y si es self-serve.no cuenta
POST/api/v1/mcp/registersin claveAlta self-serve de una clave TRACE contra un correo. Sin tarjeta.no cuenta
GET/api/v1/mcp/checkout?tier=sin claveRedirige (303) a una sesión de pago de Stripe. Tiers self-serve: edge, signal, build, integrate, operate.no cuenta
GET/api/v1/mcp/key/validateclaveComprueba una clave y devuelve su plan. Útil en el arranque de tu servicio.no cuenta
POST/api/v1/mcp/enterprise/contactsin claveContacto para SCALE y ENTERPRISE, que no tienen checkout público.no cuenta

Licencia, política y procedencia

RutaAccesoQué devuelveCuota
GET/api/v1/entitlement/policysin clavePolítica de acceso vigente y su modo de aplicación.no cuenta
GET/api/v1/entitlement/statussin claveSituación del llamante frente a esa política.no cuenta
POST/api/v1/entitlement/classifysin claveClasifica un acceso frente a la política.no cuenta
GET/api/v1/corpus/license/offersin claveOferta de licencia del corpus, legible por máquina. Sin precio público: el importe se fija por contacto.no cuenta
GET/api/v1/corpus/bulkclaveDescarga masiva. Exige licencia de corpus firmada, no un plan.por contrato
GET/api/v1/evidence/indexsin claveÍndice del manifiesto de evidencia, redactado.no cuenta
Consultar no es entrenar

El acceso por API y MCP es para consulta en tiempo de inferencia. La minería de textos y datos y el entrenamiento de modelos requieren licencia aparte: la oferta está en /api/v1/corpus/license/offer y la reserva de derechos en tdm-policy.json. No hay precio público; el importe se fija por contacto.

El corpus publicado · /v1/identity/…

Cada entidad del corpus tiene una dirección estable con dos caras. Es superficie abierta: no lleva credencial, y está pensada para que la lean crawlers y agentes.

Las dos caras de la misma fichahttp
/v1/identity/{pais}/{sector}/{ciudad}/{slug}          # ficha para personas
/v1/identity/{pais}/{sector}/{ciudad}/{slug}.jsonld   # gemelo para maquinas
El gemelo JSON-LDshell
curl -s https://entia.systems/v1/identity/es/dental/madrid/albus-dental-studio-dentista-en-mirasierra.jsonld

Devuelve 200 con content-type: application/ld+json y un @graph de Schema.org con cuatro nodos: la Organization de la entidad, la WebPage que la publica, el BreadcrumbList de su ruta y la Organization de ENTIA como editor. Los @id son estables y citables.

El estado 202

Una ficha puede existir como gemelo JSON-LD y todavía no como página. En ese caso la cara humana responde 202 con {"status":"pending","retry_after_seconds":3600} y la lista de perfiles disponibles. Medido el 2026-08-27 sobre esa misma entidad: .jsonld devolvió 200 y la página, 202.

Un 202 no es un error y no es un 404: significa que la entidad existe y su perfil se está preparando. Una ruta de identidad que no corresponde a ninguna entidad sí devuelve 404.

Cobertura

Diez países, 11.330.391 entidades y 40.345.410 actos del registro mercantil español indexados. Medición del 2026-08-27; el número vivo sale siempre de /api/v1/stats/live, no de esta página.

PaísEntidadesRegistro ancla
Francia5.329.485SIRENE · INSEE
Reino Unido2.378.286Companies House
España1.284.964BORME · AEAT
Suiza789.433registro mercantil cantonal
Chequia429.991registro mercantil
Noruega376.679Brønnøysund
Finlandia261.682PRH
Suecia221.624Bolagsverket
Estonia213.444registro empresarial
Irlanda44.803CRO

A nivel europeo se cruzan además VIES, de la Comisión Europea, y el identificador LEI de GLEIF.

Profile Store · prepago

Rutahttp
GET /api/v1/profile-store/{cc}/{sector}/{city}/{slug}/{profile}

Perfiles derivados de una ficha publicada, cobrados por petición contra saldo en euros, no contra la cuota de un plan. Usa una lista de claves propia: una credencial de suscripción MCP no vale aquí. Si el perfil pedido no está en el catálogo, devuelve 400 con la lista de los permitidos; si no hay saldo, 402.

04Errores

Cuerpos medidos, no transcritos de un diseño.

Los cuerpos de esta tabla están medidos, no transcritos de un diseño.

HTTPCuerpo realCuándo
400{"detail":"VAT ID too short"}Validación de parámetro. El mensaje nombra el problema concreto.
400{"detail":"unknown profile 'X'. allowed: [...]"}Valor fuera de un catálogo cerrado. Te devuelve el catálogo.
401{"detail":"x-entia-key header required"}Falta la cabecera en la familia /api/v1/v3/*.
401{"detail":"API key required. Pass x-entia-key header or Bearer token."}Falta la credencial en /v1/profile o /v1/verify/vat.
401{"detail":"Invalid or expired API key"}Clave inválida, caducada o bloqueada. El mensaje es genérico a propósito: distinguir los tres casos ayudaría a quien prueba claves por fuerza bruta.
401{"error":"key_required","message":"Pass the key in the x-entia-key header."}Sin clave en /api/v1/mcp/key/validate. Nota el cuerpo distinto: ver la advertencia de abajo.
402{"error":"...","required_tier":"...","checkout_url":"..."}Plan insuficiente, o saldo agotado en Profile Store. Trae la ruta de compra.
403{"error":"dpa_required", ...}professional_lookup sin acuerdo de encargo de tratamiento firmado.
429{"error":"Rate limit exceeded","tier":"demo"} + Retry-AfterDemasiadas peticiones por minuto, o cuota mensual agotada.
503{"busy":true,"error":"too_many_heavy_scans","retry_after":N} + Retry-AfterGuard de concurrencia lleno en una consulta pesada. Este sí es transitorio: respeta Retry-After y reintenta.
Dos formas de error conviviendo

El cuerpo del error no es uniforme en toda la API. La mayoría usa la forma {"detail": "..."} de FastAPI, y el ciclo de la clave usa {"error": "...", "message": "..."}. Si escribes un manejador genérico, contempla las dos: ramifica por el código HTTP, nunca por el texto del mensaje, que no es contrato y puede cambiar.

05Límites y caché

Cuánto puedes pedir, y qué señales NO vas a recibir.

SuperficieLímite por minuto
/api/v1/demo/lookup10
Auditoría de dominio5
Resto de la API60
Cómo se cuenta de verdad

El contador no es por IP, aunque lo parezca: vive en la memoria de cada proceso trabajador del gateway, y hay varios. En la práctica el techo efectivo es más alto que el nominal y no es determinista. No construyas tu control de flujo sobre ese número: constrúyelo sobre tu propia cuota.

Lo que NO vas a recibir

Sin cabeceras de cuota en REST

La API REST no emite cabeceras de cuota: ni X-RateLimit-*, ni RateLimit-* del RFC, ni ninguna variante propia. Existen X-ENTIA-Quota-State y X-ENTIA-Upgrade-Url, pero solo en la superficie JSON-RPC del MCP, no aquí.

Lo único que llega es Retry-After en 429 y en 503. Para saber cuánta cuota te queda hoy, consulta /api/v1/mcp/key/validate.

Cabeceras que sí devuelve

CabeceraPara qué sirve
x-entia-cacheSi la respuesta salió de caché.
x-entia-upstream-latency-msLatencia contra el origen de esa petición.
x-entia-serviceQué servicio la atendió.
x-entia-paywall · x-entia-billing-protocolSeñalización de cobro para agentes.
tdm-policy · tdm-reservationReserva de derechos de minería de textos y datos.
link rel=payment|pricing|licenseDescubrimiento de compra y licencia sin salir de la respuesta.

Caché

Las consultas de datos se sirven desde caché cuando pueden. La respuesta lo declara —en _meta.cache_status o en x-entia-cache— y, en los agregados, con _cached_at y _cache_ttl. Un latency_ms alto junto a un acierto de caché es la latencia del cálculo original, no la de tu llamada: mide en tu cliente si necesitas latencia de servicio.

06Versionado

Qué rompe, qué no, y dos cosas que no existen aunque se documentaran.

No se sirve especificación OpenAPI

https://api.entia.systems/openapi.json y https://api.entia.systems/docs devuelven 404, y es deliberado: la especificación que genera el framework describe también la superficie interna —panel de control, cron, administración de facturación—, y publicarla sería publicar un mapa de lo que no es de nadie. La decisión se tomó el 30 de junio de 2026.

Mientras no exista una especificación curada que contenga solo lo público, el contrato legible por máquina es el del MCP: tools/list en https://mcp.entia.systems/mcp devuelve el esquema de entrada y de salida de cada capacidad, y es la misma capacidad que sirve /api/v1/v3/*.

No hay webhooks salientes

Se retira una sección entera

ENTIA no emite webhooks. No hay eventos de suscripción, ni firma de entrega, ni superficie donde registrar una URL. La versión anterior de esta página documentaba tres eventos, un esquema de firma y un panel donde configurarlo: nada de eso existe ni ha existido. Si tu arquitectura necesita notificación por evento, escríbenos antes de diseñar sobre ello.

Qué se considera un cambio que rompe

Cambio¿Rompe?
Añadir un endpointNo
Añadir un campo a una respuestaNo. Ignora los campos que no conozcas.
Añadir un parámetro opcionalNo
Quitar o renombrar un campoSí
Cambiar un código HTTP de errorSí
Cambiar el tier mínimo de un endpointSí para quien esté por debajo
Cambiar el texto de un mensaje de errorNo. El texto no es contrato: ramifica por código

El prefijo de versión (/v1/, /api/v1/v3/) cambia solo ante una ruptura de contrato. Una retirada se anuncia con su alternativa antes de ejecutarse.

07Procedencia y límites

De dónde sale cada dato y qué es exactamente lo que ENTIA no afirma.

De dónde sale el dato

Registros públicos oficiales: boletín mercantil y agencia tributaria en España, Companies House en Reino Unido, SIRENE en Francia, registro empresarial estonio, Brønnøysund en Noruega, y a nivel europeo el sistema VIES de la Comisión y el identificador LEI. Las respuestas nombran su fuente.

Un dato que no se puede acreditar no se sirve

Cuando un valor no es defendible, el contrato devuelve null y lo declara, en vez de entregar un número presentable. /api/v1/stats/live devuelve null en homes_published y en jsonld_generated, y los lista en _unverified. En los perfiles territoriales, un valor fuera de rango llega con value: null, comparable: false, un warning que nombra el motivo y el valor crudo que lo provocó.

Por qué importa

Es la diferencia entre una API que te da una cifra y una que te da una cifra defendible. Si tu integración prefiere un número redondo a un nulo declarado, esta no es la API que buscas.

Lo que ENTIA no afirma

Sellos y firmas

Algunas respuestas incluyen un sello de integridad calculado sobre el cuerpo. Es un código de autenticación simétrico, con un secreto que solo tiene ENTIA: detecta que una respuesta emitida por ENTIA ha sido modificada, y solo ENTIA puede verificarlo. No prueba el origen frente a un tercero, no es una firma electrónica, no es un sello electrónico y no es un sello de tiempo. PrecisionAI Marketing OU no es prestador cualificado de servicios de confianza y no figura en ninguna lista de confianza de la Unión Europea. Nada de lo que devuelve esta API constituye por sí mismo prueba oponible frente a terceros.

Datos personales

La API trata personas jurídicas. La única excepción es /api/v1/v3/professional_lookup, que verifica colegiación de personas físicas: exige tier Enterprise y acuerdo de encargo de tratamiento firmado, y su respuesta va minimizada por diseño —se eliminan nombre y apellidos antes de responder—.

Responsable

PrecisionAI Marketing OÜ, Sepapaja tn 4, 11415 Tallin, Estonia. Código de registro mercantil 17048063. Infraestructura en la Unión Europea. Condiciones en /legal/en/api-terms.

La misma capacidad, dos superficies.

Si integras un agente, el servidor MCP te da los esquemas y la negociación de capacidades gratis. Si integras un servicio, esta API te da el control del transporte.

Contratos verificados contra api_gateway.py, core/mcp/tools_rest_api.py, core/rest_api.py y core/mcp/plans.py. Respuestas y cuerpos de error medidos contra producción el 2026-08-27.
Las herramientas de datos comparten contrato con el MCP y se documentan una sola vez, en /mcp-docs, para que las dos superficies no puedan contradecirse.