Endpoint untuk mengirim pesan keluar. Semua handler memakai shared Payload struct dan memanggil saveMessageMongo yang menulis ke chat_inbox + chat_outbox.
Shared request body
Semua endpoint send_* memakai Payload struct (handlers/chat.go:22-72). Field wajib divalidasi:
| Field | Tipe | Wajib | Deskripsi |
|---|---|---|---|
token | string | ✅ | Device token (untuk resolve device) |
number | string | ✅ | Nomor tujuan (support comma-separated untuk multi-recipient) |
Field opsional (per tipe pesan)
| Field | Tipe | Dipakai di | Deskripsi |
|---|---|---|---|
message | string | message, express | Konten teks |
file | string | image, document, audio, video | URL/path file media |
caption | string | image, video | Caption media |
link | string | link | URL link |
latitude | string | location | Lat |
longitude | string | location | Lng |
locationName | string | location | Nama lokasi |
locationAddress | string | location | Alamat lokasi |
date | string | semua | Override tanggal (default: today) |
time | string | semua | Override waktu (default: now) |
ptt | string | audio | Push-to-talk flag |
role | string | semua | Role pengirim (CS/Owner/Admin/Gudang/bot) |
team_id | string | semua | CS ID pengirim |
teamgudang_id | string | semua | Gudang ID (jika role=Gudang) |
teamgeneral_id | string | semua | General team ID |
team_name | string | semua | Nama team pengirim |
profile_name | string | semua | Nama profil |
kategori | string | semua | Kategori pesan |
groupname | string | semua | Nama grup (jika ke group) |
temp_id | string | semua | Temp ID |
quoted_message_id | string | semua | ID pesan yang di-quote |
raw_message | string | semua | Raw message blob |
express | bool | semua | Jika true, synchronous via sendNotif |
Validasi tambahan
validateAuthMongo (chat_submit.go:877-891) memeriksa:
| Kondisi | Pesan error |
|---|---|
Nomor invalid (regex ^[0-9,\-,\+]+$) | "Nomor tujuan tidak valid!" |
Device tidak ditemukan (orderPaket.ID == "") | "Token salah" |
Device nonaktif (!orderPaket.Status) | "Device sudah tidak aktif/expired!" |
Response umum
Sukses
{
"result": true,
"message": "Kirim pesan sukses!",
"status": "pending",
"number": "62812xxxx",
"ids": ["inbox-id-1", "inbox-id-2"],
"data": {/* ChatInboxStruct */}
}Error
| Kondisi | Body |
|---|---|
| Validasi gagal | 422 {"errors": [{"field": "...", "tag": "...", "message": "..."}]} |
| Field wajib kosong | {"result": false, "message": "Pesan harus diisi"} (hanya send_message/send_express) |
| Device tidak ditemukan | {"result": false, "message": "<err>"} |
| Validasi auth gagal | {"result": false, "message": "<errMessage>"} |
| Save gagal | {"result": false, "message": "<err>"} |
POST /v1/send_message
Kirim pesan teks.
Handler: handlers/chat_submit.go:26 SubmitMessage
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
message | ✅ (di-check manual) | Konten teks — jika kosong return "Pesan harus diisi" |
Behavior
MessageType = ChatsaveMessageMongomenulis kechat_inbox(Jenis=keluar, Tipe=chat) +chat_outbox- Mendukung Spintax
{hai|halo|selamat}di message (di-expand disaveMessageMongo) status_ack = "pending"(default) atau"sent"/"error"jikaexpress=true
POST /v1/send_image
Kirim pesan gambar.
Handler: handlers/chat_submit.go:77 SubmitImage
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
file | seharusnya ✅ (tapi dead check) | URL/path gambar |
caption | ❌ | Caption gambar |
Behavior
MessageType = ImagesaveMessageMongoendpoint WA gateway:send-image
POST /v1/send_document
Kirim dokumen.
Handler: handlers/chat_submit.go:127 SubmitDocument
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
file | seharusnya ✅ (tapi dead check) | URL/path dokumen |
Behavior
MessageType = Document- Endpoint WA gateway:
send-document
POST /v1/send_audio
Kirim audio.
Handler: handlers/chat_submit.go:176 SubmitAudio
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
file | seharusnya ✅ (tapi dead check) | URL/path audio |
ptt | ❌ | Push-to-talk flag |
Behavior
MessageType = Audio- Endpoint WA gateway:
send-audio(atausend-documentdengan ptt flag)
POST /v1/send_video
Kirim video.
Handler: handlers/chat_submit.go:225 SubmitVideo
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
file | seharusnya ✅ (tapi dead check) | URL/path video |
caption | ❌ | Caption video |
Behavior
MessageType = Video- Endpoint WA gateway:
send-video(atausend-image)
POST /v1/send_link
Kirim link dengan preview.
Handler: handlers/chat_submit.go:274 SubmitLink
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
link | seharusnya ✅ (tapi dead check) | URL link |
Behavior
MessageType = Link- Endpoint WA gateway:
send-link MatchedTextdi-set kepayload.Link
POST /v1/send_location
Kirim lokasi.
Handler: handlers/chat_submit.go:323 SubmitLocation
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
latitude | seharusnya ✅ (tapi dead check) | Lat |
longitude | seharusnya ✅ (tapi dead check) | Lng |
locationName | ❌ | Nama lokasi |
locationAddress | ❌ | Alamat lokasi |
Behavior
MessageType = LocationPesandi-set ke"lat,lng"- Endpoint WA gateway:
send-location
POST /v1/send_express
Kirim pesan teks synchronous — langsung POST ke WA gateway tanpa lewat chat_outbox.
Handler: handlers/chat_submit.go:372 SubmitExpress
Field khusus
| Field | Wajib | Catatan |
|---|---|---|
message | ✅ (di-check manual) | Konten teks |
Behavior
- Force
payload.Express = true(chat_submit.go:405) saveMessageMongomemanggilsendNotif(...)synchronous — langsung POST ke WA gateway:5002status_ackdi-set langsung dichat_inbox:pending— sebelum kirimsent— sukses (data.Result == true)error— gagal
- Tidak ada row
chat_outboxdibuat
Response (sukses)
{
"result": true,
"message": "Kirim pesan sukses!",
"status": "pending",
"number": "62812xxxx",
"ids": [...],
"data": {/* ChatInboxStruct */}
}Contoh request
send_message (normal)
curl -X POST https://api.dazo.id/v1/send_message \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{
"token": "device-token-xxx",
"number": "62812xxxx,62813xxxx",
"message": "Halo {selamat|hai}, pesan dari Dazo",
"role": "CS",
"team_id": "cs-001",
"team_name": "CS Andi",
"teamgeneral_id": "team-general-1"
}'send_image
curl -X POST https://api.dazo.id/v1/send_image \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{
"token": "device-token-xxx",
"number": "62812xxxx",
"file": "https://cdn.dazo.id/image.jpg",
"caption": "Ini gambar produk"
}'send_express
curl -X POST https://api.dazo.id/v1/send_express \
-H "Authorization: Bearer <jwt>" \
-H "Content-Type: application/json" \
-d '{
"token": "device-token-xxx",
"number": "62812xxxx",
"message": "OTP Anda: 123456"
}'Kembali ke
- API Reference Index — daftar semua grup
- Message Flow — alur lengkap outbound
- Schema chat_outbox — field yang ditulis