API di messaggistica
API Cronologia messaggi
Ottieni l'elenco dei messaggi del tuo spazio di lavoro in un intervallo di date, con lo stato di ciascuno. Usala per riconciliare ciò che è stato inviato, creare report o trovare i messaggi non riusciti da reinviare.
https://wbiztool.com/api/v1/report/Corpo: JSON (necessario per le pagine successive alla prima) o campi di un modulo
La cronologia comprende tutti i messaggi dello spazio di lavoro della tua chiave API, che siano stati inviati tramite l'API, la dashboard o una campagna. I risultati arrivano 200 per pagina, dal più vecchio. Gli stessi dati sono disponibili nella pagina Report.
Esempio rapido#
curl -X POST https://wbiztool.com/api/v1/report/ \
-H "Content-Type: application/json" \
-d '{
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"start_date": "01-09-2026",
"end_date": "08-09-2026",
"page": 1
}'import requests
page = 1
history = []
while True:
response = requests.post(
"https://wbiztool.com/api/v1/report/",
json={
"client_id": 12345,
"api_key": "YOUR_API_KEY",
"start_date": "01-09-2026",
"end_date": "08-09-2026",
"page": page, # must be a JSON number, not a string
},
timeout=60,
)
result = response.json() # read the body even when the HTTP code is 400
if result.get("message") != "Success" or "total" not in result:
print("Failed:", result.get("message", "no message in response"))
break
history.extend(result["history"])
if page * 200 >= result["total"]:
break
page += 1
failed = [m for m in history if m["message_status"] == "Failed"]
print(len(history), "messages,", len(failed), "failed")// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const history = [];
let page = 1;
while (true) {
const response = await fetch("https://wbiztool.com/api/v1/report/", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
client_id: 12345,
api_key: "YOUR_API_KEY",
start_date: "01-09-2026",
end_date: "08-09-2026",
page, // must be a JSON number, not a string
}),
});
const result = await response.json(); // read the body even when the HTTP code is 400
if (result.message !== "Success" || !("total" in result)) {
console.error("Failed:", result.message ?? "no message in response");
break;
}
history.push(...result.history);
if (page * 200 >= result.total) break;
page += 1;
}
const failed = history.filter((m) => m.message_status === "Failed");
console.log(`${history.length} messages, ${failed.length} failed`);<?php
$history = [];
$page = 1;
do {
$ch = curl_init('https://wbiztool.com/api/v1/report/');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'client_id' => 12345,
'api_key' => 'YOUR_API_KEY',
'start_date' => '01-09-2026',
'end_date' => '08-09-2026',
'page' => $page, // an integer, so json_encode sends a number
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($result['message'] ?? '') !== 'Success' || !isset($result['total'])) {
echo 'Failed: ' . ($result['message'] ?? 'no message in response');
break;
}
$history = array_merge($history, $result['history']);
$page++;
} while (($page - 1) * 200 < $result['total']);
echo count($history) . ' messages';Sostituisci 12345 e YOUR_API_KEY con i tuoi valori. Consulta Autenticazione per sapere dove trovarli.
Parametri della richiesta#
Autenticazione
client_idintegerobbligatorioIl tuo ID Client API, da Impostazioni → Chiavi API.
api_keystringobbligatorioLa tua chiave API, dalla stessa pagina.
Filtri
start_datestringobbligatorioPrimo giorno da includere, nel formato
DD-MM-YYYY, ad esempio01-09-2026.end_datestringobbligatorioFine dell'intervallo, nel formato
DD-MM-YYYY. Questo giorno non è incluso. Vedi Intervallo di date.whatsapp_clientintegerfacoltativoRestituisce solo i messaggi inviati da questo numero WhatsApp, usando il suo ID dalle Impostazioni WhatsApp. Omettilo per ottenere i messaggi di tutti i tuoi numeri.
pageintegerfacoltativoNumero di pagina, a partire da
1(il valore predefinito). Ogni pagina contiene fino a 200 messaggi. Invialo come numero JSON.0o un numero negativo restituiscetotalcon unhistoryvuoto.
Intervallo di date#
Le date vengono interpretate come la mezzanotte all'inizio di quel giorno nell'ora standard indiana (IST, UTC+5:30), e i messaggi vengono selezionati in base a quando sono stati creati (messi in coda o pianificati), non a quando sono stati inviati. L'intervallo va da start_date 00:00 fino a end_date 00:00, quindi:
"start_date": "01-09-2026", "end_date": "08-09-2026"restituisce i messaggi dall'1 al 7 settembre. L'8 settembre non è incluso.- Per ottenere un solo giorno, imposta
end_datesul giorno successivo:"start_date": "15-09-2026", "end_date": "16-09-2026". - Se le due date coincidono, non ottieni alcun messaggio.
Paginazione#
Ogni risposta contiene total, il numero di messaggi dell'intero intervallo, e fino a 200 di questi in history. Richiedi page 2, 3 e così via finché page × 200 non è almeno pari a total.
Risposta#
Una richiesta riuscita restituisce HTTP 200:
{
"message": "Success",
"status": 0,
"total": 3,
"history": [
{ "id": 9817263, "msg_type": "Text", "contact": "919876543210", "message_status": "Sent" },
{ "id": 9817264, "msg_type": "File", "contact": "919812345670", "message_status": "Failed" },
{ "id": 9817265, "msg_type": "Image", "contact": "Sales Team Mumbai", "message_status": "Pending" }
]
}
| Campo | Tipo | Descrizione |
|---|---|---|
message | string | Success quando la richiesta è riuscita, altrimenti l'errore. |
status | integer | Sempre 0. Non usarlo per rilevare il successo. |
total | integer | Numero di messaggi nell'intervallo di date su tutte le pagine. Presente solo in caso di successo. |
history | array | Fino a 200 messaggi in questa pagina, dal più vecchio. Vuoto in caso di errore. |
history[].id | integer | ID del messaggio, lo stesso msg_id restituito al momento dell'invio. |
history[].msg_type | string | Text, Image o File. |
history[].contact | string | Il numero di telefono del destinatario con prefisso internazionale, oppure il nome del gruppo per i messaggi di gruppo. |
history[].message_status | string | Vedi la tabella sotto. |
Valori di stato dei messaggi#
message_status | Significato |
|---|---|
Pending | In coda o pianificato, non ancora inviato (stato 0). |
Sent | Inviato dal tuo numero WhatsApp (stato 1). |
Delivered | Riservato, al momento non viene restituito. |
Read | Riservato, al momento non viene restituito. |
Failed | Non è stato possibile inviarlo, oppure l'invio è stato interrotto (stato 2). Usa Stato del messaggio per vedere l'error. |
Cancelled | Annullato prima dell'invio (stato 3). |
Expired | Non inviato prima della scadenza expire_after_seconds (stato 4). |
Al momento le spunte di consegna e di lettura non vengono registrate, quindi i messaggi inviati risultano sempre Sent. Delivered e Read sono valori riservati; se dovessero comparire, considerali come Sent.
Errori#
Gli errori restituiscono HTTP 200 con status impostato su 0, salvo dove indicato:
{ "message": "Error", "status": 0, "history": [] }
| Messaggio | Come risolvere |
|---|---|
Error | start_date o end_date mancano o non sono nel formato DD-MM-YYYY, il corpo JSON non è valido (spesso per una virgola finale) oppure la richiesta non era una POST. |
Auth Error | Invia sia client_id sia api_key. |
Invalid Client Id | Invia client_id come numero. Restituito con HTTP 403, senza history. |
Auth Error: invalid api key | Verifica che la chiave esista, non sia stata eliminata e appartenga a questo client_id. Restituito con HTTP 400, senza history. |
Demo Account can not access apis | Usa un account normale. |
Suggerimenti#
- Recupera la cronologia a piccoli intervalli: un giorno o una settimana alla volta mantengono basso il numero di pagine.
- Trova i messaggi non riusciti: filtra
historyperFailed, poi chiama Stato del messaggio con ogniidper vedere perché non è riuscito. Prima di riprovare, controlla l'error:Sending was interrupted and may have been delivered…significa che il destinatario potrebbe avere già il messaggio. - I messaggi vecchi vengono eliminati: i messaggi che hanno raggiunto uno stato finale e non sono cambiati per circa 90 giorni possono essere eliminati e non comparire più qui, così come i messaggi ancora in coda 90 giorni dopo la creazione o la pianificazione, su un numero disconnesso o eliminato.
- Monitoraggio in tempo reale: per reagire quando i messaggi vengono inviati, passa un
webhookquando invii il messaggio invece di interrogare periodicamente questo endpoint.
