Hubungkan pengiriman SMS
ke layanan Anda.
Mulai dengan satu kunci API. Pilih negara dan kirim SMS ke hingga 1.000 nomor sekaligus. Hasil per nomor juga bisa dicek.
Mulai cepat
- Buat kunci API
Setelah mendaftar, disetujui, dan login dengan OTP, buka Kelola kunci API untuk membuat kunci.
- Siapkan kredit
API memakai kredit dan tarif akun Anda. Biaya dipotong saat pengiriman diterima.
- Kirim pesan dan cek hasilnya
Simpan ID pengiriman dan cek hasilnya lewat API status.
https://hexsms.comUntuk integrasi sungguhan, panggil API dari server melalui HTTPS. Lingkungan pratinjau tidak mendukung penerbitan kunci asli maupun pengiriman API.
Negara yang didukung
Negara cakupan utama
- Amerika Serikat
- Kanada
- Inggris Raya
- Jerman
- Prancis
- Spanyol
- Italia
- Belanda
- Swedia
- Norwegia
- Denmark
- Polandia
- Rumania
- Ceko
- Austria
- Swiss
- Irlandia
- Portugal
- Finlandia
- Jepang
- Korea Selatan
- Tiongkok
- Taiwan
- Hong Kong DAK Tiongkok
- Singapura
- Malaysia
- Indonesia
- Filipina
- Thailand
- Vietnam
- India
- Bangladesh
- Pakistan
- Australia
- Selandia Baru
- Brasil
- Meksiko
- Afrika Selatan
- Nigeria
- Uni Emirat Arab
- Arab Saudi
Ketersediaan pengiriman, tarif, dan persyaratan registrasi pengirim per negara bergantung pada akun dan jaringan lokal. Periksa tarif per negara sebelum mengirim.
GET/api/v1/messages/countries
Cek negara aktif dan tarif yang berlaku lewat API. Tentukan negara dengan country saat mengirim, dan masukkan nomor dari negara yang sama dalam satu permintaan. Negara tanpa tarif tidak menerima pengiriman.
{ "currency": "USDT", "countries": [{ "country": "US", "unitPrice": 0.02 }] }Autentikasi dengan kunci API
Sertakan header berikut di setiap permintaan API eksternal. Cookie login atau kode OTP tidak diperlukan.
Authorization: Bearer hex_live_KUNCI_API_ANDAKunci asli hanya ditampilkan sekali saat diterbitkan. Simpan di variabel lingkungan server dan jangan masukkan ke kode frontend. Kunci tidak dapat dipakai jika dicabut atau akun ditangguhkan. Anda dapat membuat hingga 5 kunci.
/api/v1/messagesKirim ke 1.000 nomor sekaligus
Kirim satu isi pesan ke banyak nomor. Permintaan divalidasi, dimasukkan ke antrean, lalu langsung dijawab. Untuk isi berbeda per nomor, gunakan permintaan terpisah dengan Idempotency-Key baru.
| Field | Format | Deskripsi |
|---|---|---|
country * | string | Kode negara ISO 3166-1 alpha-2. Contoh: US, GB, JP, KR. Tidak ada negara default. |
text * | string | 1–1.600 karakter setelah spasi di awal/akhir dihapus. Semua nomor dalam satu permintaan menerima isi yang sama. |
recipients * | string[] | 1–1.000 nomor ponsel. Disarankan format +kode negara; semua nomor harus dari negara yang sama dengan country. |
Idempotency-Key * | header | 8–100 karakter huruf Latin, angka, tanda hubung, atau garis bawah. Gunakan nilai unik untuk setiap permintaan. |
Jika ada satu saja nomor tidak valid atau duplikat, seluruh permintaan ditolak tanpa pengiriman maupun potongan saldo. Duplikat dicek setelah nomor diubah ke format internasional.
curl -X POST 'https://hexsms.com/api/v1/messages' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: notice-20261024-001' \
-d '{
"country": "US",
"text": "Your verification code is 482913.",
"recipients": ["+12025550123", "+12025550124"]
}'{
"id": "35bed356-b84a-452a-8e94-98b538972ecd",
"country": "US",
"state": "RUNNING",
"total": 2,
"segments": 1,
"unitPrice": 0.025,
"cost": 0.05,
"createdAt": 1792800000000,
"note": null,
"replayed": false
}Mencoba ulang dengan akun, Idempotency-Key, isi, dan urutan nomor yang sama mengembalikan hasil sebelumnya tanpa pengiriman atau potongan tambahan (200, replayed: true). Jika isi berbeda, hasilnya 409. Perlindungan duplikat tetap berlaku meski kunci API diganti. Kunci permintaan disimpan tanpa kedaluwarsa.
Begini biaya dihitung
Jumlah nomor × segmen (segments) × harga satuan akun UCS-2 memuat hingga 70 karakter dalam 1 segmen, lalu 67 karakter per segmen. Karakter dasar GSM-7 memuat hingga 160 karakter dalam 1 segmen, lalu 153 per segmen. Karakter ekstensi dihitung 2, emoji dihitung menurut panjang UTF-16. unitPrice dan cost dalam USDT. Harga satuan dalam respons adalah harga yang berlaku; 0.025 di atas hanya contoh.
/api/v1/messages/{id}Cek hasil pengiriman per nomor
Gunakan id dari API pengiriman. Hanya pengiriman via API milik akun yang sama yang dapat dilihat. Endpoint ini mengembalikan hasil tersimpan. Jika butuh hasil terbaru dari operator, panggil API pembaruan status berikut terlebih dahulu.
curl 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd?limit=1&offset=0' \
-H 'Authorization: Bearer YOUR_API_KEY'{
"id": "35bed356-b84a-452a-8e94-98b538972ecd",
"country": "US",
"state": "DONE",
"total": 2, "segments": 1,
"unitPrice": 0.025, "cost": 0.05,
"createdAt": 1792800000000, "note": null,
"summary": { "DELIVERED": 1, "PENDING": 1 },
"messages": [
{
"id": "d2787184-d8b8-49c6-9c15-1db90a6d5516",
"to": "12025550123",
"status": "DELIVERED",
"statusName": "DELIVERED_TO_HANDSET",
"description": "Message delivered to handset",
"error": null,
"updatedAt": 1792800005000
}
],
"pagination": { "limit": 1, "offset": 0, "nextOffset": 1 }
}limit bernilai 1–1.000 (default 100), offset 0–1.000 (default 0). Jika nextOffset bernilai null, itu halaman terakhir. summary adalah jumlah per status untuk semua nomor. to dikembalikan dalam format internasional tanpa +, waktu dalam milidetik Unix. Urutan hasil bisa berbeda dari urutan nomor saat dikirim; bedakan tiap message dengan id-nya.
Artinya pemrosesan antrean telah selesai. Untuk memastikan pesan sampai, cek apakah status di messages bernilai DELIVERED.
/api/v1/messages/{id}/refreshAmbil status penerimaan terbaru
Memperbarui hasil tersimpan dari log operator. Body tidak diperlukan. Setelah diperbarui, baca kembali hasilnya dengan GET. Pengiriman yang sama dapat diperbarui sekali per 30 detik. Log operator dapat diakses selama 48 jam setelah pengiriman. Di lingkungan dengan webhook, hasil dapat diperbarui otomatis.
curl -X POST 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd/refresh' \
-H 'Authorization: Bearer YOUR_API_KEY'{ "id": "35bed356-b84a-452a-8e94-98b538972ecd", "updated": 2 }updated adalah jumlah baris yang diperbarui. Nilainya bisa 0 jika pesan masih antre atau belum ada hasil baru. Disarankan memanggil GET dengan jeda minimal 10 detik dan meminta refresh hanya bila perlu.
Pahami kode status
state permintaan pengiriman
PREPARING disiapkan · RUNNING diproses · PAUSED dijeda · DONE antrean selesai · CANCELED dibatalkan
| status per nomor | Arti |
|---|---|
| QUEUED | Menunggu di antrean. |
| SENDING | Sedang dikirim ke operator. |
| PENDING | Diterima operator, menunggu hasil akhir. |
| DELIVERED | Terkirim ke perangkat penerima. |
| UNDELIVERABLE | Tidak dapat dikirim. |
| EXPIRED | Masa berlaku pengiriman telah habis. |
| REJECTED | Permintaan ditolak atau terjadi kesalahan pemrosesan. |
| CANCELED | Pengiriman yang antre dibatalkan. |
| UNKNOWN | Hasil belum diketahui. |
Operator dapat menambah kode status baru, jadi tangani juga status yang tidak dikenal. Alasan kegagalan dapat dilihat di statusName, description, dan error.
Cara menangani error
{ "error": "Kredit tidak cukup. Isi saldo lalu kirim ulang permintaan.", "code": "INSUFFICIENT_CREDITS" }| HTTP | code | Yang perlu dicek |
|---|---|---|
| 403 | COUNTRY_NOT_ENABLED | Cek tarif pengiriman per negara dan status aktifnya. |
| 400 | INVALID_COUNTRY | Isi country dengan kode negara ISO. |
| 400 | INVALID_BODY / INVALID_JSON / INVALID_TEXT | Cek objek JSON dan isi pesan. |
| 400 | INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONE | Cek jumlah, format, dan duplikat nomor. |
| 400 | INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATION | Cek kunci permintaan atau nilai halaman. |
| 401 | UNAUTHORIZED | Bearer API KEY tidak ada atau tidak valid. |
| 402 | INSUFFICIENT_CREDITS | Silakan isi kredit. |
| 403 | ACCOUNT_INACTIVE | Pastikan akun sudah disetujui dan aktif. |
| 404 | NOT_FOUND | Cek ID pengiriman dan kepemilikan akun. |
| 409 | IDEMPOTENCY_CONFLICT | Kunci permintaan yang sama dipakai untuk isi yang berbeda. |
| 413 / 415 | BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPE | Kirim body JSON maksimal 128KiB. |
| 429 | RATE_LIMITED / REFRESH_TOO_SOON | Tunggu sesuai detik di Retry-After, lalu coba lagi. |
| 500 / 502 | INTERNAL_ERROR / PROVIDER_UNAVAILABLE | Coba lagi nanti. Untuk mengulang pengiriman, gunakan kunci permintaan yang sama. |
| 503 | PREVIEW_ONLY | API sungguhan tidak dapat dipanggil dalam mode pratinjau. |
Setiap kunci API dapat mengirim hingga 120 permintaan per menit, gabungan pengiriman, cek status, dan pembaruan. Jika terkena batas, cek header Retry-After. API ini untuk integrasi antarserver; panggilan CORS dari browser tidak didukung.
Hubungkan dengan Node.js
const response = await fetch('https://hexsms.com/api/v1/messages', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.HEXSMS_API_KEY,
'Content-Type': 'application/json',
'Idempotency-Key': 'notice-20261024-001'
},
body: JSON.stringify({
country: 'US',
text: 'Your order is on its way.',
recipients: ['+12025550123', '+12025550124']
})
});
const result = await response.json();
if (!response.ok) throw new Error(result.code + ': ' + result.error);
console.log(result.id); // Use this ID to check delivery status.Buat kunci permintaan sekali per tugas, dan gunakan nilai yang sama saat mencoba ulang karena tidak ada respons. Mengirim ulang tugas yang sudah berhasil dengan kunci baru akan diproses sebagai pengiriman terpisah.