L'API REST di Entity Enricher consente di arricchire entità, gestire schemi e recuperare record in modo programmatico. Tutte le risposte sono in JSON. L'avanzamento in tempo reale utilizza i Server-Sent Events (SSE).
Integra Entity Enricher in tre passaggi:
GET /api/schema/savedElenca gli schema salvati o generane uno dai dati di esempio
POST /api/single/enrich/streamAvvia l'arricchimento, ottieni un ID job per lo streaming SSE
GET /api/records/{id}Recupera il record di arricchimento completo con output strutturato
Tutti gli endpoint API (tranne login/registrazione) richiedono l'autenticazione. Utilizzare l'header X-API-Key con una chiave di accesso dell'organizzazione:
curl -H "X-API-Key: ent_your_key_here" \
https://your-instance.example.com/api/enrichment/optionsCrea chiavi API dalla pagina Chiavi API o tramite POST /api/auth/api-keys. Consulta la guida alle chiavi API per i dettagli sui tipi di chiave e i permessi.
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/enrichment/options | Modelli, lingue e strategie disponibili |
| POST | /api/single/enrich/stream | Avvia l'arricchimento di una singola entità (restituisce job_id per SSE) |
| POST | /api/single/enrich/sync | Arricchimento singolo bloccante per client non SSE (Make.com, curl) |
| POST | /api/enrichment/batch/start | Avvia l'arricchimento batch per più entità |
| POST | /api/enrichment/batch/fetch | Recupera le entity da un URL esterno |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/llm/stream/{job_id} | Stream SSE per qualsiasi job LLM (arricchimento, schema, fusione) |
| POST | /api/llm/cancel/{job_id} | Annulla un processo in esecuzione o in pausa |
| POST | /api/llm/continue/{job_id} | Riprendi un processo in pausa (ad es. dopo una mancata corrispondenza di classificazione) |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/schema/saved | Elenca tutti gli schema salvati |
| POST | /api/schema/saved | Crea un nuovo schema |
| POST | /api/schema/generate/stream | Genera schema dai dati di esempio (SSE) |
| POST | /api/schema/saved/{id}/prompt/stream | Modifica dello schema con AI in linguaggio naturale (SSE) |
| POST | /api/schema/analyze-sample | Analizza il JSON di esempio alla ricerca di nomi di proprietà ambigui — quelli che ammettono più letture nel contesto del proprio elemento padre, o nessuna — e di elementi correlati che mescolano dati dell'entità e dati specifici del padre (report stateless, ridenominazioni suggerite) |
| POST | /api/schema/saved/{id}/analyze | Esegue i controlli di ambiguità e di ambito dell'identità su uno schema salvato e ne scrive le annotazioni (una descrizione riscritta per ogni nome ambiguo) |
| POST | /api/schema/scoping-split | Applica una divisione per scoping dell'identità a un insieme di campioni — i fatti propri dell'entità correlata vengono spostati in un sotto-oggetto dedicato (deterministica, gratuita, nulla viene salvato) |
| DELETE | /api/schema/saved/{id}/enrichment-data | Elimina i dati di arricchimento di uno schema — record e stato dell'entità — mantenendo lo schema (owner+) |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/records | Elenca i record con paginazione e filtri |
| GET | /api/records/{id} | Ottieni i dettagli completi del record con output strutturato |
| POST | /api/records/batch-delete | Elimina più record (max 100) |
| POST | /api/fusion/merge | Unisci i risultati di più modelli |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| POST | /api/attachments | Carica uno o più file (multipart/form-data) |
| POST | /api/attachments/base64 | Carica un file tramite JSON base64 (per client non multipart) |
| GET | /api/attachments/{id}/download | Scarica i byte del file originale |
| DELETE | /api/attachments/{id} | Elimina un allegato (pulizia post-arricchimento) |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| POST | /api/schema/saved/{id}/publish | Pubblica la copia di lavoro di uno schema collegato come contratto su cui operano l'enrichment e i relativi database. Nessuna modifica strutturale ha effetto finché non viene eseguita questa operazione |
| POST | /api/schema/sample/generate/stream | Genera 1..N oggetti JSON di esempio di un unico tipo di entità (restituisce job_id per SSE) |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/databases | Elenca le registrazioni di database dell’organizzazione, con i conteggi dei delta in sospeso |
| POST | /api/databases | Registra un database su uno schema |
| GET | /api/databases/{id}/snapshot | Scarichi lo stato completo come snapshot .sql — inizializzazione da zero |
| GET | /api/databases/{id}/changes | Recupera la finestra FIFO successiva di delta; rivendicali per riservarli a una consegna con conferma |
| POST | /api/databases/{id}/ack | Conferma i delta applicati fino a un id — rilascia il lease |
| POST | /api/databases/{id}/clear-acked | Elimina i delta consegnati e confermati |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/semantic-concepts | Esplora il vocabolario dei concetti, filtrato per tipo e valutato rispetto a un concetto di riferimento |
| GET | /api/semantic-concepts/types | Elenca i tipi di concetto con i relativi conteggi e modelli di embedding |
| POST | /api/semantic-concepts/probe | Simuli la scala di risoluzione per un testo — che cosa corrisponderebbe e con quale grado di somiglianza |
| GET | /api/semantic-concepts/duplicates | Coppie di concetti appena al di sotto della soglia di unione |
| POST | /api/semantic-concepts/import | Risolve in batch un CSV di testi identitari (la creazione di nuovi ID richiede il ruolo di proprietario) |
| GET | /api/semantic-concepts/export | Esporta il vocabolario in CSV |
| POST | /api/semantic-concepts/delete-impact | Che cosa comporterebbe l'eliminazione dei concetti — conteggi di utilizzo e costo della risincronizzazione |
| GET | /api/semantic-concepts/migration/status | Stato della migrazione del modello di embedding, se ne è in corso una |
| Metodo | Endpoint | Descrizione |
|---|---|---|
| GET | /api/benchmarks | Elenca gli scenari di benchmark |
| POST | /api/benchmarks/{id}/run | Esegua uno scenario su più modelli — ogni risultato viene valutato automaticamente |
| POST | /api/benchmarks/{id}/reference | Salva e verifica il riferimento gold rispetto al quale viene valutato uno scenario |
| GET | /api/billing/balance | Saldo crediti attuale |
| GET | /api/billing/transactions | Cronologia delle transazioni di credito, inclusa la spesa per gli embedding |
| GET | /api/billing/plans | I piani disponibili e i relativi limiti |
Le operazioni di arricchimento, generazione degli schemi e fusione utilizzano i Server-Sent Events per il progresso in tempo reale. Avviare un job, ottenere un job_id, quindi connettersi allo stream SSE:
| Evento | Descrizione |
|---|---|
| model_started | L'elaborazione del modello ha inizio |
| expertise_completed | Un dominio di competenza completato (con risultati parziali) |
| model_completed | Il modello ha terminato con result, record_id e cost |
| fusion_started / fusion_completed | Eventi del ciclo di vita della fusione multi-modello |
| entity_started / entity_completed | Eventi per entità specifici del batch (includono entity_index) |
| completed | Evento terminale - chiudere la connessione |
| error | Si è verificato un errore a livello di job |
Un flusso di lavoro completo che elenca gli schemi, avvia l'arricchimento, trasmette i risultati in streaming e recupera il record finale:
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))Avvia un arricchimento batch con due model ed esegui lo streaming dei risultati:
# 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'| Stato | Significato | Esempio |
|---|---|---|
| 200 | Operazione riuscita | Richiesta completata |
| 400 | Richiesta non valida | Chiave del modello non valida o campo mancante |
| 401 | Non autorizzato | Chiave API mancante o non valida |
| 402 | Pagamento richiesto | Limite del piano o saldo crediti — quota esaurita, troppi modelli o troppe lingue, una funzionalità non inclusa nel piano. Il corpo della risposta contiene un codice leggibile da macchina insieme al dettaglio. |
| 403 | Vietato | Ruolo insufficiente per questo endpoint |
| 404 | Non trovato | Record, schema o processo non trovato |
| 500 | Errore del server | Errore interno |
Le risposte di errore includono un campo detail con un messaggio di errore leggibile. Gli errori relativi al piano e alla fatturazione (402) contengono inoltre un corpo strutturato con un code stabile — prompt_limit_reached, insufficient_credits, model_limit_exceeded, benchmarks_not_in_plan — oltre ai valori di limite e di utilizzo pertinenti, così che un client possa distinguere la causa anziché analizzare il testo. I flussi SSE emettono un evento di tipo error prima dell'evento finale completed se qualcosa non riesce durante lo streaming.
I modelli sono identificati da chiavi composite nel formato provider_name::model_name. Utilizzare GET /api/enrichment/options per elencare i modelli disponibili e le relative chiavi.
Il parametro model è facoltativo per l'arricchimento, la generazione di schema e la generazione di campioni: ometterlo (oppure passare il valore letterale "auto") e il server sceglie il modello predefinito della Sua organizzazione — il predefinito per attività fissato se ne è impostato uno nelle Impostazioni, altrimenti il modello con il miglior punteggio complessivo dai Suoi benchmark di origine del punteggio. Il campo default_models della risposta options mostra a quale modello si risolve attualmente auto, mentre un evento SSE model_auto_selected segnala la scelta per ogni job. Auto si risolve sempre in un singolo modello (non attiva mai la fusion); per pipeline riproducibili, continui a passare modelli espliciti.
Le opzioni della richiesta vincolano la selezione automatica: con enable_web_search: true vengono considerati solo i modelli in grado di effettuare ricerche web (il campo default_models_web_search della risposta con le opzioni mostra un'anteprima di tale selezione) e gli attachment binari richiedono un modello in grado di leggerli (PDF, visione, audio). Quando nessun modello idoneo soddisfa i vincoli, la richiesta ha esito negativo con HTTP 400 no_capable_default_model anziché ignorare silenziosamente l'opzione.
anthropic::claude-sonnet-4-5-20250514openai::gpt-4ogoogle::gemini-2.5-prodeepseek::deepseek-chatL'applicazione include una documentazione API interattiva con esempi di richiesta/risposta. Per accedervi è richiesta l'autenticazione come amministratore: