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í.
x-entia-key01Primera 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:
curl -s 'https://api.entia.systems/api/v1/demo/lookup?q=A28015865'
{
"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"
}
}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
curl -s 'https://api.entia.systems/api/v1/v3/entity_lookup?query=A28015865' \ -H "x-entia-key: $ENTIA_KEY"
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 MCP | Prepago Profile Store | Secreto interno | |
|---|---|---|---|
| Quién la emite | /api/v1/mcp/register (TRACE) o el checkout de Stripe | Alta y recarga de saldo del Profile Store | Nadie. Es un secreto único de la plataforma |
| Cómo se cobra | Cuota mensual por plan | Se debita saldo en euros por petición | No 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 cliente | Sí, es de cliente | No. Es interna |
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
# 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
| Familia | Formas aceptadas |
|---|---|
/api/v1/v3/* | solo x-entia-key |
/v1/profile, /v1/verify/vat | x-entia-key, Authorization: Bearer o ?api_key= |
/api/v1/profile-store/… | solo x-entia-key (allowlist propia) |
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.
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
| Ruta | Acceso | Qué devuelve | Cuota | |
|---|---|---|---|---|
| GET | /health | sin clave | Estado del gateway. Sonda de disponibilidad. | no cuenta |
| GET | /api/v1/status | sin clave | Estado agregado de la plataforma. | no cuenta |
| GET | /api/v1/stats/live | sin clave | Tamañ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
| Ruta | Acceso | Qué devuelve | Cuota | |
|---|---|---|---|---|
| GET | /api/v1/demo/lookup?q= | sin clave | Resolució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.
| Endpoint | Parámetros | Tier mínimo | Equivalente MCP |
|---|---|---|---|
/api/v1/v3/entity_lookup | query, country | TRACE+ | entity_lookup |
/api/v1/v3/search_entities | q, country, city, sector, limit | TRACE+ | search_entities |
/api/v1/v3/verify_vat | query | TRACE+ | verify_vat |
/api/v1/v3/get_showcase | — | TRACE+ | get_showcase |
/api/v1/v3/zone_profile | postal_code | SIGNAL+ | zone_profile |
/api/v1/v3/ai_ready_profile | query | SIGNAL+ | solo REST — retirada del MCP público |
/api/v1/v3/get_competitors | sector, city, limit | BUILD+ | get_competitors |
/api/v1/v3/full_dossier | query | INTEGRATE+ | get_full_dossier |
/api/v1/v3/professional_lookup | query | Ent. + DPA | professional_lookup |
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/*
| Ruta | Acceso | Qué devuelve | Cuota | |
|---|---|---|---|---|
| GET | /v1/profile/{query} | clave | Perfil de entidad por nombre, CIF o identificador. Acepta ?country= como pista. | 1 llamada |
| GET | /v1/verify/vat/{vat_id} | clave | Validació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 |
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
| Ruta | Acceso | Qué hace | Cuota | |
|---|---|---|---|---|
| GET | /api/v1/mcp/plans | sin clave | Catálogo de planes con precio, cuota, overage y si es self-serve. | no cuenta |
| POST | /api/v1/mcp/register | sin clave | Alta self-serve de una clave TRACE contra un correo. Sin tarjeta. | no cuenta |
| GET | /api/v1/mcp/checkout?tier= | sin clave | Redirige (303) a una sesión de pago de Stripe. Tiers self-serve: edge, signal, build, integrate, operate. | no cuenta |
| GET | /api/v1/mcp/key/validate | clave | Comprueba una clave y devuelve su plan. Útil en el arranque de tu servicio. | no cuenta |
| POST | /api/v1/mcp/enterprise/contact | sin clave | Contacto para SCALE y ENTERPRISE, que no tienen checkout público. | no cuenta |
Licencia, política y procedencia
| Ruta | Acceso | Qué devuelve | Cuota | |
|---|---|---|---|---|
| GET | /api/v1/entitlement/policy | sin clave | Política de acceso vigente y su modo de aplicación. | no cuenta |
| GET | /api/v1/entitlement/status | sin clave | Situación del llamante frente a esa política. | no cuenta |
| POST | /api/v1/entitlement/classify | sin clave | Clasifica un acceso frente a la política. | no cuenta |
| GET | /api/v1/corpus/license/offer | sin clave | Oferta de licencia del corpus, legible por máquina. Sin precio público: el importe se fija por contacto. | no cuenta |
| GET | /api/v1/corpus/bulk | clave | Descarga masiva. Exige licencia de corpus firmada, no un plan. | por contrato |
| GET | /api/v1/evidence/index | sin clave | Índice del manifiesto de evidencia, redactado. | no cuenta |
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.
/v1/identity/{pais}/{sector}/{ciudad}/{slug} # ficha para personas
/v1/identity/{pais}/{sector}/{ciudad}/{slug}.jsonld # gemelo para maquinascurl -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.
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ís | Entidades | Registro ancla |
|---|---|---|
| Francia | 5.329.485 | SIRENE · INSEE |
| Reino Unido | 2.378.286 | Companies House |
| España | 1.284.964 | BORME · AEAT |
| Suiza | 789.433 | registro mercantil cantonal |
| Chequia | 429.991 | registro mercantil |
| Noruega | 376.679 | Brønnøysund |
| Finlandia | 261.682 | PRH |
| Suecia | 221.624 | Bolagsverket |
| Estonia | 213.444 | registro empresarial |
| Irlanda | 44.803 | CRO |
A nivel europeo se cruzan además VIES, de la Comisión Europea, y el identificador LEI de GLEIF.
Profile Store · prepago
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.
| HTTP | Cuerpo real | Cuá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-After | Demasiadas peticiones por minuto, o cuota mensual agotada. |
| 503 | {"busy":true,"error":"too_many_heavy_scans","retry_after":N} + Retry-After | Guard de concurrencia lleno en una consulta pesada. Este sí es transitorio: respeta Retry-After y reintenta. |
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.
| Superficie | Límite por minuto |
|---|---|
/api/v1/demo/lookup | 10 |
| Auditoría de dominio | 5 |
| Resto de la API | 60 |
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
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
| Cabecera | Para qué sirve |
|---|---|
x-entia-cache | Si la respuesta salió de caché. |
x-entia-upstream-latency-ms | Latencia contra el origen de esa petición. |
x-entia-service | Qué servicio la atendió. |
x-entia-paywall · x-entia-billing-protocol | Señalización de cobro para agentes. |
tdm-policy · tdm-reservation | Reserva de derechos de minería de textos y datos. |
link rel=payment|pricing|license | Descubrimiento 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
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 endpoint | No |
| Añadir un campo a una respuesta | No. Ignora los campos que no conozcas. |
| Añadir un parámetro opcional | No |
| Quitar o renombrar un campo | Sí |
| Cambiar un código HTTP de error | Sí |
| Cambiar el tier mínimo de un endpoint | Sí para quien esté por debajo |
| Cambiar el texto de un mensaje de error | No. 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ó.
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
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.