Pesan & Percakapan
Messages API memungkinkan Anda mengirim pesan ke kontak mana pun, membaca kembali percakapan, mengoreksi atau menghapus pesan yang sudah Anda kirim, memberikan reaksi pada pesan, menarik utas sesi obrolan lengkap, mengekspor transkrip, dan menandai obrolan sebagai sudah atau belum dibaca — semuanya tanpa perlu membuka kotak masuk.
Semua jalur di halaman ini relatif terhadap URL dasar https://api.youraiconnector.com/v1. Setiap permintaan memerlukan kunci API Anda — lihat Autentikasi untuk daftar lengkap cara mengirimkannya. Contoh di bawah menggunakan header X-API-Key, dengan satu contoh cURL yang juga menunjukkan formulir kueri ?apiKey=.
Cara kerja pengiriman: Mengirim pesan tidak menunggu pesan tersebut sampai. API menerima pesan Anda, segera mengembalikan ID pesan, lalu mengirimkannya di latar belakang melalui saluran kontak (WhatsApp, SMS, Instagram, dan sebagainya). Untuk melacak apakah pesan benar-benar terkirim atau telah dibaca, dengarkan pembaruan status dengan Webhook — jangan melakukan polling. Respons pengiriman hanya mengonfirmasi bahwa pesan telah diterima.
Mengirim pesan
Ada dua cara untuk mengirim. Pilih yang paling sesuai dengan cara Anda mengidentifikasi kontak:
- Kirim berdasarkan ID kontak — Anda sudah mengetahui ID kontak tersebut (misalnya, Anda membuat kontak melalui API atau mendapatkannya dari webhook). Gunakan
POST /contacts/{contactId}/send-message. - Kirim berdasarkan identitas kontak — Anda mengetahui nomor telepon, ID Instagram, dll. milik kontak tersebut, tetapi bukan ID internal mereka. Gunakan
POST /contacts/senddan biarkan platform menemukan kontak yang tepat.
Keduanya mengantrekan pesan dengan cara yang sama dan mengirimkannya melalui saluran apa pun yang digunakan kontak tersebut. Anda tidak perlu memilih transportasi — platform merutekan kontak WhatsApp melalui WhatsApp, kontak SMS melalui SMS, dan seterusnya.
Kirim berdasarkan ID kontak
POST /contacts/{contactId}/send-message
| Bidang | Wajib | Deskripsi |
|---|---|---|
body |
Ya | Teks pesan yang akan dikirim. |
mediaUrl |
Tidak | URL file media (gambar, dokumen, dll.) untuk dilampirkan. |
mediaContentType |
Tidak | Tipe MIME dari media yang dilampirkan, contohnya image/jpeg. |
pauseBot |
Tidak | true menjeda AI untuk kontak ini saat pesan dikirim — untuk pengambilalihan oleh manusia. Lihat Jeda atau lanjutkan AI. |
clearIncompleteReply |
Tidak | true membuang balasan bot yang setengah jadi agar tidak dilanjutkan setelah pesan Anda. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/send-message",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
body: "Hi! Your appointment is confirmed for tomorrow at 10:00.",
}),
}
);
const data = await res.json();
console.log(data.messageId);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/send-message",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"body": "Hi! Your appointment is confirmed for tomorrow at 10:00."},
)
print(res.json()["messageId"])
Respons (200 OK):
{
"success": true,
"messageId": "aB3dE5fG7hI9jK1lM2nO",
"contactId": "contact123",
"channel": "whatsapp",
"message": "Message created successfully. Delivery is being processed."
}
Kirim berdasarkan identitas kontak
POST /contacts/send
Gunakan ini jika Anda tidak memiliki ID internal kontak. Berikan body pesan ditambah salah satu dari contact_id, atau channel bersama dengan bidang identitas yang cocok dengan saluran tersebut.
| Bidang | Wajib | Deskripsi |
|---|---|---|
body |
Ya | Teks pesan yang akan dikirim. |
contact_id |
Tidak | ID kontak yang sudah ada. Jika diatur, bidang identitas di bawah tidak diperlukan. |
channel |
Tidak | Saluran untuk mengirim pesan. Wajib diisi jika contact_id tidak diberikan. Salah satu dari 14 saluran yang dapat mengirim pesan keluar: whatsapp, whatsapp_web, sms, instagram, instagram_private, messenger, telegram, chat-widget, custom, email, line, imessage, linkedin, viber. |
phone_number |
Tidak | Nomor telepon kontak dalam format internasional. Digunakan dengan whatsapp, whatsapp_web, dan sms. |
instagram_id |
Tidak | ID pengguna Instagram kontak. Digunakan dengan instagram. |
messenger_id |
Tidak | ID pengguna Messenger kontak. Digunakan dengan messenger. |
telegram_user_id |
Tidak | ID pengguna Telegram kontak. Digunakan dengan telegram. |
media_url |
Tidak | URL file media untuk dilampirkan. |
media_content_type |
Tidak | Tipe MIME dari media yang dilampirkan, contohnya image/jpeg. |
Saluran mana yang dapat diselesaikan berdasarkan identitas. Hanya enam dari 14 saluran yang menerima bidang identitas sebagai pengganti contact_id: whatsapp, whatsapp_web dan sms dicari berdasarkan phone_number, instagram berdasarkan instagram_id, messenger berdasarkan messenger_id, dan telegram berdasarkan telegram_user_id. Delapan saluran lainnya — instagram_private, chat-widget, custom, email, line, imessage, linkedin dan viber — tidak memiliki identitas publik untuk dicari, sehingga pengiriman pada saluran tersebut memerlukan contact_id; mengirim channel saja akan mengembalikan 400 yang memberi tahu Anda bahwa contact_id diperlukan.
cURL (menggunakan formulir kueri ?apiKey=)
curl -X POST "https://api.youraiconnector.com/v1/contacts/send?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel": "whatsapp",
"phone_number": "+31612345678",
"body": "Hi! Your appointment is confirmed."
}'
JavaScript
const res = await fetch("https://api.youraiconnector.com/v1/contacts/send", {
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
channel: "whatsapp",
phone_number: "+31612345678",
body: "Hi! Your appointment is confirmed.",
}),
});
const data = await res.json();
console.log(data.message_id, data.channel);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/send",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"channel": "whatsapp",
"phone_number": "+31612345678",
"body": "Hi! Your appointment is confirmed.",
},
)
data = res.json()
print(data["message_id"], data["channel"])
Respons (201 Created):
{
"success": true,
"message_id": "aB3dE5fG7hI9jK1lM2nO",
"contact_id": "contact123",
"channel": "whatsapp"
}
Mengapa pesan mungkin ditolak: Kontak dengan mode jangan ganggu atau mode pribadi aktif tidak dapat menerima pesan keluar — permintaan akan gagal dengan
422. Jika tidak ada kontak yang cocok dengan ID atau identitas yang Anda berikan, Anda akan mendapatkan404.
Mencantumkan pesan kontak
GET /contacts/{contactId}/messages
Mengembalikan pesan kontak, yang terbaru terlebih dahulu, dengan penomoran halaman berbasis kursor.
| Parameter kueri | Wajib | Deskripsi |
|---|---|---|
limit |
Tidak | Ukuran halaman. Default 50, maksimum 100. |
cursor |
Tidak | Nilai next_cursor dari respons sebelumnya. Mengembalikan pesan yang lebih lama dari kursor. |
filter |
Tidak | Filter berdasarkan tipe konten: all (default), text, media, atau tool_use. |
direction |
Tidak | Filter berdasarkan arah: all (default), inbound (diterima dari kontak), atau outbound (dikirim oleh Anda). |
Catatan tentang pemfilteran dan penomoran halaman: Filter
filterdandirectionditerapkan ke setiap halaman setelah dibaca, sehingga halaman yang difilter dapat berisi lebih sedikit item daripadalimit.next_cursortetap berlanjut melalui percakapan penuh, jadi terus lakukan penomoran halaman hingganext_cursoradalahnull.
cURL
curl "https://api.youraiconnector.com/v1/contacts/contact123/messages?limit=50&direction=inbound" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({ limit: "50", direction: "inbound" });
const res = await fetch(
`https://api.youraiconnector.com/v1/contacts/contact123/messages?${params}`,
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.messages, data.next_cursor);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/contacts/contact123/messages",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"limit": 50, "direction": "inbound"},
)
data = res.json()
print(data["messages"], data["next_cursor"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"messages": [
{
"id": "aB3dE5fG7hI9jK1lM2nO",
"body": "Hi! Thanks for reaching out.",
"direction": "inbound",
"channel": "whatsapp",
"status": "delivered",
"type": null,
"timestamp": "2026-06-01T10:00:00.000Z",
"media_url": null,
"media_content_type": null,
"bot_reply": false
}
],
"next_cursor": "cD4eF6gH8iJ0kL2mN3oP"
}
Bidang pesan
| Bidang | Deskripsi |
|---|---|
id |
ID unik pesan. |
body |
Konten teks pesan. |
direction |
inbound (diterima dari kontak) atau outbound (dikirim oleh akun Anda). |
channel |
Saluran tempat pesan dikirim atau diterima (misalnya whatsapp, sms, instagram). |
status |
Status pengiriman saat ini, misalnya Created, sent, delivered, read, failed. |
type |
Jenis pesan. Pesan teks biasa memiliki jenis null; aktivitas alat asisten otomatis ditandai tool_use. |
timestamp |
Waktu ISO 8601 saat pesan dibuat. |
media_url |
URL file media yang dilampirkan, jika ada. |
media_content_type |
Jenis MIME media yang dilampirkan, jika ada. |
bot_reply |
true saat pesan dihasilkan oleh asisten AI. |
score |
Penilaian Anda terhadap pesan: 1 jempol ke atas, -1 jempol ke bawah, 0 saat belum dinilai. Lihat Beri nilai atau bintang pada pesan. |
is_important |
true saat pesan telah diberi bintang. |
is_deleted |
true saat pesan telah dihapus. Pesan yang dihapus tetap ada dalam daftar tetapi body dan media_url-nya kosong. |
reactions |
Reaksi emoji pada pesan, dari kedua belah pihak. Selalu berupa array — kosong jika tidak ada. Setiap entri memiliki emoji, from_phone_number, from_me (true saat reaksi tersebut adalah milik Anda) dan reacted_at. |
Daftar sesi obrolan
Sesi obrolan adalah satu jendela percakapan dengan kontak: sesi terbuka saat mereka mulai berbicara dan ditutup saat percakapan selesai. Sesi adalah cara Anda membagi riwayat panjang menjadi percakapan yang dapat dibaca, alih-alih satu daftar yang tidak ada habisnya.
Sesi terbaru di semua kontak
GET /chat-sessions/recent
Mengembalikan sesi yang dimulai dalam X jam terakhir, yang terbaru terlebih dahulu, di seluruh kontak pada akun tersebut.
| Parameter kueri | Wajib | Deskripsi |
|---|---|---|
hours |
Ya | Berapa jam untuk melihat ke belakang. Harus berupa bilangan bulat positif. |
status |
Tidak | Hanya kembalikan sesi dengan status ini: ChatSessionOpened atau ChatSessionClosed. |
limit |
Tidak | Jumlah maksimum sesi yang akan dikembalikan. Default 100, maksimum 100. |
includeMessages |
Tidak | true menambahkan array messages ke setiap sesi. Nonaktif secara default karena membuat respons menjadi jauh lebih besar. |
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/recent?hours=24&status=ChatSessionClosed" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const params = new URLSearchParams({ hours: "24", status: "ChatSessionClosed" });
const res = await fetch(`https://api.youraiconnector.com/v1/chat-sessions/recent?${params}`, {
headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();
console.log(data.data.total_sessions, data.data.sessions);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/chat-sessions/recent",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"hours": 24, "status": "ChatSessionClosed"},
)
data = res.json()["data"]
print(data["total_sessions"], data["sessions"])
Respons (200 OK):
{
"success": true,
"data": {
"hours_ago": 24,
"total_sessions": 2,
"sessions": [
{
"session_id": "session456",
"contact_id": "contact123",
"contact_name": "Jane Doe",
"contact_phone": "+31612345678",
"contact_email": "jane@example.com",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"status": "ChatSessionClosed",
"tag": "Booking enquiry"
}
]
}
}
Semua sesi untuk satu kontak
GET /chat-sessions/{contactId}
Mengembalikan setiap sesi obrolan untuk satu kontak. Parameter status, limit, dan includeMessages sama seperti di atas — hours tidak berlaku di sini.
cURL
curl "https://api.youraiconnector.com/v1/chat-sessions/contact123?limit=20" \
-H "X-API-Key: YOUR_API_KEY"
Respons (200 OK):
{
"success": true,
"data": {
"contact_id": "contact123",
"contact_name": "Jane Doe",
"total_sessions": 2,
"sessions": [
{
"id": "session456",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"status": "ChatSessionClosed",
"tag": "Booking enquiry"
}
]
}
}
Nama bidang ID sesi berbeda di antara kedua endpoint. Daftar sesi terbaru menyebutnya
session_id(ini juga memuat detail kontak, karena sesi berasal dari banyak kontak); daftar per-kontak menyebutnyaid. Nilai mana pun adalah yang Anda berikan sebagai{sessionId}saat mengambil utas lengkap di bawah.
Saat includeMessages=true, setiap sesi mendapatkan array messages yang entri-entrinya memuat id, body, direction, timestamp, type, channel, dan status.
Mengambil utas sesi obrolan
GET /contacts/{contactId}/chat-sessions/{sessionId}/messages
Sesi obrolan mengelompokkan pesan kontak ke dalam satu jendela percakapan. Titik akhir ini mengembalikan utas lengkap dari satu sesi, dari yang terlama, beserta metadata sesi tersebut. Anda dapat menemukan ID sesi untuk kontak melalui titik akhir sesi obrolan.
cURL
curl "https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
{ headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.session, data.messages);
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/contacts/contact123/chat-sessions/session456/messages",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["session"], data["messages"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"session": {
"id": "session456",
"status": "ChatSessionClosed",
"start_date_time": "2026-06-01T09:55:00.000Z",
"end_date_time": "2026-06-01T10:20:00.000Z",
"tag": "Booking enquiry"
},
"messages": [
{
"id": "aB3dE5fG7hI9jK1lM2nO",
"body": "Hi! Thanks for reaching out.",
"direction": "inbound",
"channel": "whatsapp",
"status": "delivered",
"type": null,
"timestamp": "2026-06-01T09:55:00.000Z",
"media_url": null,
"media_content_type": null,
"bot_reply": false
}
]
}
Objek session melaporkan status (ChatSessionOpened saat aktif, ChatSessionClosed setelah berakhir), start_date_time, end_date_time, dan tag yang dapat dibaca manusia. Larik messages menggunakan bidang pesan yang sama dengan titik akhir daftar.
Edit, hapus, dan bereaksi terhadap pesan
Endpoint ini mengubah pesan setelah dikirim. Dua di antaranya menjangkau saluran kontak serta salinan Anda sendiri, jadi bacalah pengantar bagian sebelum menghubungkannya — apa yang mungkin dilakukan sepenuhnya bergantung pada saluran tempat percakapan berlangsung.
Apa yang diizinkan oleh setiap saluran
| Tindakan | Saluran yang dapat mengubah salinan kontak | Batas waktu |
|---|---|---|
| Edit pesan yang terkirim | Widget obrolan, WhatsApp Web, Telegram, LinkedIn | Tidak ada pada widget obrolan, 15 menit pada WhatsApp Web, 48 jam pada Telegram, 60 menit pada LinkedIn |
| Hapus untuk semua orang | Widget obrolan, WhatsApp Web, Telegram, LinkedIn | 60 menit pada LinkedIn; yang lainnya tidak memiliki batas yang dipublikasikan |
| Bereaksi dengan emoji | WhatsApp Web, Telegram | Tidak ada |
Pada setiap saluran lain — WhatsApp Business API, SMS, Instagram, Messenger, email, LINE, saluran kustom — penghapusan tetap menghapus pesan dari kotak masuk Anda, tetapi kontak tetap menyimpan salinannya, dan pengeditan atau reaksi sama sekali tidak dimungkinkan.
Edit pesan
POST /contacts/{contactId}/messages/{messageId}/edit
Menulis ulang pesan yang sudah Anda kirim, baik di perangkat kontak maupun di salinan Anda.
| Bidang | Wajib | Deskripsi |
|---|---|---|
body |
Ya | Teks pesan baru. Tidak boleh kosong dan maksimal 4096 karakter. |
Tidak seperti penghapusan, tindakan ini gagal dengan notifikasi jika saluran menolak: Anda mendapatkan 409 dan salinan Anda dibiarkan persis seperti yang dimiliki kontak, karena menampilkan editan yang tidak pernah mereka terima akan membuat kedua sisi tidak sinkron. Bidang edit_reason memberi tahu Anda alasannya — jendela edit saluran telah ditutup, saluran terputus, atau terjadi kesalahan lain.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "body": "Sorry - I meant Thursday at 3pm." }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ body: "Sorry - I meant Thursday at 3pm." }),
}
);
const data = await res.json();
console.log(data.edited, data.edit_reason);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/edit",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"body": "Sorry - I meant Thursday at 3pm."},
)
data = res.json()
print(data.get("edited"), data.get("edit_reason"))
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"edited": true,
"edit_reason": "edit_dispatched"
}
Jika saluran tidak menerima editan tersebut, Anda akan mendapatkan 409 sebagai gantinya, dan tidak ada yang diubah:
{
"success": false,
"error": "The message could not be edited",
"edit_reason": "channel_disconnected"
}
Pesan yang sudah dihapus, saluran yang sama sekali tidak dapat mengedit, dan pesan yang terlalu lama untuk salurannya, semuanya mengembalikan 400 — permintaan tidak pernah mencapai saluran tersebut.
Hapus satu pesan
DELETE /contacts/{contactId}/messages/{messageId}
Menghapus pesan dari percakapan Anda dan, jika saluran mengizinkannya, menarik kembali salinan kontak juga. Tidak ada isi permintaan.
Ini selalu menjawab 200 jika pesan tersebut ada, meskipun salinan kontak tidak dapat ditarik kembali — salinan Anda sudah hilang, jadi kesalahan akan menyesatkan. Baca ketiga bidang dalam respons untuk memberi tahu pengguna apa yang sebenarnya terjadi:
| Bidang | Deskripsi |
|---|---|
revoke_supported |
Apakah saluran ini dapat menarik kembali pesan atau tidak. |
revoked |
Apakah salinan di perangkat kontak telah dihapus. |
revoke_reason |
Mengapa pesan tidak dihapus, saat revoked adalah false — contohnya revoke_window_closed atau already_deleted. |
cURL
curl -X DELETE "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
{ method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.revoked, data.revoke_reason);
Python
import requests
res = requests.delete(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()
print(data["revoked"], data["revoke_reason"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"revoke_supported": true,
"revoked": true,
"revoke_reason": "revoke_dispatched"
}
Pesan yang dihapus tidak akan hilang dari riwayat percakapan. Pesan tersebut tetap ada di
GET /contacts/{contactId}/messagesdenganis_deleted: truesertabodydanmedia_urlyang kosong.
Menghapus beberapa pesan sekaligus
POST /contacts/{contactId}/messages/bulk-delete
Menghapus sekumpulan pesan hanya dari sisi Anda. Isi dan lampiran akan dikosongkan, namun tidak ada yang ditarik kembali di perangkat kontak — untuk menarik kembali pesan, hapuslah satu per satu menggunakan endpoint pesan tunggal di atas.
| Bidang | Wajib | Deskripsi |
|---|---|---|
message_ids |
Ya | Array ID pesan yang tidak kosong, maksimal 500 per permintaan. messageIds diterima sebagai alias. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "message_ids": ["msg_1", "msg_2"] }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ message_ids: ["msg_1", "msg_2"] }),
}
);
console.log((await res.json()).deleted);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/bulk-delete",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"message_ids": ["msg_1", "msg_2"]},
)
print(res.json()["deleted"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"deleted": 2
}
Memberikan reaksi pada pesan
POST /contacts/{contactId}/messages/{messageId}/react
Memberikan reaksi emoji Anda sendiri pada sebuah pesan, atau menariknya kembali dengan mengirimkan string kosong. Reaksi milik kontak tidak akan pernah diubah.
| Bidang | Wajib | Deskripsi |
|---|---|---|
emoji |
Ya | Emoji untuk memberikan reaksi, atau "" untuk menghapus reaksi Anda. Harus berupa string tunggal tanpa spasi, maksimal 16 karakter. |
Seperti halnya pengeditan, tindakan ini akan gagal alih-alih menampilkan reaksi yang tidak pernah diterima oleh kontak, dan kegagalan tersebut memberi tahu Anda apakah percobaan ulang layak dilakukan:
422— pesan tidak akan pernah bisa dikirimkan dalam percakapan ini: saluran tidak mendukung reaksi, pesan tidak memiliki ID sisi saluran, atau emoji berada di luar rangkaian yang diizinkan oleh saluran tersebut.409— saluran tidak dapat dijangkau untuk sementara. Percobaan ulang mungkin berhasil.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "emoji": "👍" }'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ emoji: "👍" }),
}
);
const data = await res.json();
console.log(data.reactions);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1/react",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"emoji": "👍"},
)
print(res.json()["reactions"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"reaction_supported": true,
"reaction_reason": "reaction_dispatched",
"reactions": [
{
"emoji": "👍",
"from_phone_number": "+31612345678",
"from_me": true,
"reacted_at": "2026-06-01T10:05:00.000Z"
}
]
}
Array reactions adalah rangkaian lengkap reaksi yang ada pada pesan saat ini, baik milik Anda maupun milik kontak. Pada 409 atau 422, array ini dikembalikan tanpa perubahan, sehingga klien yang melakukan rendering langsung darinya tidak akan pernah menampilkan reaksi yang tidak terkirim.
Memberi peringkat atau menandai pesan
PATCH /contacts/{contactId}/messages/{messageId}
Memberi peringkat jempol ke atas atau jempol ke bawah pada pesan dan/atau menandainya sebagai penting. Ini hanyalah pencatatan di sisi Anda saja — tidak ada yang dikirimkan ke kontak.
| Bidang | Wajib | Deskripsi |
|---|---|---|
score |
Tidak | 1 jempol ke atas, -1 jempol ke bawah, 0 menghapus peringkat. |
is_important |
Tidak | true memberi bintang pada pesan, false menghapus bintangnya. Harus berupa boolean asli, bukan string "true". |
Kirim setidaknya salah satu dari keduanya, atau Anda akan mendapatkan 400. Hanya apa yang Anda kirim yang akan ditulis, jadi memberi bintang pada pesan tidak akan pernah menghapus peringkatnya dan sebaliknya — dan respons hanya akan menggemakan kembali bidang yang Anda kirim.
cURL
curl -X PATCH "https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "score": 1, "is_important": true }'
JavaScript
await fetch("https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1", {
method: "PATCH",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ score: 1, is_important: true }),
});
Python
import requests
requests.patch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/msg_1",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"score": 1, "is_important": True},
)
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"message_id": "msg_1",
"score": 1,
"is_important": true
}
Menandai pesan sebagai telah dibaca
Anda dapat menghapus status belum dibaca baik untuk pesan tertentu maupun untuk keseluruhan percakapan.
Menandai pesan tertentu sebagai telah dibaca
POST /contacts/{contactId}/messages/mark-read
Teruskan ID pesan yang akan ditandai sebagai telah dibaca.
| Bidang | Wajib | Deskripsi |
|---|---|---|
message_ids |
Ya | Larik ID pesan yang tidak kosong (hingga 500 per permintaan). |
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]
}'
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
{
method: "POST",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
message_ids: ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"],
}),
}
);
const data = await res.json();
console.log(data.marked_read);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/messages/mark-read",
headers={
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"message_ids": ["aB3dE5fG7hI9jK1lM2nO", "cD4eF6gH8iJ0kL2mN3oP"]},
)
print(res.json()["marked_read"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123",
"marked_read": 2
}
Menandai seluruh obrolan sebagai telah dibaca
POST /contacts/{contactId}/mark-read
Menghapus lencana belum dibaca untuk seluruh percakapan kontak di kotak masuk. Tidak diperlukan isi permintaan.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-read" \
-H "X-API-Key: YOUR_API_KEY"
JavaScript
const res = await fetch(
"https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
{ method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();
console.log(data.success);
Python
import requests
res = requests.post(
"https://api.youraiconnector.com/v1/contacts/contact123/mark-read",
headers={"X-API-Key": "YOUR_API_KEY"},
)
print(res.json()["success"])
Respons (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Tandai seluruh obrolan sebagai belum dibaca
POST /contacts/{contactId}/mark-unread
Menempatkan kembali lencana belum dibaca pada percakapan — berguna ketika seseorang di tim Anda membuka obrolan tetapi menyerahkannya kembali. Tidak diperlukan isi permintaan.
Ini adalah tanda khusus kotak masuk: ini tidak mengubah kapan percakapan terakhir dibaca, jadi tidak ada tanda terima telah dibaca yang dikirim ke kontak pada saluran yang mendukungnya.
cURL
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/mark-unread" \
-H "X-API-Key: YOUR_API_KEY"
Respons (200 OK):
{
"success": true,
"contact_id": "contact123"
}
Ekspor percakapan
Ekspor memberikan Anda seluruh percakapan sebagai transkrip yang dapat dibaca, alih-alih menelusuri pesan halaman demi halaman. Setiap titik akhir ekspor menerima filter berupa all (default), text, media, atau tool_use, yang cocok dengan filter pada daftar pesan.
Ekspor obrolan satu kontak
GET /chat-exports/{contactId}
| Parameter kueri | Wajib | Deskripsi |
|---|---|---|
format |
Tidak | txt (default) mengembalikan tautan unduhan ke transkrip teks biasa. json mengembalikan pesan sebagai data terstruktur dalam respons. |
filter |
Tidak | all (default), text, media, atau tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/contact123?format=json" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests
res = requests.get(
"https://api.youraiconnector.com/v1/chat-exports/contact123",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"format": "json"},
)
print(res.json()["data"]["messages"])
Respons dengan format=json (200 OK):
{
"success": true,
"data": {
"contact": {
"id": "contact123",
"name": "Jane Doe",
"phone": "+31612345678",
"email": "jane@example.com"
},
"messages": [
{
"body": "Hi! I have a question about my order.",
"direction": "inbound",
"timestamp": "2026-06-01T09:55:00.000Z",
"type": "text",
"media_url": null,
"media_content_type": null,
"name": null,
"args": null
}
]
}
}
Dengan format=txt (default), data justru merupakan tautan unduhan ke file transkrip yang dihasilkan:
{
"success": true,
"data": "https://storage.googleapis.com/.../chat-export-contact123-....txt"
}
Tautan unduhan hanya berlaku singkat. Ambil file segera setelah Anda mendapatkan tautan alih-alih menyimpannya — minta ekspor baru saat Anda membutuhkan transkrip lagi.
Ekspor setiap percakapan terbaru
GET /chat-exports/recent
Mengekspor percakapan dari semua kontak yang aktif dalam X jam terakhir, dalam satu panggilan.
| Parameter kueri | Wajib | Deskripsi |
|---|---|---|
hours |
Ya | Berapa jam aktivitas yang ingin dilihat ke belakang. Harus berupa bilangan bulat positif. |
format |
Tidak | json (default) mengembalikan satu entri per kontak. txt mengembalikan satu file teks yang dapat diunduh berisi setiap percakapan. |
limit |
Tidak | Jumlah maksimum kontak yang akan diekspor. Default 50, maksimum 100. |
filter |
Tidak | all (default), text, media atau tool_use. |
cURL
curl "https://api.youraiconnector.com/v1/chat-exports/recent?hours=24&limit=25" \
-H "X-API-Key: YOUR_API_KEY"
Respons (200 OK):
{
"success": true,
"data": {
"hours_ago": 24,
"total_contacts": 2,
"exports": [
{
"contactId": "contact123",
"contactName": "Jane Doe",
"phoneNumber": "+31612345678",
"email": "jane@example.com",
"messageCount": 12,
"chatExport": "Acme Export - Jane Doe\nPhone: +31612345678\n..."
}
]
}
}
Dengan format=txt, responsnya adalah file teks itu sendiri, dikirim sebagai unduhan alih-alih JSON.
Satu panggilan ini menarik riwayat lengkap dari setiap kontak yang cocok, jadi jaga agar
hoursdanlimittetap wajar pada akun yang sibuk.
Mengirim transkrip melalui email ke kontak
POST /chat-exports/{contactId}/email
Mengirimkan transkrip percakapan mereka sendiri kepada kontak melalui email — alur “kirimkan obrolan ini ke email saya”, yang dijalankan dari sistem Anda sendiri.
| Bidang | Wajib | Deskripsi |
|---|---|---|
recipient_email |
Tidak | Ke mana harus mengirimnya. Defaultnya adalah alamat email kontak yang tersimpan. |
via |
Tidak | auto (default) memilih rute terbaik, transactional mengirimnya sebagai email sistem, email_channel mengirimnya dari saluran email Anda yang terhubung. |
note |
Tidak | Baris singkat dari Anda yang ditampilkan di atas transkrip. Hingga 1000 karakter. |
cURL
curl -X POST "https://api.youraiconnector.com/v1/chat-exports/contact123/email" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "note": "Here is a copy of our chat, as promised." }'
Respons (200 OK):
{
"success": true,
"data": {
"via": "transactional",
"recipientEmail": "jane@example.com",
"messageCount": 42,
"omittedCount": 0
}
}
omittedCount memberi tahu Anda berapa banyak pesan terlama yang ditinggalkan agar email tetap memiliki panjang yang wajar. 200 berarti transkrip telah dibuat dan dimasukkan ke antrean untuk dikirim, bukan berarti pesan tersebut sudah sampai di kotak masuk.
Jeda atau lanjutkan AI untuk satu kontak
PUT /contacts/{contactId}
Atur is_bot_active ke false untuk menghentikan AI membalas satu kontak, dan kembali ke true untuk mengembalikan percakapan. Ini adalah tombol pengambilalihan yang Anda perlukan saat manusia masuk ke dalam percakapan: pesan keluar yang Anda kirim dengan API tetap terkirim saat bot dijeda.
cURL
curl -X PUT "https://api.youraiconnector.com/v1/contacts/contact123" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_bot_active": false }'
JavaScript
await fetch("https://api.youraiconnector.com/v1/contacts/contact123", {
method: "PUT",
headers: {
"X-API-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ is_bot_active: false }),
});
Python
import requests
requests.put(
"https://api.youraiconnector.com/v1/contacts/contact123",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"is_bot_active": False},
)
Respons
{
"success": true,
"contact_id": "contact123"
}
Menjeda sebagai bagian dari balasan
Jika manusia mengambil alih dengan mengirimkan balasan, Anda dapat menjeda bot dalam permintaan yang sama alih-alih melakukan panggilan kedua. POST /contacts/{contactId}/send-message menerima dua flag opsional:
| Bidang | Deskripsi |
|---|---|
pauseBot |
true menjeda AI untuk kontak ini saat pesan dikirim. |
clearIncompleteReply |
true membuang balasan bot yang setengah jadi agar tidak dilanjutkan setelahnya. |
curl -X POST "https://api.youraiconnector.com/v1/contacts/contact123/send-message" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Hi, Sarah here - taking over from the assistant.",
"pauseBot": true,
"clearIncompleteReply": true
}'
Respons mencakup "botPaused": true saat jeda diterapkan.
Menandai kontak sebagai pribadi dengan
POST /contacts/bulk-flagjuga menjeda bot untuk mereka. Lihat Kontak untuk daftar bidang lengkap.
Membangun kotak masuk Anda sendiri
Segala sesuatu yang dibutuhkan kotak masuk ada di halaman ini dan di Kontak:
| Apa yang Anda butuhkan | Endpoint |
|---|---|
| Mencantumkan percakapan | GET /contacts |
| Membaca percakapan | GET /contacts/{contactId}/messages |
| Mencantumkan sesi obrolan kontak | GET /chat-sessions/{contactId} |
| Melihat apa yang baru saja masuk | GET /chat-sessions/recent |
| Membaca satu sesi obrolan | GET /contacts/{contactId}/chat-sessions/{sessionId}/messages |
| Mengirim balasan manual | POST /contacts/{contactId}/send-message |
| Mengoreksi balasan yang baru saja Anda kirim | POST /contacts/{contactId}/messages/{messageId}/edit |
| Menghapus pesan | DELETE /contacts/{contactId}/messages/{messageId} |
| Menghapus beberapa pesan | POST /contacts/{contactId}/messages/bulk-delete |
| Bereaksi dengan emoji | POST /contacts/{contactId}/messages/{messageId}/react |
| Memberi peringkat atau membintangi pesan | PATCH /contacts/{contactId}/messages/{messageId} |
| Menandai sebagai telah dibaca | POST /contacts/{contactId}/mark-read |
| Mengembalikan obrolan ke tim | POST /contacts/{contactId}/mark-unread |
| Mengekspor transkrip | GET /chat-exports/{contactId} |
| Menjeda atau melanjutkan AI | PUT /contacts/{contactId} dengan is_bot_active |
Untuk pembaruan langsung, berlanggananlah ke acara New Message, Replies, Human Alerted, dan Chat Concluded dengan Webhook alih-alih melakukan polling pada API ini secara berkala.
Kesalahan API Pesan
Endpoint pesan mengembalikan amplop kesalahan standar:
{
"success": false,
"error": "Contact not found"
}
| Status | Kapan ini terjadi pada endpoint pesan |
|---|---|
400 |
Bidang wajib hilang atau parameter tidak valid (bad limit, hours, filter, direction, status, array message_ids kosong atau lebih dari 500, cursor tidak valid, edit body kosong atau terlalu panjang, score di luar -1/0/1, atau emoji dengan spasi atau lebih dari 16 karakter). Juga dikembalikan saat pesan tidak dapat diedit sama sekali — pesan telah dihapus, salurannya tidak memiliki fitur edit, atau sudah melewati jendela edit saluran tersebut. |
404 |
Kontak, sesi obrolan, atau salah satu ID pesan yang diberikan tidak ditemukan. |
409 |
Saluran tidak dapat menerima perubahan saat ini. Tidak ada yang ditulis: saat pengeditan, edit_reason menjelaskan alasannya; saat reaksi, saluran tidak dapat dijangkau untuk sementara dan mencoba lagi mungkin berhasil. |
422 |
Kontak tidak dapat menerima pesan keluar (jangan ganggu, pribadi, atau saluran yang tidak didukung), atau reaksi tidak pernah dapat dikirimkan pada percakapan ini (reaction_reason menjelaskan yang mana). |
Kode bersama yang dapat dikembalikan oleh setiap endpoint — 401, 403 (paket Anda tidak menyertakan akses API), 429 (batas kecepatan) dan 500 — tercantum beserta panduan percobaan ulang di Kesalahan & Penomoran Halaman.
Langkah berikutnya
- Webhook — dapatkan pembaruan status pengiriman yang dikirimkan kepada Anda alih-alih melakukan polling.
- Kontak — buat dan cari kontak yang Anda kirimi pesan.
- Janji Temu — pesan dan kelola janji temu untuk kontak Anda.