A API REST do Entity Enricher permite-lhe enriquecer entidades, gerir schemas e obter registos de forma programática. Todas as respostas são JSON. O progresso em tempo real usa Server-Sent Events (SSE).
Integre o Entity Enricher em três passos:
GET /api/schema/savedListar os schemas guardados ou gerar um a partir de dados de exemplo
POST /api/single/enrich/streamInicie o enriquecimento e obtenha um ID de tarefa para streaming SSE
GET /api/records/{id}Obter o registo de enriquecimento completo com saída estruturada
Todos os endpoints da API (exceto início de sessão/registo) requerem autenticação. Utilize o cabeçalho X-API-Key com uma chave de acesso da organização:
curl -H "X-API-Key: ent_your_key_here" \
https://your-instance.example.com/api/enrichment/optionsCrie chaves de API a partir da página de chaves de API ou através de POST /api/auth/api-keys. Consulte o guia de chaves de API para detalhes sobre os tipos de chave e as permissões.
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/enrichment/options | Modelos, idiomas e estratégias disponíveis |
| POST | /api/single/enrich/stream | Inicie o enriquecimento de uma única entidade (devolve job_id para SSE) |
| POST | /api/single/enrich/sync | Enriquecimento único bloqueante para clientes não-SSE (Make.com, curl) |
| POST | /api/enrichment/batch/start | Iniciar enriquecimento em lote para várias entidades |
| POST | /api/enrichment/batch/fetch | Obter entidades a partir de um URL externo |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/llm/stream/{job_id} | Stream SSE para qualquer tarefa de LLM (enriquecimento, schema, fusão) |
| POST | /api/llm/cancel/{job_id} | Cancelar uma tarefa em execução ou pausada |
| POST | /api/llm/continue/{job_id} | Retomar uma tarefa em pausa (por ex., após incompatibilidade de classificação) |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/schema/saved | Listar todos os schemas guardados |
| POST | /api/schema/saved | Criar um novo schema |
| POST | /api/schema/generate/stream | Gerar schema a partir de dados de exemplo (SSE) |
| POST | /api/schema/saved/{id}/prompt/stream | Editar esquema com IA usando linguagem natural (SSE) |
| POST | /api/schema/analyze-sample | Analise o JSON de amostra em busca de nomes de propriedades ambíguos — os que admitem várias leituras no contexto do respetivo elemento pai, ou nenhuma — e de itens relacionados que misturam factos da entidade com factos por elemento pai (relatório sem estado, sugestões de renomeação) |
| POST | /api/schema/saved/{id}/analyze | Executar as verificações de ambiguidade e de âmbito de identidade num esquema guardado e escrever as respetivas anotações (uma descrição reescrita para cada nome ambíguo) |
| POST | /api/schema/scoping-split | Aplicar uma divisão de delimitação de identidade a um conjunto de amostras — os factos próprios da entidade relacionada passam para um subobjeto próprio (determinista, gratuita, nada é guardado) |
| DELETE | /api/schema/saved/{id}/enrichment-data | Elimine os dados de enrichment de um schema — records e estado da entidade — mantendo o schema (owner+) |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/records | Listar registos com paginação e filtragem |
| GET | /api/records/{id} | Obtenha o detalhe completo do record com resultados estruturados |
| POST | /api/records/batch-delete | Eliminar vários registos (máx. 100) |
| POST | /api/fusion/merge | Combinar resultados de vários modelos |
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/attachments | Carregar um ou mais ficheiros (multipart/form-data) |
| POST | /api/attachments/base64 | Carregar um ficheiro através de JSON base64 (para clientes não multipart) |
| GET | /api/attachments/{id}/download | Transferir os bytes do ficheiro original |
| DELETE | /api/attachments/{id} | Eliminar um anexo (limpeza pós-enriquecimento) |
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /api/schema/saved/{id}/publish | Publique a cópia de trabalho de um schema associado como o contrato sobre o qual funcionam o enriquecimento e as suas bases de dados. Nada de estrutural entra em vigor até isto ser executado |
| POST | /api/schema/sample/generate/stream | Gere 1..N objetos JSON de amostra de um tipo de entidade (devolve job_id para SSE) |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/databases | Listar as bases de dados registadas da organização, com as contagens de deltas pendentes |
| POST | /api/databases | Registar uma base de dados num schema |
| GET | /api/databases/{id}/snapshot | Transfira o estado completo como um snapshot .sql — arranque do zero |
| GET | /api/databases/{id}/changes | Obter a próxima janela FIFO de deltas; reivindique-os para os reservar para entrega com confirmação |
| POST | /api/databases/{id}/ack | Confirmar os deltas aplicados até um id — liberta a concessão |
| POST | /api/databases/{id}/clear-acked | Eliminar os deltas entregues e confirmados |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/semantic-concepts | Explorar o vocabulário de conceitos, filtrado por tipo e pontuado em relação a um conceito de referência |
| GET | /api/semantic-concepts/types | Listar os tipos de conceito com as respetivas contagens e modelos de embedding |
| POST | /api/semantic-concepts/probe | Simule a escada de resolução para um texto — a que corresponderia e com que proximidade |
| GET | /api/semantic-concepts/duplicates | Pares de conceitos que ficam ligeiramente abaixo do limiar de fusão |
| POST | /api/semantic-concepts/import | Resolver em lote um CSV de textos de identidade (a criação de conceitos exige proprietário) |
| GET | /api/semantic-concepts/export | Exportar o vocabulário em CSV |
| POST | /api/semantic-concepts/delete-impact | O que a eliminação de conceitos afetaria — contagens de utilização e custo de ressincronização |
| GET | /api/semantic-concepts/migration/status | Estado da migração do modelo de embeddings, caso esteja em curso |
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /api/benchmarks | Listar cenários de benchmark |
| POST | /api/benchmarks/{id}/run | Execute um cenário em vários modelos — cada resultado é pontuado automaticamente |
| POST | /api/benchmarks/{id}/reference | Guardar e verificar a referência dourada com base na qual um cenário é pontuado |
| GET | /api/billing/balance | Saldo de créditos atual |
| GET | /api/billing/transactions | Histórico de transações de créditos, incluindo gastos com embeddings |
| GET | /api/billing/plans | Planos disponíveis e respetivos limites |
As operações de enriquecimento, geração de schema e fusion utilizam Server-Sent Events para acompanhar o progresso em tempo real. Inicie um trabalho, obtenha um job_id e depois ligue-se ao stream SSE:
| Evento | Descrição |
|---|---|
| model_started | O processamento do modelo começa |
| expertise_completed | Um domínio de expertise concluído (com resultados parciais) |
| model_completed | O model terminou com o resultado, o record_id e o custo |
| fusion_started / fusion_completed | Eventos do ciclo de vida da fusão multi-modelo |
| entity_started / entity_completed | Eventos por entidade específicos do lote (incluem entity_index) |
| completed | Evento terminal - fechar a ligação |
| error | Ocorreu um erro ao nível da tarefa |
Um fluxo de trabalho completo que lista esquemas, inicia o enriquecimento, transmite resultados e obtém o registo 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 um enriquecimento em lote com dois modelos e transmita os 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 | Exemplo |
|---|---|---|
| 200 | Sucesso | Pedido concluído |
| 400 | Pedido inválido | Chave de model inválida ou campo em falta |
| 401 | Não autorizado | Chave de API em falta ou inválida |
| 402 | Pagamento necessário | Limite do plano ou saldo de créditos — quota esgotada, demasiados modelos ou idiomas, uma funcionalidade que não faz parte do seu plano. O corpo inclui um código legível por máquina, a par do detalhe. |
| 403 | Proibido | Função insuficiente para este endpoint |
| 404 | Não encontrado | Registo, esquema ou tarefa não encontrado |
| 500 | Erro do servidor | Falha interna |
As respostas de erro incluem um campo detail com uma mensagem de erro legível. As falhas de plano e de faturação (402) trazem ainda um corpo estruturado com um code estável — prompt_limit_reached, insufficient_credits, model_limit_exceeded, benchmarks_not_in_plan — além dos números de limite e de utilização relevantes, para que um cliente possa decidir com base na causa em vez de interpretar texto corrido. Os fluxos SSE emitem um tipo de evento error antes do evento terminal completed se algo falhar a meio do fluxo.
Os modelos são identificados por chaves compostas no formato provider_name::model_name. Use GET /api/enrichment/options para listar os modelos disponíveis e as respetivas chaves.
O parâmetro model é opcional no enriquecimento, na geração de esquemas e na geração de amostras: omita-o (ou passe o literal "auto") e o servidor escolhe o modelo predefinido da sua organização — a predefinição por tarefa fixada, se estiver definida nas Definições, caso contrário o modelo com a melhor pontuação global dos seus benchmarks de origem de pontuação. O campo default_models da resposta de opções mostra para que o auto resolve atualmente, e um evento SSE model_auto_selected comunica a escolha em cada tarefa. O auto resolve sempre para um único modelo (nunca aciona fusão); para pipelines reproduzíveis, continue a passar modelos explícitos.
As opções do pedido restringem a seleção automática: com enable_web_search: true apenas os modelos com capacidade de pesquisa na web são considerados (o campo default_models_web_search da resposta de opções pré-visualiza essa seleção) e os anexos binários exigem um modelo que os consiga ler (PDF, visão, áudio). Quando nenhum modelo elegível satisfaz as restrições, o pedido falha com HTTP 400 no_capable_default_model em vez de descartar silenciosamente a opção.
anthropic::claude-sonnet-4-5-20250514openai::gpt-4ogoogle::gemini-2.5-prodeepseek::deepseek-chatA aplicação inclui documentação de API interativa com exemplos de pedido/resposta. Requer autenticação de administrador para aceder: