URL di base
https://api.flowella.io/v1/messages. Usatela anche dove l’app mostra un indirizzo che termina con /api/v1, come API base URL nel Developer hub.
Le richieste all’host dell’app,
https://app.flowella.io/api/v1/..., vengono reindirizzate in modo permanente (308) a https://api.flowella.io/v1/.... Molti client HTTP eliminano l’intestazione Authorization quando seguono un reindirizzamento verso un altro host, quindi la richiesta reindirizzata può non riuscire con 401. Chiamate direttamente https://api.flowella.io/v1.Autenticazione
Inviate un bearer token nell’intestazioneAuthorization di ogni richiesta:
Usate una chiave API per i vostri script e le vostre integrazioni. Usate un’app OAuth quando altre organizzazioni Flowella installano la vostra integrazione.
Verificare le credenziali
Chiamate l’endpoint ping per confermare che una chiave o un token funzionino:200 OK significa che siete autenticati. organizationId è l’ID numerico della vostra organizzazione:
401 ha il codice UNAUTHORIZED e uno di questi messaggi: Missing bearer token, Invalid or expired API key, Invalid or expired access token o Unsupported bearer token.
Scope
Ogni endpoint richiede uno scope. Le chiavi API create nell’app hanno tutti gli scope. I token di accesso OAuth hanno solo gli scope concessi al momento dell’autorizzazione.GET /v1/ping e GET /v1/rate-limits non richiedono alcuno scope. GET /v1/capabilities (scope account:read) elenca gli scope del vostro token.
Una richiesta priva dello scope necessario restituisce 403 con il codice INSUFFICIENT_SCOPE. details.required elenca gli scope mancanti:
Errori
Gli errori usano la stessa struttura.requestId identifica la richiesta quando contattate il supporto e details contiene informazioni aggiuntive, come problemi di validazione, quando presenti:
Il valore
error.code è stabile, quindi il vostro codice può farvi affidamento. Il testo error.message è destinato alle persone e può cambiare.
Limiti di frequenza
Ogni chiave API e ogni token di accesso OAuth ha un proprio limite di richieste al minuto. Flowella conteggia le richieste in finestre fisse di un minuto che iniziano allo scoccare del minuto (UTC). Le risposte alle richieste che superano i controlli di autenticazione e di scope includono queste intestazioni:
Quando superate il limite, Flowella restituisce
429 con il codice RATE_LIMITED e un’intestazione Retry-After con il numero di secondi da attendere. GET /v1/rate-limits restituisce i vostri valori limit, remaining e reset in formato JSON.
Per invii di grandi dimensioni, usate POST /v1/templates/send, che accetta fino a 50.000 destinatari in un’unica richiesta. La richiesta accetta anche un campo facoltativo throttlePerHour, un numero intero da 1 a 100.000, ma al momento non regola il ritmo degli invii, quindi non fatevi affidamento. Per distribuire un invio di grandi dimensioni nel tempo, suddividete l’elenco dei destinatari in lotti più piccoli e inviate ciascun lotto separatamente.
ID delle richieste
Le risposte includono un’intestazioneX-Request-Id e i corpi degli errori la ripetono come error.requestId. POST /v1/templates/send fa eccezione: vedere Invii di template in blocco. Per usare un vostro ID, inviate un’intestazione X-Request-Id di massimo 128 caratteri e Flowella la riutilizza.
Comunicate l’ID della richiesta quando contattate il supporto. Per cercare autonomamente una richiesta, chiamate GET /v1/requests/{requestId} (scope account:read): restituisce la richiesta registrata con gli eventi, i job e le consegne webhook collegati. Il Developer hub elenca le richieste recenti e i relativi ID.
Idempotenza
Le chiavi di idempotenza vi permettono di ripetere una richiesta di scrittura dopo un timeout o un errore di rete senza eseguire il lavoro due volte.POST /v1/templates/send segue regole proprie, descritte più avanti.
La maggior parte delle richieste di scrittura
Le richiestePOST, PATCH, PUT e DELETE accettano un’intestazione facoltativa Idempotency-Key:
- La chiave deve contenere da 8 a 255 caratteri. Altre lunghezze restituiscono
400. - Flowella ricorda ogni chiave per la vostra organizzazione per 24 ore.
- Una ripetizione con la stessa chiave, lo stesso metodo, lo stesso percorso e lo stesso corpo restituisce la risposta memorizzata senza eseguire di nuovo la richiesta.
- Una ripetizione con la stessa chiave ma con metodo, percorso o corpo diversi restituisce
409 IDEMPOTENCY_KEY_CONFLICT. - Una ripetizione inviata mentre la prima richiesta è ancora in esecuzione restituisce
409 IDEMPOTENCY_KEY_IN_FLIGHT. Attendete e riprovate. - Le risposte riportano la chiave in un’intestazione
Idempotency-Key.
Invii di template in blocco
Gli invii di template in blocco sono asincroni.POST /v1/templates/send convalida la richiesta, la mette in coda in modo persistente e restituisce subito 202 Accepted:
Idempotency-Key che identifichi ciascun lotto:
- La chiave può contenere fino a 200 caratteri. Una chiave più lunga restituisce
400. - Una ripetizione con la stessa chiave entro 7 giorni restituisce l’
idoriginale e non invia nulla, anche se il corpo è cambiato. - Senza l’intestazione, Flowella usa come chiave un hash del corpo della richiesta. Se inviate di nuovo un corpo identico byte per byte entro 7 giorni, ricevete l’
idoriginale e non viene inviato nulla. Usate una nuova chiave per ogni lotto che intendete inviare.
- Chiamatelo con una chiave API. I token di accesso OAuth vengono rifiutati con
401. - Le sue risposte non includono le intestazioni
X-Request-Id,API-VersionoX-RateLimit-*. Le sue richieste contano comunque ai fini del limite di frequenza della chiave.
Versioni
Potete fissare la versione dell’API con l’intestazioneAPI-Version:
2026-08-11 è l’unica versione supportata ed è quella predefinita quando omettete l’intestazione. Qualsiasi altro valore, o un valore che non è una data YYYY-MM-DD, restituisce 400 con il messaggio Unsupported API-Version. Le risposte riportano la versione nelle intestazioni API-Version e X-Flowella-Api-Version.
Sandbox
La sandbox vi permette di testare un’integrazione senza inviare nulla a WhatsApp. Funziona sulla vostra organizzazione reale: non esiste un account di test separato. Potete usarla in due modi:- Una chiave sandbox, che riguarda solo le richieste effettuate con quella chiave. Vedere Chiavi sandbox.
- L’API sandbox a livello di organizzazione nel Developer hub, che un Owner o un Admin può attivare. Vedere API sandbox.
POST /v1/messages memorizza il messaggio e restituisce "sandbox": true senza contattare Meta, e l’invio di un template per approvazione restituisce una decisione simulata immediata. Gli strumenti di test della sandbox in /v1/test/ e /v1/sandbox richiedono lo scope sandbox:manage.
Paginazione
Gli endpoint di elenco, come/v1/conversations, /v1/contacts e /v1/templates, usano la paginazione a cursore:
- Passate
limit(da 1 a 100, predefinito 25) e uncursorfacoltativo. - La risposta contiene
itemse, quando ci sono altri risultati, unnextCursor. - Passate
nextCursorcome parametrocursorper recuperare la pagina successiva. - Quando
nextCursorè assente onull, avete raggiunto la fine.
Data e ora
Tutti i timestamp sono stringhe ISO 8601 in UTC, ad esempio2025-01-15T14:30:00.000Z. Dove l’API accetta date, funzionano sia i valori con la sola data (2025-01-15) sia i valori ISO 8601 completi.
Numeri di telefono
Passate i numeri di telefono in formato E.164 (+15551234567) quando possibile. Flowella normalizza le varianti più comuni, ma E.164 è il formato più sicuro.
Canali
Molti endpoint accettano unwhatsappChannelId. Se la vostra organizzazione ha un solo canale e lo omettete, Flowella usa il canale predefinito. Se avete più canali, passate l’ID in modo esplicito per non inviare dal numero sbagliato.
Per lo schema completo degli URL e il cambio di canale, vedere Multicanale.
Specifica OpenAPI
La specifica attiva e leggibile dalle macchine è pubblica:Risorse per sviluppatori
L’app offre altro materiale per sviluppatori. Queste pagine sono pubbliche, quindi potete aprirle senza accedere:
Il Developer hub in Settings riunisce questi link insieme alle vostre richieste API recenti e all’interruttore dell’API sandbox.

