API v2 (beta)
Pesan
Kirim pesan sekarang atau pada waktu yang ditentukan, ke nomor telepon, grup WhatsApp, kontak tersimpan, atau username Telegram. Kirim pesan yang sama ke hingga 1.000 penerima dalam satu request, baca riwayat, ikuti status pesan, dan batalkan selama pesan masih menunggu.
| Operasi | Endpoint | Scope |
|---|---|---|
| Mengirim pesan | POST /api/v2/messages | messages:send |
| Mengirim ke banyak penerima | POST /api/v2/messages/batch | messages:send |
| Daftar pesan | GET /api/v2/messages | messages:read |
| Mengambil pesan | GET /api/v2/messages/{id} | messages:read |
| Membatalkan pesan | DELETE /api/v2/messages/{id} | messages:send |
Kunci, error, Idempotency-Key, dan batas berfungsi seperti dijelaskan di Ikhtisar API v2. Untuk mengetahui kapan pesan terkirim atau gagal tanpa polling, tambahkan endpoint webhook.
Mengirim pesan#
https://wbiztool.com/api/v2/messagesBody: JSON (application/json)
Pesan masuk antrean dan respons datang sebelum pesan dikirim, dengan HTTP 202 dan Message berstatus queued (atau scheduled jika send_at di masa mendatang). Ikuti pesan dengan Mengambil pesan atau webhook.
curl -X POST https://wbiztool.com/api/v2/messages \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1042-ready" \
-d '{
"from": 101,
"to": { "phone": "+919876543210" },
"text": "Hi Asha, your order #1042 is ready."
}'import os
import requests
response = requests.post(
"https://wbiztool.com/api/v2/messages",
headers={
"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}",
"Idempotency-Key": "order-1042-ready",
},
json={
"from": 101,
"to": {"phone": "+919876543210"},
"text": "Hi Asha, your order #1042 is ready.",
},
timeout=30,
)
body = response.json()
if response.status_code == 202:
print("Queued:", body["id"], body["status"])
else:
print("Refused:", body["error"]["code"], body["error"]["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v2/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "order-1042-ready",
},
body: JSON.stringify({
from: 101,
to: { phone: "+919876543210" },
text: "Hi Asha, your order #1042 is ready.",
}),
});
const body = await response.json();
if (response.status === 202) {
console.log("Queued:", body.id, body.status);
} else {
console.error("Refused:", body.error.code, body.error.message);
}<?php
$ch = curl_init('https://wbiztool.com/api/v2/messages');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: order-1042-ready',
],
CURLOPT_POSTFIELDS => json_encode([
'from' => 101,
'to' => ['phone' => '+919876543210'],
'text' => 'Hi Asha, your order #1042 is ready.',
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$body = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status === 202) {
echo 'Queued: ' . $body['id'] . ' ' . $body['status'];
} else {
echo 'Refused: ' . $body['error']['code'] . ' ' . $body['error']['message'];
}Respons (202):
{
"id": 9817263,
"status": "queued",
"from": { "id": 101, "phone": "919800000000", "platform": "whatsapp" },
"to": { "phone": "+919876543210", "contact_id": 991 },
"text": "Hi Asha, your order #1042 is ready.",
"media": null,
"send_at": null,
"expires_at": null,
"created_at": "2026-10-18T10:15:02.311Z",
"sent_at": null,
"error": null
}
Body
toobjectwajibSiapa yang menerimanya: tepat satu dari
phone,group,contact_id, atauusername. Lihat Penerima.frominteger or nullWajib kecuali workspace memiliki satu nomor yang terhubungidnomor yang mengirimnya, dari Daftar nomor. Jika tidak dikirim, satu-satunya nomor yang terhubung yang mengirimnya: satu nomor WhatsApp yang terhubung tetap digunakan meskipun ada akun Telegram yang juga terhubung, dan akun Telegram hanya digunakan jika tidak ada nomor WhatsApp yang terhubung. Nomor yang sedang logout tetap diterima: pesannya menunggu sampai nomor itu terhubung kembali.textstringWajib kecuali media dikirimIsi pesan, maksimal 3.000 karakter. Dengan
media, ini menjadi keterangan (caption) dan boleh tidak dikirim. Format WhatsApp berfungsi:*bold*,_italic_,~strikethrough~. Di JSON, tulis baris baru sebagai\n.mediaobject or nullopsionalGambar atau file yang dikirim. Lihat Media.
send_atstring or nullopsionalKirim pada waktu ini, bukan sekarang: ISO 8601 dengan offset-nya, seperti
2026-10-20T09:30:00+05:30. Waktunya harus di masa mendatang. Lihat Penjadwalan dan kedaluwarsa.expires_atstring or nullopsionalJangan kirim setelah waktu ini: pesan menjadi
expired. ISO 8601 dengan offset-nya, di masa mendatang dan setelahsend_at.
Header
AuthorizationheaderwajibBearer wbz_live_…, kunci dengan scopemessages:send.Idempotency-KeyheaderopsionalString unik apa pun, sehingga percobaan ulang tidak pernah mengirim pesan kedua. Lihat Idempotency-Key.
Error saat mengirim#
| HTTP | Kode | Kapan |
|---|---|---|
400 | validation_failed | Ada field yang hilang, jenisnya salah, atau tidak dikenal; to tidak memiliki satu pun atau memiliki beberapa field-nya; media memiliki url dan media_id sekaligus atau tidak satu pun; expires_at tidak setelah send_at |
400 | text_required | Tidak ada text dan tidak ada media |
400 | text_too_long | text lebih dari 3.000 karakter |
400 | invalid_datetime | send_at atau expires_at bukan ISO 8601 dengan offset |
402 | no_credits | Pesan di paket workspace sudah habis |
403 | number_not_allowed | Kunci dibatasi ke nomor lain |
403 | account_disabled | Akun pemilik workspace dinonaktifkan |
422 | invalid_phone | to.phone bukan nomor telepon dalam format internasional dengan + |
422 | invalid_username | to.username bukan username, tautan, atau ID tg: Telegram |
422 | username_needs_telegram | to.username dengan nomor WhatsApp sebagai from |
422 | contact_not_found | Tidak ada kontak dengan to.contact_id tersebut |
422 | media_not_found | Tidak ada file dengan media.media_id tersebut |
422 | invalid_media_url | media.url bukan tautan http(s) publik |
422 | time_in_past | send_at atau expires_at sudah lewat |
422 | number_not_found | from bukan nomor workspace ini |
422 | from_required | Tidak ada from, dan workspace tidak memiliki nomor yang terhubung atau memiliki beberapa |
422 | message_rejected | Pesan tidak dapat dimasukkan ke antrean; message menyebutkan alasannya |
429 | number_daily_cap_reached | Nomor ini sudah mengirim 1.000 pesan dalam 24 jam terakhir |
Pengiriman yang ditolak tidak meninggalkan apa pun: tidak ada pesan yang disimpan, jadi tidak ada yang perlu dibatalkan. Error yang dapat terjadi pada request apa pun (kunci, scope, batas laju, Idempotency-Key) ada di halaman error.
Mengirim ke banyak penerima#
https://wbiztool.com/api/v2/messages/batchBody: JSON (application/json)
Mengirim pesan yang sama ke hingga 1.000 penerima. Body-nya sama dengan Mengirim pesan, kecuali to berupa daftar penerima.
- Semua atau tidak sama sekali. Setiap penerima diperiksa sebelum apa pun masuk antrean, dan seluruh daftar harus muat dalam sisa pesan paket dan dalam kapasitas nomor pengirim untuk 24 jam ke depan. Jika satu penerima salah, tidak ada yang masuk antrean, dan
fieldmenyebutkannya, sepertito[3].phone. - Penerima yang sama dua kali mendapat satu pesan.
- Responsnya
202dengandata: satu Message per penerima, sesuai urutanto.
curl -X POST https://wbiztool.com/api/v2/messages/batch \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: opening-hours-2026-10-20" \
-d '{
"from": 101,
"to": [
{ "phone": "+919876543210" },
{ "phone": "+447700900123" },
{ "group": "Bakery staff" }
],
"text": "We open at 10 tomorrow."
}'import os
import requests
recipients = ["+919876543210", "+447700900123"]
response = requests.post(
"https://wbiztool.com/api/v2/messages/batch",
headers={
"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}",
"Idempotency-Key": "opening-hours-2026-10-20",
},
json={
"from": 101,
"to": [{"phone": p} for p in recipients] + [{"group": "Bakery staff"}],
"text": "We open at 10 tomorrow.",
},
timeout=60,
)
body = response.json()
if response.status_code == 202:
for message in body["data"]:
print(message["id"], message["to"], message["status"])
else:
print("Refused:", body["error"]["code"], body["error"]["field"], body["error"]["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const recipients = ["+919876543210", "+447700900123"];
const response = await fetch("https://wbiztool.com/api/v2/messages/batch", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "opening-hours-2026-10-20",
},
body: JSON.stringify({
from: 101,
to: [...recipients.map((phone) => ({ phone })), { group: "Bakery staff" }],
text: "We open at 10 tomorrow.",
}),
});
const body = await response.json();
if (response.status === 202) {
for (const message of body.data) console.log(message.id, message.to, message.status);
} else {
console.error("Refused:", body.error.code, body.error.field, body.error.message);
}<?php
$recipients = ['+919876543210', '+447700900123'];
$to = array_map(fn ($phone) => ['phone' => $phone], $recipients);
$to[] = ['group' => 'Bakery staff'];
$ch = curl_init('https://wbiztool.com/api/v2/messages/batch');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY'),
'Content-Type: application/json',
'Idempotency-Key: opening-hours-2026-10-20',
],
CURLOPT_POSTFIELDS => json_encode(['from' => 101, 'to' => $to, 'text' => 'We open at 10 tomorrow.']),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
]);
$body = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status === 202) {
foreach ($body['data'] as $message) {
echo $message['id'] . ' ' . $message['status'] . "\n";
}
} else {
echo 'Refused: ' . $body['error']['code'] . ' ' . $body['error']['field'];
}Respons (202), satu Message per penerima; yang kedua dan ketiga mirip dengan yang pertama, dengan to berisi {"phone": "+447700900123", …} dan {"group": "Bakery staff", …}:
{
"data": [
{
"id": 9817264,
"status": "queued",
"from": { "id": 101, "phone": "919800000000", "platform": "whatsapp" },
"to": { "phone": "+919876543210", "contact_id": 991 },
"text": "We open at 10 tomorrow.",
"media": null,
"send_at": null,
"expires_at": null,
"created_at": "2026-10-19T16:02:40.118Z",
"sent_at": null,
"error": null
}
]
}
Error saat mengirim batch#
Sama seperti saat mengirim satu pesan, dengan posisi penerima di field (to[0].phone), ditambah:
| HTTP | Kode | Kapan |
|---|---|---|
400 | too_many_recipients | to berisi lebih dari 1.000 entri |
400 | validation_failed | to kosong atau bukan daftar |
402 | no_credits | Daftar tidak muat dalam sisa pesan: requested dan remaining menunjukkan selisihnya |
429 | number_daily_cap_reached | Daftar tidak muat dalam kapasitas nomor untuk 24 jam ke depan: requested dan room menunjukkan jumlahnya |
Daftar pesan#
https://wbiztool.com/api/v2/messagesPesan workspace dalam 90 hari terakhir, yang terbaru lebih dulu, dalam halaman. Ini termasuk pesan yang dikirim dari dashboard, kampanye, pengingat, integrasi, dan API v1, bukan hanya dari API v2. Kunci yang dibatasi ke sebagian nomor hanya melihat pesan dari nomor-nomor itu.
Parameter query
numberintegeropsionalHanya pesan dari
idnomor ini.statusstringopsionalHanya pesan dengan status ini:
queued,scheduled,sent,delivered,read,failed,cancelled, atauexpired.sincestringopsionalHanya pesan yang dibuat pada atau setelah waktu ini (ISO 8601 dengan offset).
untilstringopsionalHanya pesan yang dibuat sebelum waktu ini (ISO 8601 dengan offset).
limitintegeropsionalPesan per halaman, 1 hingga 100 (default 25).
cursorstringopsionalnext_cursordari halaman terakhir, dengan filter yang sama.
Filter dapat digabungkan. Di query string, tulis + pada offset sebagai %2B (+ biasa tiba sebagai spasi, yang juga dibaca sebagai +), atau gunakan Z.
curl -G https://wbiztool.com/api/v2/messages \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
--data-urlencode "status=failed" \
--data-urlencode "since=2026-10-01T00:00:00+05:30" \
--data-urlencode "limit=100"import os
import requests
headers = {"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}"}
params = {"status": "failed", "since": "2026-10-01T00:00:00+05:30", "limit": 100}
failed = []
while True:
page = requests.get("https://wbiztool.com/api/v2/messages",
headers=headers, params=params, timeout=30).json()
failed += page["data"]
if not page["next_cursor"]:
break
params["cursor"] = page["next_cursor"] # same filters, next page
for message in failed:
print(message["id"], message["to"], message["error"]["message"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const params = new URLSearchParams({ status: "failed", since: "2026-10-01T00:00:00+05:30", limit: "100" });
const failed = [];
while (true) {
const response = await fetch(`https://wbiztool.com/api/v2/messages?${params}`, {
headers: { Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}` },
});
const page = await response.json();
failed.push(...page.data);
if (!page.next_cursor) break;
params.set("cursor", page.next_cursor); // same filters, next page
}
for (const message of failed) console.log(message.id, message.to, message.error.message);<?php
$params = ['status' => 'failed', 'since' => '2026-10-01T00:00:00+05:30', 'limit' => 100];
$failed = [];
do {
$ch = curl_init('https://wbiztool.com/api/v2/messages?' . http_build_query($params));
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$page = json_decode(curl_exec($ch), true);
curl_close($ch);
$failed = array_merge($failed, $page['data']);
$params['cursor'] = $page['next_cursor']; // same filters, next page
} while ($page['next_cursor']);
foreach ($failed as $message) {
echo $message['id'] . ' ' . $message['error']['message'] . "\n";
}Responsnya {"data": [Message, …], "next_cursor": "…" or null}.
Error saat menampilkan daftar#
| HTTP | Kode | Kapan |
|---|---|---|
400 | validation_failed | number bukan ID nomor, status bukan salah satu status, atau limit tidak di antara 1 dan 100 |
400 | invalid_datetime | since atau until bukan ISO 8601 dengan offset |
400 | invalid_cursor | Cursor rusak atau dibuat dengan filter lain |
Mengambil pesan#
https://wbiztool.com/api/v2/messages/{id}Satu pesan beserta statusnya saat ini.
curl https://wbiztool.com/api/v2/messages/9817263 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"import os
import requests
response = requests.get(
"https://wbiztool.com/api/v2/messages/9817263",
headers={"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}"},
timeout=30,
)
message = response.json()
print(message["status"], message["sent_at"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v2/messages/9817263", {
headers: { Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}` },
});
const message = await response.json();
console.log(message.status, message.sent_at);<?php
$ch = curl_init('https://wbiztool.com/api/v2/messages/9817263');
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$message = json_decode(curl_exec($ch), true);
curl_close($ch);
echo $message['status'];Respons (200), pesan yang sudah sampai:
{
"id": 9817263,
"status": "delivered",
"from": { "id": 101, "phone": "919800000000", "platform": "whatsapp" },
"to": { "phone": "+919876543210", "contact_id": 991 },
"text": "Hi Asha, your order #1042 is ready.",
"media": null,
"send_at": null,
"expires_at": null,
"created_at": "2026-10-18T10:15:02.311Z",
"sent_at": "2026-10-18T10:15:09.870Z",
"error": null
}
Pesan yang tidak ada, milik workspace lain, atau (untuk kunci yang dibatasi ke sebagian nomor) dikirim dari nomor lain dijawab dengan 404 message_not_found.
Membatalkan pesan#
https://wbiztool.com/api/v2/messages/{id}Membatalkan pesan yang masih menunggu (queued atau scheduled), siapa pun yang membuatnya. Responsnya 200 dengan Message, yang kini berstatus cancelled. Endpoint webhook mendapat message.cancelled.
Pesan yang sudah dikirim tidak dapat ditarik kembali. Pesan yang sedang diambil oleh nomor pengirim pada saat itu mungkin tetap terkirim, jadi periksa statusnya setelahnya jika hal ini penting.
curl -X DELETE https://wbiztool.com/api/v2/messages/9817263 \
-H "Authorization: Bearer $WBIZTOOL_API_KEY"import os
import requests
response = requests.delete(
"https://wbiztool.com/api/v2/messages/9817263",
headers={"Authorization": f"Bearer {os.environ['WBIZTOOL_API_KEY']}"},
timeout=30,
)
body = response.json()
if response.status_code == 200:
print("Cancelled")
elif body["error"]["code"] == "not_cancellable":
print("Too late, it is", body["error"]["status"])// Node.js 18+ (built-in fetch). Save as .mjs to use top-level await.
const response = await fetch("https://wbiztool.com/api/v2/messages/9817263", {
method: "DELETE",
headers: { Authorization: `Bearer ${process.env.WBIZTOOL_API_KEY}` },
});
const body = await response.json();
if (response.ok) console.log("Cancelled");
else if (body.error.code === "not_cancellable") console.log("Too late, it is", body.error.status);<?php
$ch = curl_init('https://wbiztool.com/api/v2/messages/9817263');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('WBIZTOOL_API_KEY')],
CURLOPT_RETURNTRANSFER => true,
]);
$body = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status === 200 ? 'Cancelled' : $body['error']['code'];Error saat membatalkan#
| HTTP | Kode | Kapan |
|---|---|---|
404 | message_not_found | Tidak ada pesan seperti itu untuk kunci ini |
409 | not_cancellable | Pesan sudah tidak menunggu; status di error menyebutkan statusnya sekarang, seperti sent |
Objek Message#
Setiap operasi di halaman ini merespons dengan objek Message, dan peristiwa webhook membawa satu objek di data.message.
| Field | Jenis | Keterangan |
|---|---|---|
id | integer | ID pesan. Gunakan untuk mengambil atau membatalkan pesan. |
status | string | Posisi pesan saat ini. Lihat Status. |
from | object | Nomor pengirim: id, phone (digitnya dengan kode negara, tanpa +), dan platform (whatsapp atau telegram). |
to | object | Penerima: phone (dengan +), group, atau username, serta contact_id, kontak tersimpan yang dituju. Nomor telepon atau grup yang baru pertama kali dikirimi disimpan sebagai kontak. (contact_id bernilai null hanya untuk pesan uji ke nomor yang tidak tersimpan.) |
text | string | Teks atau keterangan; "" jika tidak ada. |
media | object or null | type (image atau file), url, dan file_name (null untuk gambar). url dapat berupa tautan yang hanya berlaku sementara; jangan simpan. |
send_at | string or null | Waktu pesan dijadwalkan, atau null untuk "sekarang". |
expires_at | string or null | Waktu setelahnya pesan tidak dikirim, atau null. |
created_at | string | Kapan pesan dibuat. |
sent_at | string or null | Kapan pesan dikirim, setelah terkirim (sent, delivered, atau read). |
error | object or null | Untuk pesan failed atau expired, message menyebutkan alasannya, seperti File exceeds WhatsApp size limit (16MB max). Selain itu null. |
Status#
| Status | Arti |
|---|---|
queued | Menunggu untuk dikirim. |
scheduled | Menunggu send_at-nya. |
sent | Terkirim dari nomor Anda (satu centang di WhatsApp). |
delivered | Sampai di ponsel penerima (dua centang). |
read | Dibaca oleh penerima (centang biru). |
failed | Tidak dapat dikirim; error.message menyebutkan alasannya. |
cancelled | Dibatalkan sebelum dikirim: dengan Membatalkan pesan, dari dashboard, atau karena nomor atau kampanyenya dihapus. |
expired | Tidak terkirim sebelum expires_at-nya. |
queued dan scheduled dapat dibatalkan. sent masih dapat menjadi delivered lalu read. failed, cancelled, expired, dan read bersifat final. Webhook melaporkan sent, failed, cancelled, dan expired; untuk melihat delivered dan read, ambil pesannya.
Penerima#
to menerima tepat satu dari field berikut:
| Field | Contoh | Siapa yang menerimanya |
|---|---|---|
phone | {"phone": "+919876543210"} | Nomor telepon dalam format internasional dengan + (E.164). Spasi dan tanda hubung boleh dipakai. |
group | {"group": "Bakery staff"} | Grup WhatsApp tempat nomor pengirim menjadi anggota, berdasarkan nama persisnya (hingga 200 karakter). |
contact_id | {"contact_id": 991} | Kontak yang tersimpan di workspace, berdasarkan ID-nya (misalnya contact_id dari pesan sebelumnya). Pesan dikirim ke nomor atau grup kontak tersebut. |
username | {"username": "@asha_bakes"} | Pengguna Telegram: @name, tautan t.me/name, atau tg: diikuti ID pengguna. Hanya dari akun Telegram, jadi berikan akun Telegram sebagai from (atau pastikan tepat satu yang terhubung). |
Pengiriman ke grup dan Telegram mengharuskan nomor pengirim berada di grup itu atau dapat menjangkau pengguna itu; masalah di sana muncul sebagai pesan failed, bukan sebagai error saat Anda mengirim.
Media#
media mengirim gambar atau file, dengan text sebagai keterangannya. Berikan tepat satu dari url atau media_id:
media.urlstringSalah satu dari url atau media_idTautan
httpatauhttpspublik ke file, hingga 1.000 karakter. Tautan ke alamat privat atau lokal ditolak denganinvalid_media_url.media.media_idintegerSalah satu dari url atau media_idFile di Direktori media workspace, dari Mengunggah file. Unggah file sekali dan kirim sesering yang Anda mau.
media.typestringopsionalimageataufile. Jika tidak dikirim, tautan yang berakhiran.jpg,.jpeg,.png,.gif, atau.webpdikirim sebagai gambar dan yang lainnya sebagai file;media_idmemakai jenis yang digunakan saat file diunggah.media.file_namestringopsionalUntuk
file: nama yang dilihat penerima, sepertiinvoice-1042.pdf(hingga 100 karakter). Jika tidak dikirim, nama diambil dari tautan atau file yang diunggah. Ekstensinya menentukan cara file dikirim, jadi sertakan ekstensi. Diabaikan untuk gambar.
{
"to": { "phone": "+919876543210" },
"text": "Your invoice for order #1042",
"media": { "url": "https://example.com/invoices/1042.pdf", "type": "file", "file_name": "invoice-1042.pdf" }
}
File diambil saat pesan dikirim, bukan saat Anda memanggil API, sehingga tautan yang rusak atau file yang terlalu besar muncul sebagai pesan failed dengan alasannya di error.message. Aturan ukuran dan jenis file sama dengan v1: lihat Mengirim gambar dan file.
Penjadwalan dan kedaluwarsa#
send_atmenjadwalkan pesan. Pesan tetapscheduledsampai waktu itu dan dapat dibatalkan sampai dikirim. Tulis waktu dengan offset-nya, jadi2026-10-20T09:30:00+05:30berarti pukul 09.30 di India. Untuk pesan berulang, gunakan pengingat.expires_atadalah tenggat: jika pesan belum dikirim sampai saat itu (misalnya nomornya sedang logout), pesan menjadiexpiredalih-alih terkirim terlambat. Gunakan untuk kode sekali pakai, waktu pengantaran, dan penawaran. Proses latar belakang menandainya kedaluwarsa paling cepat 30 detik setelah tenggat, jadi jangan mengandalkan tenggat yang lebih pendek dari satu menit.- Keduanya harus di masa mendatang, dan
expires_atharus setelahsend_at.
