{"openapi":"3.0.3","info":{"title":"WhatsCRM Client API","version":"1.0.0","description":"API untuk client MeeChat: kirim pesan WhatsApp, kelola template, inbox, media, dan saldo.\n\n## Autentikasi\nKirim API key di header:\n\n```\nX-Api-Key: Bearer {your_client_api_key}\nContent-Type: application\/json\n```\n\nAPI key ada di **Panel \u2192 Settings \u2192 API Settings**. Jangan dibagikan. Gunakan HTTPS.\n\nDi Swagger, tombol **Authorize** diisi `Bearer` diikuti API key, contoh `Bearer mk_live_xxx`.\n\n## Rate limit\nEndpoint `\/api\/v1` dibatasi per client. Default **60 request per menit**. Nilai khusus memakai kolom `rate_limit_per_minute`. Endpoint ingest (`send-template-ingest`, `send-template-ingest-multi`, `save-contact-ingest`) tidak masuk hitungan ini.\n\nHeader response: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, dan `Retry-After` saat kena batas (HTTP 429).\n\n## Alur yang disarankan\n1. `GET \/v1\/balance` untuk cek saldo.\n2. `GET \/v1\/templates` untuk mengambil template `approved` dan urutan placeholder.\n3. `POST \/v1\/send-template` untuk kirim template. Pakai `send-template-multi` jika nomor pengirim harus ditentukan, atau `send-template-ingest-multi` jika ingin masuk antrian.\n4. `POST \/v1\/messages\/multi` untuk pesan session di dalam jendela 24 jam.\n5. Inbox untuk daftar percakapan, balas, dan tutup chat.\n6. `GET \/v1\/media\/{message_id}` lalu `download` untuk file pesan masuk. `message_id` adalah `data.id` pada webhook `message.received`.\n7. `POST \/v1\/topup\/link` jika saldo perlu ditambah. Buka `payment_url`.\n\n## Webhook\nMeeChat mengirim **POST JSON** ke URL yang didaftarkan di menu Webhook. Balas HTTP 2xx. Timeout 10 detik, retry maksimal 3 kali. Jika secret diisi, header `X-WhatsCRM-Signature` adalah HMAC-SHA256 hex dari raw body.\n\nEnvelope:\n\n```json\n{\"event\":\"message.received | message.media | message.status | meta.webhook\",\"timestamp\":\"2026-08-05T12:00:00+07:00\",\"data\":{}}\n```\n\n- `message.received` \u2014 pesan masuk baru disimpan. Media sering masih `pending`.\n- `message.media` \u2014 file selesai diunduh. `media_url` dan `download_url` terisi.\n- `message.status` \u2014 status pesan keluar: `sent`, `delivered`, `read`, `failed`.\n- `meta.webhook` \u2014 gabungan pesan masuk dan status mentah Meta.\n\nUser-Agent: `WhatsCRM-Webhook\/1.0`."},"servers":[{"url":"https:\/\/whatscrm.id\/api","description":"Server ini"}],"tags":[{"name":"Pesan","description":"Kirim template dan pesan session."},{"name":"Media","description":"Metadata dan unduhan media pesan masuk."},{"name":"Inbox","description":"Percakapan, pesan, dan aksi inbox."},{"name":"Template","description":"Daftar, detail, dan pengajuan template."},{"name":"Saldo","description":"Saldo dan link pembayaran topup."}],"paths":{"\/v1\/send-template":{"post":{"tags":["Pesan"],"summary":"Kirim template","description":"Kirim pesan WhatsApp memakai template yang sudah APPROVED.","operationId":"post_v1_send-template","responses":{"200":{"description":"Terkirim","content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message_id":{"type":"string","example":"uuid-xxx-xxx"},"price":{"type":"integer","example":350},"template":{"type":"string","example":"welcome_message"},"type":{"type":"string","example":"Marketing"}},"example":{"status":"success","message_id":"uuid-xxx-xxx","price":350,"template":"welcome_message","type":"Marketing"}},"example":{"status":"success","message_id":"uuid-xxx-xxx","price":350,"template":"welcome_message","type":"Marketing"}}}},"403":{"description":"Template tidak tersedia untuk client ini"},"404":{"description":"Template tidak ditemukan atau belum approved"},"422":{"description":"Meta menolak pengiriman"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name_template":{"type":"string","example":"welcome_message"},"phone_number":{"type":"string","example":"628111223344"},"language_code":{"type":"string","example":"id"},"body_params":{"type":"array","items":{"type":"string","example":"Budi"},"example":["Budi","INV-123"]},"header_params":{"type":"array","items":{"type":"string","example":"Promo Akhir Tahun"},"example":["Promo Akhir Tahun"]},"header_media_url":{"type":"string","example":"https:\/\/example.com\/image.jpg"},"button_params":{"type":"object","properties":[{"type":"array","items":{"type":"string","example":"tracking123"},"example":["tracking123"]}],"example":{"0":["tracking123"]}}},"example":{"name_template":"welcome_message","phone_number":"628111223344","language_code":"id","body_params":["Budi","INV-123"],"header_params":["Promo Akhir Tahun"],"header_media_url":"https:\/\/example.com\/image.jpg","button_params":{"0":["tracking123"]}}},"example":{"name_template":"welcome_message","phone_number":"628111223344","language_code":"id","body_params":["Budi","INV-123"],"header_params":["Promo Akhir Tahun"],"header_media_url":"https:\/\/example.com\/image.jpg","button_params":{"0":["tracking123"]}}}}}}},"\/v1\/messages\/multi":{"post":{"tags":["Pesan"],"summary":"Kirim pesan session","description":"Kirim pesan non-template lewat nomor WhatsApp milik client. Hanya di dalam jendela percakapan 24 jam. `sender` wajib nomor yang terhubung ke akun. Isi `to` atau `recipient`.","operationId":"post_v1_messages_multi","responses":{"200":{"description":"Terkirim","content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message_id":{"type":"string","example":"wamid.xxx"},"uuid":{"type":"string","example":"uuid-xxx-xxx"},"type":{"type":"string","example":"Text"},"sender":{"type":"string","example":"628111223344"},"waba_id":{"type":"integer","example":12}},"example":{"status":"success","message_id":"wamid.xxx","uuid":"uuid-xxx-xxx","type":"Text","sender":"628111223344","waba_id":12}},"example":{"status":"success","message_id":"wamid.xxx","uuid":"uuid-xxx-xxx","type":"Text","sender":"628111223344","waba_id":12}}}},"400":{"description":"Meta menolak pengiriman"},"404":{"description":"Nomor sender bukan milik client"},"422":{"description":"Validasi gagal, nomor tidak aktif, atau saldo tidak cukup"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"sender":{"type":"string","example":"628111223344"},"to":{"type":"string","example":"6281234567890"},"type":{"type":"string","example":"text"},"message":{"type":"string","example":"Halo, pesanan Anda sedang diproses."}},"example":{"sender":"628111223344","to":"6281234567890","type":"text","message":"Halo, pesanan Anda sedang diproses."}},"example":{"sender":"628111223344","to":"6281234567890","type":"text","message":"Halo, pesanan Anda sedang diproses."}}}}}},"\/v1\/send-template-multi":{"post":{"tags":["Pesan"],"summary":"Kirim template dengan nomor pengirim","description":"Sama seperti send-template, tetapi `sender` wajib dan resolver default tidak dipakai.","operationId":"post_v1_send-template-multi","responses":{"200":{"description":"Terkirim","content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message_id":{"type":"string","example":"uuid-xxx-xxx"},"queue_status":{"type":"string","example":"sent"},"price":{"type":"integer","example":350},"template":{"type":"string","example":"welcome_message"},"type":{"type":"string","example":"Marketing"},"sender":{"type":"string","example":"628111223344"},"waba_id":{"type":"integer","example":12}},"example":{"status":"success","message_id":"uuid-xxx-xxx","queue_status":"sent","price":350,"template":"welcome_message","type":"Marketing","sender":"628111223344","waba_id":12}},"example":{"status":"success","message_id":"uuid-xxx-xxx","queue_status":"sent","price":350,"template":"welcome_message","type":"Marketing","sender":"628111223344","waba_id":12}}}},"404":{"description":"Template atau sender tidak ditemukan"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"sender":{"type":"string","example":"628111223344"},"name_template":{"type":"string","example":"welcome_message"},"phone_number":{"type":"string","example":"6281234567890"},"language_code":{"type":"string","example":"id"},"body_params":{"type":"array","items":{"type":"string","example":"Budi"},"example":["Budi","INV-123"]}},"example":{"sender":"628111223344","name_template":"welcome_message","phone_number":"6281234567890","language_code":"id","body_params":["Budi","INV-123"]}},"example":{"sender":"628111223344","name_template":"welcome_message","phone_number":"6281234567890","language_code":"id","body_params":["Budi","INV-123"]}}}}}},"\/v1\/send-template-ingest-multi":{"post":{"tags":["Pesan"],"summary":"Kirim template lewat antrian","description":"Masuk antrian dan diproses worker. `sender` dicek saat request diterima. Template dicek saat worker berjalan. Endpoint ini tidak dihitung rate limit.","operationId":"post_v1_send-template-ingest-multi","responses":{"200":{"description":"Masuk antrian","content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message_id":{"type":"string","example":"ingest-uuid"},"ingest_id":{"type":"string","example":"ingest-uuid"},"queue_status":{"type":"string","example":"pending"},"template":{"type":"string","example":"welcome_message"},"type":{"type":"string","example":"Template"},"sender":{"type":"string","example":"628111223344"},"waba_id":{"type":"integer","example":12},"note":{"type":"string","example":"Pesan diproses async."}},"example":{"status":"success","message_id":"ingest-uuid","ingest_id":"ingest-uuid","queue_status":"pending","template":"welcome_message","type":"Template","sender":"628111223344","waba_id":12,"note":"Pesan diproses async."}},"example":{"status":"success","message_id":"ingest-uuid","ingest_id":"ingest-uuid","queue_status":"pending","template":"welcome_message","type":"Template","sender":"628111223344","waba_id":12,"note":"Pesan diproses async."}}}},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"sender":{"type":"string","example":"628111223344"},"name_template":{"type":"string","example":"welcome_message"},"phone_number":{"type":"string","example":"6281234567890"},"language_code":{"type":"string","example":"id"},"body_params":{"type":"array","items":{"type":"string","example":"Budi"},"example":["Budi","INV-123"]}},"example":{"sender":"628111223344","name_template":"welcome_message","phone_number":"6281234567890","language_code":"id","body_params":["Budi","INV-123"]}},"example":{"sender":"628111223344","name_template":"welcome_message","phone_number":"6281234567890","language_code":"id","body_params":["Budi","INV-123"]}}}}}},"\/v1\/media\/{message_id}":{"get":{"tags":["Media"],"summary":"Metadata media","description":"Metadata media pesan masuk. `message_id` adalah `data.id` pada webhook `message.received`. Hanya jika nomor WABA pesan itu milik API key ini.","operationId":"get_v1_media_message_id","parameters":[{"name":"message_id","in":"path","required":true,"description":"ID pesan inbox","schema":{"type":"string","example":"12345"}}],"responses":{"200":{"description":"Metadata","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Media retrieved"},"data":{"type":"object","properties":{"message_id":{"type":"integer","example":12345},"message_type":{"type":"string","example":"image"},"media_status":{"type":"string","example":"completed"},"media_url":{"type":"string","example":"https:\/\/cdn.example.com\/waba\/image.jpg"},"download_url":{"type":"string","example":"https:\/\/example.com\/api\/v1\/media\/12345\/download"}},"example":{"message_id":12345,"message_type":"image","media_status":"completed","media_url":"https:\/\/cdn.example.com\/waba\/image.jpg","download_url":"https:\/\/example.com\/api\/v1\/media\/12345\/download"}}},"example":{"success":true,"message":"Media retrieved","data":{"message_id":12345,"message_type":"image","media_status":"completed","media_url":"https:\/\/cdn.example.com\/waba\/image.jpg","download_url":"https:\/\/example.com\/api\/v1\/media\/12345\/download"}}},"example":{"success":true,"message":"Media retrieved","data":{"message_id":12345,"message_type":"image","media_status":"completed","media_url":"https:\/\/cdn.example.com\/waba\/image.jpg","download_url":"https:\/\/example.com\/api\/v1\/media\/12345\/download"}}}}},"404":{"description":"Pesan tidak ditemukan"},"422":{"description":"Pesan bukan media"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/media\/{message_id}\/download":{"get":{"tags":["Media"],"summary":"Unduh media","description":"Setelah media siap, response HTTP 302 mengarah ke file. Ikuti redirect. 409 jika masih pending atau processing.","operationId":"get_v1_media_message_id_download","parameters":[{"name":"message_id","in":"path","required":true,"description":"ID pesan inbox","schema":{"type":"string","example":"12345"}}],"responses":{"302":{"description":"Redirect ke file"},"404":{"description":"Pesan tidak ditemukan"},"409":{"description":"Media belum siap"},"422":{"description":"Media gagal diproses atau pesan bukan media"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/waba-list":{"get":{"tags":["Inbox"],"summary":"Daftar nomor WABA","description":"Nomor WABA yang bisa dipakai inbox.","operationId":"get_v1_inbox_waba-list","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations":{"get":{"tags":["Inbox"],"summary":"Daftar percakapan","description":"Daftar percakapan milik nomor WABA client. Percakapan di luar nomor itu mengembalikan 403.","operationId":"get_v1_inbox_conversations","parameters":[{"name":"waba_pool_id","in":"query","required":false,"description":"Filter nomor WABA","schema":{"type":"integer"},"example":null},{"name":"status","in":"query","required":false,"description":"open atau closed","schema":{"type":"string","enum":["open","closed"]},"example":"open"},{"name":"search","in":"query","required":false,"description":"Cari nama atau nomor","schema":{"type":"string"},"example":null},{"name":"page","in":"query","required":false,"description":"Halaman","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Maksimal 50","schema":{"type":"integer"},"example":20},{"name":"read_status","in":"query","required":false,"description":"all, read, unread, atau unreplied","schema":{"type":"string"},"example":null},{"name":"sort_order","in":"query","required":false,"description":"asc atau desc","schema":{"type":"string","enum":["asc","desc"]},"example":null}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/sync":{"get":{"tags":["Inbox"],"summary":"Sync daftar percakapan","description":"Bootstrap atau delta. Kirim `last_sync` untuk perubahan sejak waktu itu.","operationId":"get_v1_inbox_conversations_sync","parameters":[{"name":"last_sync","in":"query","required":false,"description":"Waktu sync terakhir, ISO 8601","schema":{"type":"string"},"example":null}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/chat-count":{"get":{"tags":["Inbox"],"summary":"Jumlah chat","description":"Jumlah percakapan.","operationId":"get_v1_inbox_chat-count","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/chat-counts":{"get":{"tags":["Inbox"],"summary":"Jumlah per status","description":"Jumlah percakapan per status.","operationId":"get_v1_inbox_chat-counts","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/messages":{"get":{"tags":["Inbox"],"summary":"Pesan percakapan","description":"Detail percakapan ada di `assignment` pada request pertama (tanpa cursor).","operationId":"get_v1_inbox_conversations_id_messages","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan (chat_assignments.id)","schema":{"type":"string","example":"678"}},{"name":"cursor","in":"query","required":false,"description":"Kursor halaman pesan","schema":{"type":"string"},"example":null},{"name":"direction","in":"query","required":false,"description":"before atau after","schema":{"type":"string","enum":["before","after"]},"example":null},{"name":"limit","in":"query","required":false,"description":"Jumlah pesan","schema":{"type":"integer"},"example":null},{"name":"mark_read","in":"query","required":false,"description":"1 untuk tandai sudah dibaca","schema":{"type":"integer"},"example":1}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/search":{"get":{"tags":["Inbox"],"summary":"Cari pesan","description":"Cari isi pesan dalam satu percakapan.","operationId":"get_v1_inbox_conversations_id_search","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}},{"name":"q","in":"query","required":true,"description":"Kata kunci","schema":{"type":"string"},"example":"resi"}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/send":{"post":{"tags":["Inbox"],"summary":"Kirim pesan dalam percakapan","description":"Pesan non-template hanya dalam jendela 24 jam. Media memakai `media_url` atau `media_id`.","operationId":"post_v1_inbox_conversations_id_send","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"type":{"type":"string","example":"text"},"message":{"type":"string","example":"Halo, pesanan sedang diproses."}},"example":{"type":"text","message":"Halo, pesanan sedang diproses."}},"example":{"type":"text","message":"Halo, pesanan sedang diproses."}}}}}},"\/v1\/inbox\/conversations\/{id}\/messages\/{messageId}":{"put":{"tags":["Inbox"],"summary":"Edit pesan keluar","description":"Edit pesan keluar bertipe teks. `messageId` memakai format `out_{id}`.","operationId":"put_v1_inbox_conversations_id_messages_messageId","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}},{"name":"messageId","in":"path","required":true,"description":"ID pesan keluar, format out_{id}","schema":{"type":"string","example":"out_90"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Teks yang sudah diperbaiki."}},"example":{"message":"Teks yang sudah diperbaiki."}},"example":{"message":"Teks yang sudah diperbaiki."}}}}},"delete":{"tags":["Inbox"],"summary":"Hapus pesan","description":"Pesan masuk memakai ID numerik. Pesan keluar memakai `out_{id}`.","operationId":"delete_v1_inbox_conversations_id_messages_messageId","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}},{"name":"messageId","in":"path","required":true,"description":"ID pesan","schema":{"type":"string","example":"out_90"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/messages\/{messageId}\/retry-media":{"post":{"tags":["Inbox"],"summary":"Antrian unduh ulang media","description":"Masukkan ulang job unduh media.","operationId":"post_v1_inbox_conversations_id_messages_messageId_retry-media","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}},{"name":"messageId","in":"path","required":true,"description":"ID pesan masuk","schema":{"type":"string","example":"12345"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/messages\/{messageId}\/refetch-media":{"post":{"tags":["Inbox"],"summary":"Unduh ulang media langsung","description":"Unduh ulang media tanpa menunggu antrian.","operationId":"post_v1_inbox_conversations_id_messages_messageId_refetch-media","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}},{"name":"messageId","in":"path","required":true,"description":"ID pesan masuk","schema":{"type":"string","example":"12345"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/close":{"post":{"tags":["Inbox"],"summary":"Tutup percakapan","description":"Tutup percakapan.","operationId":"post_v1_inbox_conversations_id_close","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/reopen":{"post":{"tags":["Inbox"],"summary":"Buka lagi percakapan","description":"Buka percakapan yang sudah ditutup.","operationId":"post_v1_inbox_conversations_id_reopen","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/notes":{"post":{"tags":["Inbox"],"summary":"Simpan catatan","description":"Catatan internal percakapan, maksimal 2000 karakter.","operationId":"post_v1_inbox_conversations_id_notes","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"notes":{"type":"string","example":"Pelanggan minta follow up besok."}},"example":{"notes":"Pelanggan minta follow up besok."}},"example":{"notes":"Pelanggan minta follow up besok."}}}}}},"\/v1\/inbox\/conversations\/{id}\/save-contact":{"post":{"tags":["Inbox"],"summary":"Simpan kontak","description":"Simpan nama, email, dan tag kontak percakapan ini.","operationId":"post_v1_inbox_conversations_id_save-contact","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Budi"},"email":{"type":"string","example":"budi@example.com"},"tags":{"type":"array","items":{"type":"string","example":"pelanggan"},"example":["pelanggan"]}},"example":{"name":"Budi","email":"budi@example.com","tags":["pelanggan"]}},"example":{"name":"Budi","email":"budi@example.com","tags":["pelanggan"]}}}}}},"\/v1\/inbox\/conversations\/{id}\/reconcile-unreplied":{"post":{"tags":["Inbox"],"summary":"Samakan status belum dibalas","description":"Samakan status belum dibalas dengan Meta.","operationId":"post_v1_inbox_conversations_id_reconcile-unreplied","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/conversations\/{id}\/sync-server":{"post":{"tags":["Inbox"],"summary":"Tarik pesan lama","description":"Tarik pesan lama yang belum muncul di percakapan.","operationId":"post_v1_inbox_conversations_id_sync-server","parameters":[{"name":"id","in":"path","required":true,"description":"ID percakapan","schema":{"type":"string","example":"678"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/contacts\/search":{"get":{"tags":["Inbox"],"summary":"Cari kontak","description":"Cari kontak client.","operationId":"get_v1_inbox_contacts_search","parameters":[{"name":"q","in":"query","required":true,"description":"Kata kunci","schema":{"type":"string"},"example":"budi"}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/templates":{"get":{"tags":["Inbox"],"summary":"Template untuk inbox","description":"Template approved yang bisa dikirim dari inbox.","operationId":"get_v1_inbox_templates","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/templates\/{templateId}\/form":{"get":{"tags":["Inbox"],"summary":"Form parameter template","description":"Field yang perlu diisi sebelum mengirim template dari inbox.","operationId":"get_v1_inbox_templates_templateId_form","parameters":[{"name":"templateId","in":"path","required":true,"description":"ID template","schema":{"type":"string","example":"12"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/send-template":{"post":{"tags":["Inbox"],"summary":"Kirim template dari inbox","description":"Kirim ke kontak yang sudah ada (`recipient_mode=contact` + `contact_id`) atau nomor baru. Parameter tambahan mengikuti form template.","operationId":"post_v1_inbox_send-template","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"template_id":{"type":"integer","example":12},"recipient_mode":{"type":"string","example":"new"},"new_phone":{"type":"string","example":"6281234567890"},"new_name":{"type":"string","example":"Budi"}},"example":{"template_id":12,"recipient_mode":"new","new_phone":"6281234567890","new_name":"Budi"}},"example":{"template_id":12,"recipient_mode":"new","new_phone":"6281234567890","new_name":"Budi"}}}}}},"\/v1\/inbox\/coexistence-sync\/status":{"get":{"tags":["Inbox"],"summary":"Status sync histori","description":"Status sync histori WhatsApp Business App.","operationId":"get_v1_inbox_coexistence-sync_status","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/inbox\/coexistence-sync\/{wabaPoolId}":{"post":{"tags":["Inbox"],"summary":"Mulai sync histori","description":"Mulai sync histori WhatsApp Business App untuk satu nomor.","operationId":"post_v1_inbox_coexistence-sync_wabaPoolId","parameters":[{"name":"wabaPoolId","in":"path","required":true,"description":"ID pool nomor WABA","schema":{"type":"string","example":"1"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/templates":{"get":{"tags":["Template"],"summary":"Daftar template","description":"Secara default hanya template `approved` yang bisa dipakai di send-template.","operationId":"get_v1_templates","parameters":[{"name":"search","in":"query","required":false,"description":"Nama atau display name","schema":{"type":"string"},"example":null},{"name":"category","in":"query","required":false,"description":"marketing, utility, otp, atau service","schema":{"type":"string"},"example":"utility"},{"name":"language","in":"query","required":false,"description":"Kode bahasa, contoh id","schema":{"type":"string"},"example":null},{"name":"status","in":"query","required":false,"description":"Default approved. all, pending, atau rejected","schema":{"type":"string"},"example":"approved"},{"name":"page","in":"query","required":false,"description":"Halaman, default 1","schema":{"type":"integer"},"example":1},{"name":"per_page","in":"query","required":false,"description":"Default 50, maksimal 100","schema":{"type":"integer"},"example":50}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}},"post":{"tags":["Template"],"summary":"Buat template","description":"Membuat template dan mengirimnya ke Meta. Status awal `pending`. Setelah `approved` bisa dipakai di send-template. Placeholder body memakai {{1}}, {{2}}, dan seterusnya.","operationId":"post_v1_templates","responses":{"403":{"description":"Pengajuan template mandiri dinonaktifkan untuk akun ini"},"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Konfirmasi Pesanan"},"category":{"type":"string","example":"utility"},"language":{"type":"string","example":"id"},"header_type":{"type":"string","example":"text"},"header_text":{"type":"string","example":"Pesanan {{1}}"},"body_text":{"type":"string","example":"Halo {{1}}, pesanan {{2}} telah dikirim."},"footer_text":{"type":"string","example":"Terima kasih"},"buttons":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","example":"URL"},"text":{"type":"string","example":"Lacak Pesanan"},"url":{"type":"string","example":"https:\/\/example.com\/order\/{{1}}"}},"example":{"type":"URL","text":"Lacak Pesanan","url":"https:\/\/example.com\/order\/{{1}}"}},"example":[{"type":"URL","text":"Lacak Pesanan","url":"https:\/\/example.com\/order\/{{1}}"}]}},"example":{"name":"Konfirmasi Pesanan","category":"utility","language":"id","header_type":"text","header_text":"Pesanan {{1}}","body_text":"Halo {{1}}, pesanan {{2}} telah dikirim.","footer_text":"Terima kasih","buttons":[{"type":"URL","text":"Lacak Pesanan","url":"https:\/\/example.com\/order\/{{1}}"}]}},"example":{"name":"Konfirmasi Pesanan","category":"utility","language":"id","header_type":"text","header_text":"Pesanan {{1}}","body_text":"Halo {{1}}, pesanan {{2}} telah dikirim.","footer_text":"Terima kasih","buttons":[{"type":"URL","text":"Lacak Pesanan","url":"https:\/\/example.com\/order\/{{1}}"}]}}}}}},"\/v1\/templates\/{name}":{"get":{"tags":["Template"],"summary":"Detail template","description":"Cek placeholder, header, dan button sebelum send-template.","operationId":"get_v1_templates_name","parameters":[{"name":"name","in":"path","required":true,"description":"name_template, name, atau display name","schema":{"type":"string","example":"client_12_order_confirm"}},{"name":"language","in":"query","required":false,"description":"Filter bahasa jika nama sama","schema":{"type":"string"},"example":"id"},{"name":"status","in":"query","required":false,"description":"Default approved. Gunakan all untuk semua status","schema":{"type":"string"},"example":null}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/balance":{"get":{"tags":["Saldo"],"summary":"Cek saldo","description":"Saldo dan ringkasan pemakaian akun.","operationId":"get_v1_balance","responses":{"200":{"description":"Saldo","content":{"application\/json":{"schema":{"type":"object","properties":{"status":{"type":"boolean","example":true},"data":{"type":"object","properties":{"balance":{"type":"integer","example":1500000},"formatted_balance":{"type":"string","example":"Rp 1.500.000"},"currency":{"type":"string","example":"IDR"},"messages_today":{"type":"integer","example":150},"messages_this_month":{"type":"integer","example":4500}},"example":{"balance":1500000,"formatted_balance":"Rp 1.500.000","currency":"IDR","messages_today":150,"messages_this_month":4500}}},"example":{"status":true,"data":{"balance":1500000,"formatted_balance":"Rp 1.500.000","currency":"IDR","messages_today":150,"messages_this_month":4500}}},"example":{"status":true,"data":{"balance":1500000,"formatted_balance":"Rp 1.500.000","currency":"IDR","messages_today":150,"messages_this_month":4500}}}}},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/topup\/channels":{"get":{"tags":["Saldo"],"summary":"Channel pembayaran","description":"Daftar channel dari payment gateway yang sedang aktif.","operationId":"get_v1_topup_channels","responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}},"\/v1\/topup\/link":{"post":{"tags":["Saldo"],"summary":"Buat link pembayaran","description":"Membuat link pembayaran publik (Midtrans atau Pakar Digital, yang sedang aktif). Buka `payment_url` untuk membayar. Saldo bertambah setelah callback gateway sukses. Minimal nominal Rp 1.000. `phone` wajib untuk e-wallet.","operationId":"post_v1_topup_link","responses":{"200":{"description":"Link dibuat","content":{"application\/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Link pembayaran berhasil dibuat"},"data":{"type":"object","properties":{"order_id":{"type":"string","example":"TOP-AB12CD34-1710000000"},"status":{"type":"string","example":"PENDING"},"gateway":{"type":"string","example":"pakar_digital"},"amount":{"type":"integer","example":50000},"admin_fee":{"type":"integer","example":350},"total_amount":{"type":"integer","example":50350},"payment_url":{"type":"string","example":"https:\/\/pay.example.com\/checkout\/xxxxx"}},"example":{"order_id":"TOP-AB12CD34-1710000000","status":"PENDING","gateway":"pakar_digital","amount":50000,"admin_fee":350,"total_amount":50350,"payment_url":"https:\/\/pay.example.com\/checkout\/xxxxx"}}},"example":{"success":true,"message":"Link pembayaran berhasil dibuat","data":{"order_id":"TOP-AB12CD34-1710000000","status":"PENDING","gateway":"pakar_digital","amount":50000,"admin_fee":350,"total_amount":50350,"payment_url":"https:\/\/pay.example.com\/checkout\/xxxxx"}}},"example":{"success":true,"message":"Link pembayaran berhasil dibuat","data":{"order_id":"TOP-AB12CD34-1710000000","status":"PENDING","gateway":"pakar_digital","amount":50000,"admin_fee":350,"total_amount":50350,"payment_url":"https:\/\/pay.example.com\/checkout\/xxxxx"}}}}},"401":{"description":"API key kosong atau tidak valid"}},"requestBody":{"required":true,"content":{"application\/json":{"schema":{"type":"object","properties":{"amount":{"type":"integer","example":50000},"payment_channel":{"type":"string","example":"WALLET_QRIS"},"phone":{"type":"string","example":"081234567890"}},"example":{"amount":50000,"payment_channel":"WALLET_QRIS","phone":"081234567890"}},"example":{"amount":50000,"payment_channel":"WALLET_QRIS","phone":"081234567890"}}}}}},"\/v1\/topup\/link\/{order_id}":{"get":{"tags":["Saldo"],"summary":"Status link pembayaran","description":"Cek status transaksi dan ambil ulang payment_url jika masih pending.","operationId":"get_v1_topup_link_order_id","parameters":[{"name":"order_id","in":"path","required":true,"description":"Order ID topup","schema":{"type":"string","example":"TOP-AB12CD34-1710000000"}}],"responses":{"200":{"description":"Berhasil"},"401":{"description":"API key kosong atau tidak valid"}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Nilai header: `Bearer {api_key}`. API key ada di Panel \u2192 Settings \u2192 API Settings."}}},"security":[{"ApiKey":[]}]}