Langsung ke konten
HEXSMSDEVELOPERS
HEXSMS API · v1

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.

REST APIJSONMaks. 1.000 penerima / permintaan

Mulai cepat

  1. Buat kunci API

    Setelah mendaftar, disetujui, dan login dengan OTP, buka Kelola kunci API untuk membuat kunci.

  2. Siapkan kredit

    API memakai kredit dan tarif akun Anda. Biaya dipotong saat pengiriman diterima.

  3. Kirim pesan dan cek hasilnya

    Simpan ID pengiriman dan cek hasilnya lewat API status.

Base URL https://hexsms.com

Untuk integrasi sungguhan, panggil API dari server melalui HTTPS. Lingkungan pratinjau tidak mendukung penerbitan kunci asli maupun pengiriman API.

Negara yang didukung

190+Cakupan jaringan global

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.

200 OK
{ "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.

HTTP
Authorization: Bearer hex_live_KUNCI_API_ANDA

Kunci 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.

POST/api/v1/messages

Kirim 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.

FieldFormatDeskripsi
country *stringKode negara ISO 3166-1 alpha-2. Contoh: US, GB, JP, KR. Tidak ada negara default.
text *string1–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 *header8–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 · Kirim massal
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"]
  }'
202 Accepted · Masuk antrean pengiriman
{
  "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
}
Jika respons terputus, kirim ulang dengan kunci permintaan yang sama.

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.

GET/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 · Cek status
curl 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd?limit=1&offset=0' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK · Hasil per nomor
{
  "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.

DONE bukan berarti pesan sudah diterima.

Artinya pemrosesan antrean telah selesai. Untuk memastikan pesan sampai, cek apakah status di messages bernilai DELIVERED.

POST/api/v1/messages/{id}/refresh

Ambil 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 · Perbarui status terbaru
curl -X POST 'https://hexsms.com/api/v1/messages/35bed356-b84a-452a-8e94-98b538972ecd/refresh' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 OK
{ "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 nomorArti
QUEUEDMenunggu di antrean.
SENDINGSedang dikirim ke operator.
PENDINGDiterima operator, menunggu hasil akhir.
DELIVEREDTerkirim ke perangkat penerima.
UNDELIVERABLETidak dapat dikirim.
EXPIREDMasa berlaku pengiriman telah habis.
REJECTEDPermintaan ditolak atau terjadi kesalahan pemrosesan.
CANCELEDPengiriman yang antre dibatalkan.
UNKNOWNHasil 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

Format respons error
{ "error": "Kredit tidak cukup. Isi saldo lalu kirim ulang permintaan.", "code": "INSUFFICIENT_CREDITS" }
HTTPcodeYang perlu dicek
403COUNTRY_NOT_ENABLEDCek tarif pengiriman per negara dan status aktifnya.
400INVALID_COUNTRYIsi country dengan kode negara ISO.
400INVALID_BODY / INVALID_JSON / INVALID_TEXTCek objek JSON dan isi pesan.
400INVALID_RECIPIENTS / INVALID_PHONE / DUPLICATE_PHONECek jumlah, format, dan duplikat nomor.
400INVALID_IDEMPOTENCY_KEY / INVALID_PAGINATIONCek kunci permintaan atau nilai halaman.
401UNAUTHORIZEDBearer API KEY tidak ada atau tidak valid.
402INSUFFICIENT_CREDITSSilakan isi kredit.
403ACCOUNT_INACTIVEPastikan akun sudah disetujui dan aktif.
404NOT_FOUNDCek ID pengiriman dan kepemilikan akun.
409IDEMPOTENCY_CONFLICTKunci permintaan yang sama dipakai untuk isi yang berbeda.
413 / 415BODY_TOO_LARGE / UNSUPPORTED_MEDIA_TYPEKirim body JSON maksimal 128KiB.
429RATE_LIMITED / REFRESH_TOO_SOONTunggu sesuai detik di Retry-After, lalu coba lagi.
500 / 502INTERNAL_ERROR / PROVIDER_UNAVAILABLECoba lagi nanti. Untuk mengulang pengiriman, gunakan kunci permintaan yang sama.
503PREVIEW_ONLYAPI 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

Node.js · Jalankan di server
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.