Panoramica API
Questa pagina illustra le convenzioni principali dell'API REST del Qlara Platform: autenticazione, identificazione delle richieste, limiti di frequenza, paginazione, gestione degli errori e formato delle risposte.
Base URL
Tutte le richieste API vengono effettuate verso il seguente base URL:
https://api.qlara.ai/api
Ogni percorso documentato in questo portale è relativo a questo base URL. Ad esempio, l'endpoint di invio SMS è:
https://api.qlara.ai/api/message-server/sms/send
Autenticazione
Ogni richiesta deve includere credenziali valide. L'API supporta due metodi di autenticazione.
API Key (consigliato)
Passa la tua API Key nell'header X-Api-Key:
curl -X GET "https://api.qlara.ai/api/partner-gateway/v1/contacts" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Accept: application/json"
Basic Auth
Passa le credenziali come stringa username:password codificata in Base64 nell'header Authorization:
curl -X GET "https://api.qlara.ai/api/partner-gateway/v1/contacts" \
-H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" \
-H "Accept: application/json"
L'autenticazione tramite API Key è consigliata per tutte le nuove integrazioni. È più semplice, più facile da ruotare e non espone la password del tuo account.
Non esporre mai la tua API Key o le credenziali in codice lato client, repository pubblici o URL. Inviale sempre tramite header su HTTPS.
Identificazione della Richiesta
Ogni risposta include l'header X-Request-Id:
X-Request-Id: 16d9b2a9ca97da0d8c4c4ea2ae689017
Il valore è l'identificativo di traccia che la piattaforma ha assegnato alla richiesta, la stessa chiave che indicizza ogni riga di log prodotta dalla richiesta. Registralo dalla tua parte e citalo quando contatti il supporto per una chiamata specifica. È presente anche sulle risposte di errore, 401 e 500 inclusi, cioè quando serve di più.
Limiti di Frequenza
Gli endpoint di messaggistica sotto /api/message-server/ applicano un limite di richieste al secondo per account, definito dal tuo piano di abbonamento. Quando lo superi, l'API risponde 429 Too Many Requests con corpo vuoto e l'header Retry-After: 1: attendi un secondo e riprova.
Gli endpoint Qlara Platform sotto /api/partner-gateway/v1/ al momento non applicano alcun limite di frequenza e non rispondono 429.
Nessuna delle due famiglie di endpoint restituisce header X-RateLimit-*. Per lo stato di consegna, preferisci i webhook a cicli di polling stretti: vedi la guida ai Webhook.
Paginazione
Gli endpoint che restituiscono collezioni (contatti, liste contatti, campagne, esportazioni, media, agenti RCS, numeri WhatsApp, storico messaggi) sono paginati per pagina: page seleziona la pagina, contando da 0, e limit ne imposta la dimensione.
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
page | integer | 0 | Indice della pagina. La prima pagina è la 0. |
limit | integer | 10 o 20, a seconda dell'endpoint | Dimensione della pagina. Dove è imposto un massimo, è 1000. Verifica il riferimento dell'endpoint. |
Richiesta di esempio
curl -X GET "https://api.qlara.ai/api/partner-gateway/v1/contacts?page=2&limit=20" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Accept: application/json"
Risposta di esempio
{
"data": [
{
"id": 202365451,
"fullName": "Marco Rossi",
"phoneNumbers": ["+393401234567"],
"createdAt": "2026-01-15 10:30:00.000+0000"
},
{
"id": 202365452,
"fullName": "Giulia Bianchi",
"phoneNumbers": ["+393409876543"],
"createdAt": "2026-01-16 14:20:00.000+0000"
}
],
"page": 2,
"limit": 20,
"totalCount": 1250,
"totalPages": 63
}
Per iterare tutti i record, incrementa page da 0 a totalPages - 1.
Alcune collezioni hanno una forma diversa:
GET /partner-gateway/v1/campaignsavvolge lo stesso oggetto pagina in un involucro JSend:{ "status": "success", "data": { "data": [...], "page": 0, "limit": 20, "totalCount": 12, "totalPages": 1 } }.GET /partner-gateway/v1/messages/historyeGET /partner-gateway/v1/messages/statusrestituiscono un array JSON semplice. Lo storico accetta comunquepageelimit: sei sull'ultima pagina quando ne ricevi una con meno elementi dilimit.GET /partner-gateway/v1/inbox/conversationseGET /partner-gateway/v1/socialsrestituiscono un array JSON semplice senza paginazione. Restringi l'inbox con i suoi filtri (unreadOnly,channelIds,dateFrom,section) e ordinala conorderBy.
Gestione degli Errori
L'API utilizza codici di stato HTTP standard. Gli endpoint Qlara Platform restituiscono un corpo JSend.
Formato della risposta di errore
Una richiesta rifiutata (4xx) è un fail, e data ne spiega il motivo. Nella maggior parte dei casi è una stringa; è una lista di messaggi quando fallisce la validazione del corpo della richiesta:
{
"status": "fail",
"data": "Invalid 'from': '27/08/2026'. Accepted formats: yyyy-MM-dd (a whole day, UTC), yyyy-MM-ddTHH:mm:ss (UTC) or ISO-8601 with an offset such as 2025-01-15T00:00:00+01:00 or 2025-01-15T00:00:00Z"
}
Un errore dalla nostra parte (5xx) è un error:
{
"status": "error",
"message": "Something bad happened. Please try again!"
}
Due eccezioni a questa forma: una API Key mancante o non valida risponde 401 con {"error": "Invalid API Key"} sugli endpoint della Qlara Platform e con un corpo vuoto sugli endpoint di messaggistica, e un 429 dagli endpoint di messaggistica non ha corpo.
Codici di stato HTTP
| Codice | Significato | Descrizione |
|---|---|---|
400 | Bad Request | Il corpo della richiesta o i parametri della query non sono validi. data indica il parametro e, per date ed enumerazioni, i valori accettati. |
401 | Unauthorized | X-Api-Key mancante o non valida, oppure una chiave che non include l'operazione chiamata. |
403 | Forbidden | La richiesta non è consentita per il tuo account, ad esempio un mittente che la tua azienda non possiede. |
404 | Not Found | L'endpoint o la risorsa non esiste per il tuo account. Una lettura di stato risponde 404 quando l'id del messaggio è sconosciuto per il canale indicato. |
409 | Conflict | La risorsa esiste già, ad esempio un webhook già configurato. |
422 | Unprocessable Content | Solo endpoint di invio (POST /partner-gateway/v1/sms/messages, rcs/messages, whatsapp/messages): la piattaforma di messaggistica ha rifiutato il messaggio. Il corpo fail ne riporta i motivi. Se un canale di fallback ha accettato il messaggio, la risposta resta 202. |
429 | Too Many Requests | Solo endpoint di messaggistica: superato il limite di richieste al secondo per account. Rispetta Retry-After. |
500 | Internal Server Error | Errore imprevisto dalla nostra parte. Riprova con backoff esponenziale e, se persiste, cita l'X-Request-Id al supporto. |
502 | Bad Gateway | Il provider del canale a monte ha restituito un errore. |
Strategia di retry
Per errori transienti (429 e 5xx), implementa un backoff esponenziale con jitter:
- Primo retry: attendi 1 secondo
- Secondo retry: attendi 2 secondi
- Terzo retry: attendi 4 secondi
- Massimo retry: 5 tentativi
- Aggiungi jitter: aggiungi un ritardo casuale di 0--500ms a ogni tempo di attesa per evitare il thundering herd
Non riprovare gli errori 400, 401, 403, 404 o 422. Questi indicano un problema con la tua richiesta che deve essere corretto prima di riprovare: un messaggio rifiutato con 422 viene rifiutato di nuovo se lo invii invariato.
Formato delle Risposte
Tutte le risposte API utilizzano JSON con codifica UTF-8.
Header di risposta comuni
| Header | Valore | Descrizione |
|---|---|---|
Content-Type | application/json;charset=UTF-8 | Formato del corpo della risposta |
X-Request-Id | 16d9b2a9ca97da0d8c4c4ea2ae689017 | Identificativo di traccia della richiesta, da citare al supporto |
Cache-Control | no-cache, no-store, must-revalidate | Le risposte non devono essere messe in cache |
Risposte con successo
- Singola risorsa: l'oggetto risorsa al livello principale.
- Collezioni: l'oggetto pagina descritto in Paginazione, oppure un array semplice per gli endpoint lì elencati.
- Creazione:
201 Createdcon la risorsa creata. - Aggiornamento:
200 OKcon la risorsa aggiornata. - Eliminazione:
204 No Contentper la maggior parte delle risorse.DELETE /partner-gateway/v1/contactseDELETE /partner-gateway/v1/contacts/listrispondono200 OKcontrue, e ricevono gli id da eliminare nel query parameterids, separati da virgola, non nel corpo. - Operazioni asincrone (esportazioni):
202 Acceptedcon corpo vuoto. InterrogaGET /partner-gateway/v1/exportsfinché l'esportazione mostraisAvailableForDownload: true, poi chiamaGET /partner-gateway/v1/exports/{exportId}per l'URL di download.
Timestamp
Sono in uso due formati, a seconda della risorsa:
| Dove | Formato | Esempio |
|---|---|---|
Stato di consegna e storico messaggi (sendDate, deliveryDate, readDate) | ISO 8601 con offset | 2026-09-03T08:28:52Z |
Contatti, liste, campagne, esportazioni, inbox (createdAt, lastMessageDate, ...) e scheduledDate negli invii | yyyy-MM-dd HH:mm:ss.SSSZ | 2026-09-01 10:17:53.200+0000 |
Parametri data nella query
from e to su GET /partner-gateway/v1/messages/history accettano:
| Forma | Esempio | Interpretazione |
|---|---|---|
| Solo data | 2026-08-27 | L'intera giornata UTC: 00:00:00Z come from, 23:59:59Z come to |
| Data-ora senza offset | 2026-08-27T10:30:00 | UTC |
| ISO 8601 con offset | 2026-08-27T00:00:00%2B01:00, 2026-08-27T23:59:59Z | Così com'è |
Codifica il + dell'offset come %2B: in una query string un + non codificato viene decodificato come spazio. Un valore in qualsiasi altra forma riceve 400 con l'elenco dei formati accettati.
Stati di consegna
GET /partner-gateway/v1/messages/status e GET /partner-gateway/v1/messages/history riportano un deliveryStatus normalizzato (ACCEPTED, REJECTED, DELIVERED, EXPIRED, DELETED, UNDELIVERABLE, ERROR, DISABLED, UNSUPPORTED, CONVERSATION_CLOSED o UNKNOWN) con una deliveryStatusDescription in minuscolo. Il webhook di stato consegna invia lo stesso stato come statusCode numerico. La tabella Delivery Statuses nel riferimento API associa ogni codice al suo stato ed elenca i canali che lo usano.
Versionamento
La versione dell'API è inclusa nel percorso URL per gli endpoint di Qlara Platform:
/api/partner-gateway/v1/...
Gli endpoint specifici per canale (SMS, RCS, WhatsApp) utilizzano un percorso piatto senza versione esplicita:
/api/message-server/sms/send
/api/message-server/rcs/send
/api/message-server/whatsapp/send
Quando vengono introdotte modifiche non retrocompatibili, una nuova versione (es. v2) verrà pubblicata sotto un nuovo percorso. Le versioni esistenti rimangono disponibili per un periodo di deprecazione di almeno 6 mesi, durante il quale entrambe le versioni funzionano in parallelo.
Iscriviti al changelog dell'API e alle notifiche del tuo account per essere informato sulle prossime deprecazioni e nuove versioni.
Prossimi passi
- Quick Start -- Invia il tuo primo messaggio in 3 minuti.
- Guida all'autenticazione -- Configurazione dettagliata dell'autenticazione con whitelist IP.
- Riferimento API -- Documentazione completa degli endpoint.
- Collezioni Postman -- Collezioni di richieste pronte all'uso.