Riferimento API di Entagl
L'API di Entagl permette al tuo software di lavorare con un workspace Entagl: contatti, conversazioni, messaggi, prenotazioni, promemoria, ordini, prodotti, chiamate AI e campagne. I webhook avvisano i tuoi sistemi nel momento in cui succede qualcosa. È la stessa API usata dall'app Entagl per Make.
URL di base
https://api.entagl.com/api/v1Richieste e risposte sono JSON su HTTPS. I nomi dei campi sono in snake_case. Gli ID sono numeri interi, salvo diversa indicazione di un endpoint. Gli orari sono stringhe ISO 8601; le risposte usano UTC.
Autenticazione
Invia un token con ogni richiesta nell'header Authorization: Authorization: Bearer <token>. Funzionano due tipi di token:
API key
Per il codice del tuo server. Creane una nell'app Entagl in Impostazioni → API Keys. Le chiavi iniziano con ai_. Una chiave funziona sul workspace in cui è stata creata e ha lì i diritti di proprietario, quindi tienila segreta e non inserirla mai in un browser o in un'app mobile.
Token di accesso OAuth 2.0
Usato da connettori come l'app Entagl per Make. La persona accede con il proprio account Entagl e il connettore agisce per suo conto, con il suo ruolo nel workspace. Per creare una tua integrazione OAuth, contatta support@entagl.com.
curl "https://api.entagl.com/api/v1/contacts?limit=2" \
-H "Authorization: Bearer ai_your_api_key"Un header mancante risponde 401 unauthenticated. Una chiave errata o revocata risponde 401 invalid_api_key. Un token OAuth scaduto risponde 401 invalid_token: aggiornalo e riprova.
Workspace e permessi
Ogni richiesta lavora su un solo workspace. Una API key usa sempre il proprio workspace. Un login OAuth può appartenere a più workspace (di sua proprietà o a cui partecipa come membro del team): invia l'header X-Entagl-Workspace con l'ID del workspace per sceglierne uno. Con un solo workspace l'header è facoltativo. GET /me funziona senza l'header ed elenca ogni workspace che il login può usare.
curl "https://api.entagl.com/api/v1/me" \
-H "Authorization: Bearer <oauth_access_token>"
curl "https://api.entagl.com/api/v1/contacts" \
-H "Authorization: Bearer <oauth_access_token>" \
-H "X-Entagl-Workspace: <workspace_id from /me>"Senza l'header su un login con più workspace ricevi 400 workspace_required; un workspace a cui il login non può accedere risponde 403 workspace_forbidden. Un ID che appartiene a un altro workspace risponde sempre 404 not_found, mai 403.
Ogni endpoint qui sotto mostra il permesso di cui ha bisogno. Proprietari, admin e API key superano ogni controllo. I membri del team lo superano quando il loro ruolo ha quel permesso spuntato nelle impostazioni del team: contacts, inbox, calendar, orders, business_pages, call_agent, campaigns o integrations. Senza di esso l'API risponde 403 insufficient_permissions.
Richieste ed errori
Invia i corpi come JSON con Content-Type: application/json. La maggior parte degli endpoint rifiuta con 422 i campi sconosciuti nel corpo, così un errore di battitura non passa mai in silenzio. Ogni errore ha la stessa forma: un code stabile su cui ramificare, un message leggibile e, per gli errori di validazione, una lista details che indica ogni campo errato.
{
"error": {
"code": "validation_failed",
"message": "Invalid email address",
"details": [
{ "path": "email", "message": "Invalid email address" }
]
}
}- 400Richiesta malformata: ID non valido, cursore non valido, header del workspace mancante.
- 401Token mancante, non valido o scaduto.
- 402Crediti insufficienti per l'azione (ad esempio l'invio di una campagna).
- 403Autenticato, ma non autorizzato: permesso o accesso al workspace mancante.
- 404Non trovato, compresi gli ID di un altro workspace.
- 409Conflitto: nome duplicato, stato errato o scontro di Idempotency-Key.
- 422Validazione fallita, oppure una regola di business ha rifiutato la modifica.
- 429Limite di frequenza raggiunto. Vedi Retry-After.
- 500 / 502Entagl o il canale di messaggistica ha avuto un errore. Controlla l'esito prima di riprovare una scrittura.
Le route contrassegnate come Formato di risposta legacy sono precedenti a queste convenzioni: restituiscono semplici oggetti o array JSON e rispondono alla maggior parte degli errori come { "message": "…" }.
Paginazione
Gli endpoint contrassegnati come Paginato restituiscono prima gli elementi più recenti, in una struttura di lista. Chiedi fino a 100 elementi con limit (predefinito 25). Quando has_more è true, passa next_cursor come starting_after per ottenere la pagina successiva. Le altre liste restituiscono tutto in una volta con has_more: false.
{
"object": "list",
"data": [
{
"object": "contact",
"id": 6789,
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "+15551234567",
"tags": ["vip"]
}
],
"has_more": true,
"next_cursor": "6789"
}curl "https://api.entagl.com/api/v1/contacts?limit=100&starting_after=6789" \
-H "Authorization: Bearer ai_your_api_key"Idempotenza
Ogni endpoint POST nel formato standard accetta l'header Idempotency-Key (fino a 200 caratteri). Usa un valore unico per ogni operazione, ad esempio un UUID. Entagl conserva la prima risposta per 24 ore: un nuovo tentativo con la stessa chiave e lo stesso body riceve quella risposta con Idempotent-Replayed: true, e niente viene eseguito due volte. Le route contrassegnate come Formato di risposta legacy funzionano diversamente, vedi sotto.
curl -X POST "https://api.entagl.com/api/v1/contacts" \
-H "Authorization: Bearer ai_your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 4f9c1d2e-order-7781" \
-d '{ "first_name": "Jane", "phone": "+15551234567", "tags": ["vip"] }'- La stessa chiave con un corpo diverso risponde
409 idempotency_key_reused. - Finché la prima richiesta è ancora in corso, o se non è mai terminata, un nuovo tentativo risponde
409 request_in_progress. Controlla l'esito, poi riprova con una nuova chiave. - Ogni esito viene conservato, errori compresi. Per riprovare una richiesta fallita, usa una nuova chiave.
- Le chiavi sono legate al workspace e alla credenziale.
Route legacy. Anche POST /messages accetta Idempotency-Key (o un message_id nel body): ripetere un messaggio già accettato risponde 202 con lo stesso conversationId e non viene elaborato due volte, mentre la stessa chiave con un body diverso risponde 409. POST /chat non ha protezione dai tentativi ripetuti: un nuovo tentativo riavvia l'AI, quindi controlla l'esito prima di riprovare.
Limiti di frequenza
Ogni workspace può fare 120 richieste al minuto, condivise tra tutte le sue API key e connessioni. Le risposte includono RateLimit-Limit, RateLimit-Remaining e RateLimit-Reset (secondi che mancano al reset della finestra). Oltre il limite ricevi 429 rate_limited con un header Retry-After: attendi quei secondi, poi riprova. Le route legacy del canale API non rientrano in questo limite.