La API REST de Entity Enricher le permite enriquecer entidades, gestionar esquemas y recuperar registros de forma programática. Todas las respuestas son JSON. El progreso en tiempo real utiliza Server-Sent Events (SSE).
Integre Entity Enricher en tres pasos:
GET /api/schema/savedListar esquemas guardados o generar uno a partir de datos de muestra
POST /api/single/enrich/streamInicie el enriquecimiento y obtenga un ID de trabajo para la transmisión SSE
GET /api/records/{id}Recupera el record de enrichment completo con la salida estructurada
Todos los endpoints de la API (excepto login/register) requieren autenticación. Use la cabecera X-API-Key con una clave de acceso de la organización:
curl -H "X-API-Key: ent_your_key_here" \
https://your-instance.example.com/api/enrichment/optionsCree claves de API desde la página Claves de API o mediante POST /api/auth/api-keys. Consulte la guía de claves de API para más detalles sobre los tipos de claves y los permisos.
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/enrichment/options | Modelos, idiomas y estrategias disponibles |
| POST | /api/single/enrich/stream | Inicie el enriquecimiento de una sola entidad (devuelve job_id para SSE) |
| POST | /api/single/enrich/sync | Enriquecimiento único bloqueante para clientes sin SSE (Make.com, curl) |
| POST | /api/enrichment/batch/start | Inicie el enriquecimiento por lotes de varias entidades |
| POST | /api/enrichment/batch/fetch | Obtener entidades desde una URL externa |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/llm/stream/{job_id} | Flujo SSE para cualquier trabajo de LLM (enriquecimiento, esquema, fusión) |
| POST | /api/llm/cancel/{job_id} | Cancelar un trabajo en ejecución o en pausa |
| POST | /api/llm/continue/{job_id} | Reanudar un trabajo en pausa (p. ej., tras una discrepancia de classification) |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/schema/saved | Listar todos los esquemas guardados |
| POST | /api/schema/saved | Crear un nuevo esquema |
| POST | /api/schema/generate/stream | Generar esquema a partir de datos de muestra (SSE) |
| POST | /api/schema/saved/{id}/prompt/stream | Edición de esquemas con IA mediante lenguaje natural (SSE) |
| POST | /api/schema/analyze-sample | Analiza el JSON de muestra en busca de nombres de propiedad ambiguos —los que admiten varias lecturas en el contexto de su elemento padre, o ninguna— y de elementos relacionados que mezclan datos de la entidad con datos específicos de cada padre (informe sin estado, cambios de nombre sugeridos) |
| POST | /api/schema/saved/{id}/analyze | Ejecute las verificaciones de ambigüedad y de alcance de identidad en un esquema guardado y escriba sus anotaciones (una descripción reescrita por cada nombre ambiguo) |
| POST | /api/schema/scoping-split | Aplica una división de delimitación de identidad a un conjunto de muestras: los datos propios de la entidad relacionada pasan a su propio subobjeto (determinista, gratuita, no se guarda nada) |
| DELETE | /api/schema/saved/{id}/enrichment-data | Purgar los datos de enriquecimiento de un esquema (registros y estado de la entidad), conservando el esquema (propietario+) |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/records | Listar registros con paginación y filtrado |
| GET | /api/records/{id} | Obtenga el detalle completo del registro con salida estructurada |
| POST | /api/records/batch-delete | Eliminar varios registros (máx. 100) |
| POST | /api/fusion/merge | Fusionar resultados de varios modelos |
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/attachments | Suba uno o más archivos (multipart/form-data) |
| POST | /api/attachments/base64 | Suba un archivo mediante JSON base64 (para clientes que no admiten multipart) |
| GET | /api/attachments/{id}/download | Descargar los bytes del archivo original |
| DELETE | /api/attachments/{id} | Eliminar un adjunto (limpieza posterior al enriquecimiento) |
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/schema/saved/{id}/publish | Publique la copia de trabajo de un esquema vinculado como el contrato con el que se ejecutan el enriquecimiento y sus bases de datos. Ningún cambio estructural surte efecto hasta que esto se ejecute |
| POST | /api/schema/sample/generate/stream | Genera 1..N objetos JSON de muestra de un mismo tipo de entidad (devuelve job_id para SSE) |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/databases | Enumera las bases de datos registradas de la organización, con los recuentos de deltas pendientes |
| POST | /api/databases | Registrar una base de datos en un esquema |
| GET | /api/databases/{id}/snapshot | Descargue el estado completo como una instantánea .sql: arranque desde cero |
| GET | /api/databases/{id}/changes | Obtener la siguiente ventana FIFO de deltas; reclamarlos para reservarlos con entrega confirmada |
| POST | /api/databases/{id}/ack | Confirma los deltas aplicados hasta un id: libera la concesión |
| POST | /api/databases/{id}/clear-acked | Purgar los deltas entregados y confirmados |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/semantic-concepts | Explore el vocabulario de conceptos, filtrado por tipo y puntuado frente a un concepto de referencia |
| GET | /api/semantic-concepts/types | Enumera los tipos de concepto con sus recuentos y modelos de embedding |
| POST | /api/semantic-concepts/probe | Simule la escalera de resolución para un texto: con qué coincidiría y con qué grado de proximidad |
| GET | /api/semantic-concepts/duplicates | Pares de conceptos justo por debajo del umbral de fusión |
| POST | /api/semantic-concepts/import | Resuelve por lotes un CSV de textos de identidad (la creación requiere rol de propietario) |
| GET | /api/semantic-concepts/export | Exportar el vocabulario como CSV |
| POST | /api/semantic-concepts/delete-impact | Qué afectaría la eliminación de conceptos: recuentos de uso y coste de resincronización |
| GET | /api/semantic-concepts/migration/status | Estado de la migración del modelo de embeddings, si hay alguna en curso |
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/benchmarks | Enumerar los escenarios de benchmark |
| POST | /api/benchmarks/{id}/run | Ejecute un escenario en varios modelos — cada resultado se puntúa automáticamente |
| POST | /api/benchmarks/{id}/reference | Guarde y verifique la referencia de oro con la que se puntúa un escenario |
| GET | /api/billing/balance | Saldo de créditos actual |
| GET | /api/billing/transactions | Historial de transacciones de créditos, incluido el gasto en embeddings |
| GET | /api/billing/plans | Planes disponibles y sus límites |
Las operaciones de enriquecimiento, generación de esquemas y fusión utilizan Server-Sent Events para el progreso en tiempo real. Inicie un trabajo, obtenga un job_id y, a continuación, conéctese al flujo SSE:
| Evento | Descripción |
|---|---|
| model_started | Comienza el procesamiento del modelo |
| expertise_completed | Un dominio de especialización finalizado (con resultados parciales) |
| model_completed | El modelo finalizó con result, record_id y coste |
| fusion_started / fusion_completed | Eventos del ciclo de vida de la fusión multimodelo |
| entity_started / entity_completed | Eventos por entidad específicos del lote (incluyen entity_index) |
| completed | Evento terminal: cierra la conexión |
| error | Se produjo un error a nivel del trabajo |
Un flujo de trabajo completo que enumera esquemas, inicia el enriquecimiento, transmite resultados y recupera el registro final:
import httpx
import json
BASE = "https://your-instance.example.com"
KEY = "ent_your_api_key"
HEADERS = {"X-API-Key": KEY, "Content-Type": "application/json"}
# 1. List saved schemas
schemas = httpx.get(f"{BASE}/api/schema/saved", headers=HEADERS).json()
schema_id = schemas["schemas"][0]["id"]
# 2. Start enrichment
resp = httpx.post(f"{BASE}/api/single/enrich/stream", headers=HEADERS, json={
"entity_data": {"name": "Moderna Inc", "country": "US"},
"schema_id": schema_id,
"models": ["anthropic::claude-sonnet-4-5-20250514"],
"strategy": "multi_expertise",
})
job_id = resp.json()["job_id"]
# 3. Stream SSE events
record_id = None
with httpx.stream("GET", f"{BASE}/api/llm/stream/{job_id}", headers=HEADERS) as stream:
for line in stream.iter_lines():
if not line.startswith("data: "):
continue
event = json.loads(line[6:])
if event["type"] == "model_completed" and event.get("record_id"):
record_id = event["record_id"]
elif event["type"] == "completed":
break
# 4. Retrieve the enrichment record
if record_id:
record = httpx.get(f"{BASE}/api/records/{record_id}", headers=HEADERS).json()
print(json.dumps(record["structured_output"], indent=2))Inicie un enriquecimiento por lotes con dos modelos y transmita los resultados:
# Start batch enrichment
JOB_ID=$(curl -s -X POST \
-H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
"$BASE/api/enrichment/batch/start" \
-d '{
"entities": [
{"name": "Pfizer Inc", "country": "US"},
{"name": "Roche", "country": "CH"}
],
"schema_id": "your-schema-uuid",
"models": ["anthropic::claude-sonnet-4-5-20250514", "openai::gpt-4o"],
"strategy": "multi_expertise",
"arbitration_model": "anthropic::claude-sonnet-4-5-20250514"
}' | jq -r '.job_id')
# Stream events
curl -N -H "X-API-Key: $KEY" "$BASE/api/llm/stream/$JOB_ID"
# List resulting records
curl -s -H "X-API-Key: $KEY" \
"$BASE/api/records?type=enrichment&page_size=10" | jq '.records'| Estado | Significado | Ejemplo |
|---|---|---|
| 200 | Correcto | Solicitud completada |
| 400 | Solicitud incorrecta | Clave de modelo no válida o campo faltante |
| 401 | No autorizado | Falta la clave de API o no es válida |
| 402 | Pago requerido | Límite del plan o saldo de créditos — cuota agotada, demasiados modelos o idiomas, una función que no incluye su plan. El cuerpo lleva un código legible por máquina junto con el detalle. |
| 403 | Prohibido | Rol insuficiente para este endpoint |
| 404 | No encontrado | Registro, esquema o trabajo no encontrado |
| 500 | Error del servidor | Fallo interno |
Las respuestas de error incluyen un campo detail con un mensaje de error legible. Los fallos de plan y facturación (402) llevan además un cuerpo estructurado con un code estable — prompt_limit_reached, insufficient_credits, model_limit_exceeded, benchmarks_not_in_plan — junto con las cifras de límite y uso pertinentes, de modo que un cliente puede bifurcar según la causa en lugar de analizar texto. Los flujos SSE emiten un evento de tipo error antes del evento final completed si algo falla a mitad del flujo.
Los modelos se identifican mediante claves compuestas con el formato provider_name::model_name. Utilice GET /api/enrichment/options para listar los modelos disponibles y sus claves.
El parámetro model es opcional en el enriquecimiento, la generación de esquemas y la generación de muestras: omítalo (o pase el literal "auto") y el servidor elige el modelo predeterminado de su organización: el predeterminado por tarea fijado si hay uno configurado en Ajustes, de lo contrario el modelo con la mejor puntuación global de sus benchmarks de origen de puntuación. El campo default_models de la respuesta de opciones muestra a qué se resuelve auto actualmente, y un evento SSE model_auto_selected informa de la elección en cada trabajo. Auto siempre se resuelve en un único modelo (nunca activa la fusión); para canalizaciones reproducibles, siga pasando modelos explícitos.
Las opciones de la solicitud restringen la selección automática: con enable_web_search: true solo se tienen en cuenta los modelos con capacidad de búsqueda web (el campo default_models_web_search de la respuesta de opciones muestra una vista previa de esa selección), y los adjuntos binarios requieren un modelo que pueda leerlos (PDF, visión, audio). Cuando ningún modelo elegible cumple las restricciones, la solicitud falla con HTTP 400 no_capable_default_model en lugar de descartar la opción de forma silenciosa.
anthropic::claude-sonnet-4-5-20250514openai::gpt-4ogoogle::gemini-2.5-prodeepseek::deepseek-chatLa aplicación incluye documentación interactiva de la API con ejemplos de solicitud/respuesta. Requiere autenticación de administrador para acceder: