API v2 (beta)
Mesej
Hantar mesej sekarang atau pada masa yang ditetapkan, kepada nombor telefon, kumpulan WhatsApp, kenalan yang disimpan atau nama pengguna Telegram. Hantar mesej yang sama kepada sehingga 1,000 penerima dalam satu permintaan, baca sejarah, ikuti status mesej dan batalkannya semasa ia menunggu.
| Operasi | Endpoint | Skop |
|---|---|---|
| Hantar mesej | POST /api/v2/messages | messages:send |
| Hantar kepada ramai penerima | POST /api/v2/messages/batch | messages:send |
| Senaraikan mesej | GET /api/v2/messages | messages:read |
| Dapatkan mesej | GET /api/v2/messages/{id} | messages:read |
| Batalkan mesej | DELETE /api/v2/messages/{id} | messages:send |
Kunci, ralat, Idempotency-Key dan had berfungsi seperti yang diterangkan dalam Gambaran keseluruhan API v2. Untuk mengetahui bila mesej dihantar atau gagal tanpa meninjau berulang kali, tambah endpoint webhook.
Hantar mesej#
https://wbiztool.com/api/v2/messagesBody: JSON (application/json)
Mesej dimasukkan ke dalam baris gilir dan respons tiba sebelum ia dihantar, dengan HTTP 202 dan Message berstatus queued (atau scheduled dengan send_at pada masa hadapan). Ikutinya dengan Dapatkan mesej 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
}
Badan
toobjectwajibSiapa yang menerimanya: tepat satu daripada
phone,group,contact_idatauusername. Lihat Penerima.frominteger or nullWajib kecuali ruang kerja mempunyai satu nombor yang disambungkanidnombor yang menghantarnya, daripada Senaraikan nombor. Jika tidak disertakan, satu-satunya nombor yang disambungkan akan menghantarnya: satu nombor WhatsApp yang disambungkan digunakan walaupun akaun Telegram turut disambungkan, dan akaun Telegram hanya digunakan apabila tiada nombor WhatsApp yang disambungkan. Nombor yang telah log keluar tetap diterima: mesejnya menunggu sehingga ia disambungkan semula.textstringWajib kecuali media dihantarMesej itu, sehingga 3,000 aksara. Dengan
media, ia menjadi kapsyen dan boleh ditinggalkan. Format WhatsApp berfungsi:*bold*,_italic_,~strikethrough~. Dalam JSON, tulis baris baharu sebagai\n.mediaobject or nullpilihanImej atau fail untuk dihantar. Lihat Media.
send_atstring or nullpilihanHantar pada masa ini dan bukannya sekarang: ISO 8601 dengan ofsetnya, seperti
2026-10-20T09:30:00+05:30. Ia mesti pada masa hadapan. Lihat Penjadualan dan tamat tempoh.expires_atstring or nullpilihanJangan hantar selepas masa ini: mesej menjadi
expiredsebaliknya. ISO 8601 dengan ofsetnya, pada masa hadapan dan selepassend_at.
Pengepala
AuthorizationheaderwajibBearer wbz_live_…, kunci dengan skopmessages:send.Idempotency-KeyheaderpilihanSebarang rentetan unik, supaya cubaan semula tidak sekali-kali menghantar mesej kedua. Lihat Idempotency-Key.
Ralat semasa menghantar#
| HTTP | Kod | Bila |
|---|---|---|
400 | validation_failed | Medan tiada, jenisnya salah atau tidak dikenali; to tidak mempunyai satu pun atau mempunyai beberapa medannya; media mempunyai kedua-dua atau tiada satu pun daripada url dan media_id; expires_at tidak selepas send_at |
400 | text_required | Tiada text dan tiada media |
400 | text_too_long | text melebihi 3,000 aksara |
400 | invalid_datetime | send_at atau expires_at bukan ISO 8601 dengan ofset |
402 | no_credits | Ruang kerja tiada mesej berbaki dalam pelannya |
403 | number_not_allowed | Kunci dihadkan kepada nombor lain |
403 | account_disabled | Akaun pemilik ruang kerja dinyahdayakan |
422 | invalid_phone | to.phone bukan nombor telefon dalam format antarabangsa dengan + |
422 | invalid_username | to.username bukan nama pengguna, pautan atau ID tg: Telegram |
422 | username_needs_telegram | to.username dengan nombor WhatsApp sebagai from |
422 | contact_not_found | Tiada kenalan dengan to.contact_id itu |
422 | media_not_found | Tiada fail dengan media.media_id itu |
422 | invalid_media_url | media.url bukan pautan http(s) awam |
422 | time_in_past | send_at atau expires_at telah berlalu |
422 | number_not_found | from bukan nombor ruang kerja ini |
422 | from_required | Tiada from, dan ruang kerja tiada nombor yang disambungkan atau mempunyai beberapa |
422 | message_rejected | Mesej tidak dapat dimasukkan ke dalam baris gilir; message menyatakan sebabnya |
429 | number_daily_cap_reached | Nombor itu telah menghantar 1,000 mesej dalam 24 jam yang lalu |
Penghantaran yang ditolak tidak meninggalkan apa-apa: tiada mesej disimpan, jadi tiada apa yang perlu dibatalkan. Ralat yang boleh berlaku pada sebarang permintaan (kunci, skop, had kadar, Idempotency-Key) ada di halaman ralat.
Hantar kepada ramai penerima#
https://wbiztool.com/api/v2/messages/batchBody: JSON (application/json)
Menghantar mesej yang sama kepada sehingga 1,000 penerima. Badannya sama seperti Hantar mesej, kecuali to ialah senarai penerima.
- Semua atau tiada. Setiap penerima disemak sebelum apa-apa dimasukkan ke dalam baris gilir, dan seluruh senarai mesti muat dalam baki mesej pelan dan dalam ruang nombor penghantar untuk 24 jam yang akan datang. Jika satu penerima salah, tiada apa yang dimasukkan ke dalam baris gilir, dan
fieldmenamakannya, sepertito[3].phone. - Penerima yang sama dua kali mendapat satu mesej.
- Responsnya ialah
202dengandata: satu Message bagi setiap penerima, mengikut susunanto.
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 bagi setiap penerima; yang kedua dan ketiga kelihatan seperti yang pertama, dengan to ditetapkan kepada {"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
}
]
}
Ralat semasa menghantar kelompok#
Sama seperti semasa menghantar satu mesej, dengan kedudukan penerima dalam field (to[0].phone), dan juga:
| HTTP | Kod | Bila |
|---|---|---|
400 | too_many_recipients | to mempunyai lebih daripada 1,000 entri |
400 | validation_failed | to kosong atau bukan senarai |
402 | no_credits | Senarai tidak muat dalam baki mesej: requested dan remaining menunjukkan berapa banyak lebihnya |
429 | number_daily_cap_reached | Senarai tidak muat dalam ruang nombor untuk 24 jam yang akan datang: requested dan room menunjukkan jumlahnya |
Senaraikan mesej#
https://wbiztool.com/api/v2/messagesMesej ruang kerja dalam 90 hari yang lalu, yang terbaharu dahulu, dalam halaman. Ini termasuk mesej yang dihantar dari papan pemuka, kempen, peringatan, integrasi dan API v1, bukan hanya mesej API v2. Kunci yang dihadkan kepada sebahagian nombor hanya melihat mesej nombor itu.
Parameter pertanyaan
numberintegerpilihanHanya mesej daripada
idnombor ini.statusstringpilihanHanya mesej dengan status ini:
queued,scheduled,sent,delivered,read,failed,cancelledatauexpired.sincestringpilihanHanya mesej yang dicipta pada atau selepas masa ini (ISO 8601 dengan ofset).
untilstringpilihanHanya mesej yang dicipta sebelum masa ini (ISO 8601 dengan ofset).
limitintegerpilihanMesej bagi setiap halaman, 1 hingga 100 (lalai 25).
cursorstringpilihannext_cursorhalaman terakhir, dengan penapis yang sama.
Penapis boleh digabungkan. Dalam rentetan pertanyaan, tulis + pada ofset sebagai %2B (+ biasa tiba sebagai ruang, yang turut 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 ialah {"data": [Message, …], "next_cursor": "…" or null}.
Ralat semasa menyenaraikan#
| HTTP | Kod | Bila |
|---|---|---|
400 | validation_failed | number bukan ID nombor, status bukan salah satu status, atau limit bukan 1 hingga 100 |
400 | invalid_datetime | since atau until bukan ISO 8601 dengan ofset |
400 | invalid_cursor | Kursor rosak atau dicipta dengan penapis lain |
Dapatkan mesej#
https://wbiztool.com/api/v2/messages/{id}Satu mesej dan statusnya sekarang.
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), mesej yang telah 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
}
Mesej yang tidak wujud, milik ruang kerja lain, atau (bagi kunci yang dihadkan kepada sebahagian nombor) dihantar dari nombor lain menjawab 404 message_not_found.
Batalkan mesej#
https://wbiztool.com/api/v2/messages/{id}Membatalkan mesej yang masih menunggu (queued atau scheduled), tidak kira siapa yang menciptanya. Responsnya ialah 200 dengan Message, kini berstatus cancelled. Endpoint webhook mendapat message.cancelled.
Mesej yang telah dihantar tidak boleh ditarik semula. Mesej yang sedang diambil oleh nombor penghantar pada saat itu mungkin masih dihantar, jadi semak statusnya selepas itu jika ia 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'];Ralat semasa membatalkan#
| HTTP | Kod | Bila |
|---|---|---|
404 | message_not_found | Tiada mesej sedemikian untuk kunci ini |
409 | not_cancellable | Ia tidak lagi menunggu; status dalam ralat menyatakan statusnya sekarang, seperti sent |
Objek Message#
Setiap operasi di halaman ini menjawab dengan objek Message, dan peristiwa webhook membawa satu dalam data.message.
| Medan | Jenis | Penerangan |
|---|---|---|
id | integer | ID mesej. Gunakannya untuk mendapatkan atau membatalkan mesej. |
status | string | Kedudukannya sekarang. Lihat Status. |
from | object | Nombor penghantar: id, phone (digitnya dengan kod negara, tanpa +) dan platform (whatsapp atau telegram). |
to | object | Penerima: phone (dengan +), group atau username, dan contact_id, kenalan yang disimpan yang menerimanya. Nombor telefon atau kumpulan yang dihantar buat kali pertama disimpan sebagai kenalan. (contact_id ialah null hanya bagi mesej ujian kepada nombor yang tidak disimpan.) |
text | string | Teks atau kapsyen; "" apabila tiada. |
media | object or null | type (image atau file), url dan file_name (null bagi imej). url mungkin pautan yang berfungsi untuk masa terhad sahaja; jangan simpannya. |
send_at | string or null | Masa ia dijadualkan, atau null untuk "sekarang". |
expires_at | string or null | Masa selepasnya ia tidak dihantar, atau null. |
created_at | string | Bila ia dicipta. |
sent_at | string or null | Bila ia dihantar, setelah ia dihantar (sent, delivered atau read). |
error | object or null | Bagi mesej failed atau expired, message menyatakan sebabnya, seperti File exceeds WhatsApp size limit (16MB max). Jika tidak, null. |
Status#
| Status | Maksud |
|---|---|
queued | Menunggu untuk dihantar. |
scheduled | Menunggu send_at-nya. |
sent | Dihantar dari nombor anda (satu tanda di WhatsApp). |
delivered | Sampai ke telefon penerima (dua tanda). |
read | Dibaca oleh penerima (tanda biru). |
failed | Ia tidak dapat dihantar; error.message menyatakan sebabnya. |
cancelled | Dibatalkan sebelum dihantar: dengan Batalkan mesej, dari papan pemuka, atau kerana nombor atau kempennya dibuang. |
expired | Tidak dihantar sebelum expires_at-nya. |
queued dan scheduled boleh dibatalkan. sent masih boleh menjadi delivered dan kemudian read. failed, cancelled, expired dan read adalah muktamad. Webhook melaporkan sent, failed, cancelled dan expired; untuk melihat delivered dan read, dapatkan mesej itu.
Penerima#
to menerima tepat satu daripada medan ini:
| Medan | Contoh | Siapa yang menerimanya |
|---|---|---|
phone | {"phone": "+919876543210"} | Nombor telefon dalam format antarabangsa dengan + (E.164). Ruang dan sengkang dibenarkan. |
group | {"group": "Bakery staff"} | Kumpulan WhatsApp yang disertai oleh nombor penghantar, mengikut nama tepatnya (sehingga 200 aksara). |
contact_id | {"contact_id": 991} | Kenalan yang disimpan dalam ruang kerja, mengikut ID-nya (contohnya contact_id daripada mesej sebelumnya). Ia dihantar ke nombor atau kumpulan kenalan itu. |
username | {"username": "@asha_bakes"} | Pengguna Telegram: @name, pautan t.me/name, atau tg: diikuti ID pengguna. Hanya dari akaun Telegram, jadi berikan satu sebagai from (atau pastikan tepat satu disambungkan). |
Penghantaran ke kumpulan dan Telegram memerlukan nombor penghantar berada dalam kumpulan itu atau dapat menghubungi pengguna itu; masalah di sana muncul sebagai mesej failed, bukan sebagai ralat semasa anda menghantar.
Media#
media menghantar imej atau fail, dengan text sebagai kapsyennya. Berikan tepat satu daripada url atau media_id:
media.urlstringSama ada url atau media_idPautan
httpatauhttpsawam ke fail, sehingga 1,000 aksara. Pautan ke alamat peribadi atau setempat ditolak denganinvalid_media_url.media.media_idintegerSama ada url atau media_idFail dalam Direktori media ruang kerja, daripada Muat naik fail. Muat naik fail sekali dan hantarnya sekerap yang anda mahu.
media.typestringpilihanimageataufile. Jika tidak disertakan, pautan yang berakhir dengan.jpg,.jpeg,.png,.gifatau.webpdihantar sebagai imej dan yang lain sebagai fail;media_idmenggunakan jenis yang digunakan semasa fail dimuat naik.media.file_namestringpilihanBagi
file: nama yang dilihat oleh penerima, sepertiinvoice-1042.pdf(sehingga 100 aksara). Jika tidak disertakan, nama diambil daripada pautan atau fail yang dimuat naik. Sambungan failnya menentukan cara fail dihantar, jadi sertakan satu. Diabaikan bagi imej.
{
"to": { "phone": "+919876543210" },
"text": "Your invoice for order #1042",
"media": { "url": "https://example.com/invoices/1042.pdf", "type": "file", "file_name": "invoice-1042.pdf" }
}
Fail diambil semasa mesej dihantar, bukan semasa anda memanggil API, jadi pautan yang rosak atau fail yang terlalu besar muncul sebagai mesej failed dengan sebabnya dalam error.message. Peraturan saiz dan jenis adalah sama seperti v1: lihat Menghantar imej dan fail.
Penjadualan dan tamat tempoh#
send_atmenjadualkan mesej. Ia kekalscheduledsehingga masa itu dan boleh dibatalkan sehingga ia dihantar. Tulis masa dengan ofsetnya, jadi2026-10-20T09:30:00+05:30bermaksud 09:30 di India. Untuk mesej yang berulang, gunakan peringatan.expires_atialah tarikh akhir: jika mesej belum dihantar menjelang masa itu (contohnya nombor telah log keluar), ia menjadiexpireddan bukannya dihantar lewat. Gunakannya untuk kod sekali guna, masa penghantaran dan tawaran. Tugas latar belakang menandakannya tamat tempoh sekurang-kurangnya 30 saat selepas tarikh akhir, jadi jangan bergantung pada tarikh akhir yang lebih pendek daripada seminit.- Kedua-duanya mesti pada masa hadapan, dan
expires_atmesti selepassend_at.
