Pilih bahasa

Webhook

Terima peristiwa aktivasi di server Anda secara real time, verifikasi header SmsGrab-Signature, dan pahami pengulangan, pengiriman uji, serta penonaktifan otomatis.

Di halaman ini
  1. Peristiwa
  2. Membuat webhook
  3. Bentuk pengiriman
  4. Verifikasi tanda tangan
  5. Jawab dengan cepat
  6. Pengulangan
  7. Penonaktifan otomatis
  8. Uji dan kirim ulang

Webhook mengirim peristiwa ke server Anda saat peristiwa itu terjadi, jadi Anda tidak perlu terus bertanya. Satu webhook milik satu kunci API. Webhook menerima peristiwa nomor yang dibeli dengan kunci itu, ditambah peringatan saldo rendah untuk akun Anda.

Peristiwa

Peristiwa Kapan
activation.created Nomor dibeli
activation.code_received Setiap SMS baru, dengan semua pesan sejauh ini
activation.completed Diselesaikan oleh Anda, atau saat waktu habis setelah ada kode
activation.cancelled Dibatalkan sebelum ada kode, dikembalikan
activation.expired Tidak ada kode tepat waktu, dikembalikan
activation.refunded Setiap pengembalian atas potongan
balance.low Saldo turun di bawah ambang yang Anda tetapkan
webhook.test Pengiriman uji yang Anda mulai

Membuat webhook

Di Akun > Developer, buka kunci lalu tambahkan webhook dengan URL, peristiwa yang Anda inginkan, dan deskripsi opsional. Setiap kunci bisa punya hingga 3 webhook.

URL harus:

  • diawali https://;
  • memakai nama host, bukan alamat IP;
  • mengarah ke alamat publik. Jaringan privat, localhost, dan rentang serupa ditolak.

Anda menerima rahasia penandatanganan yang diawali whsec_. Seperti kunci API, rahasia ini hanya ditampilkan sekali. Anda bisa menggantinya nanti, yang juga meminta kata sandi.

Bentuk pengiriman

HTTP
POST /your/endpoint HTTP/1.1
Content-Type: application/json
User-Agent: SmsGrab-Webhooks/1.0
SmsGrab-Event: activation.code_received
SmsGrab-Delivery: 9f7d6c1e-2b44-4c1a-8f0e-6a3d2c1b0e9f
SmsGrab-Signature: t=1790503200,v1=3b9a0c…

{ "id": "evt_4e1f…", "type": "activation.code_received", "created_at": "2026-09-27T10:06:12.004Z",
  "api_version": "2026-09-27", "data": { "activation": { "id": "5c1d0c2e-…", "status": "CODE_RECEIVED" } } }

Verifikasi tanda tangan

SmsGrab-Signature berisi stempel waktu t dan v1, yaitu HMAC-SHA256 dari t, sebuah titik, dan body mentah permintaan, dengan rahasia Anda sebagai kunci. Tolak pengiriman yang stempel waktunya berjarak lebih dari 300 detik dari jam Anda, dan bandingkan tanda tangan dalam waktu konstan.

PHP
[$t, $v1] = (function (string $h): array {
    parse_str(str_replace(',', '&', $h), $p);
    return [(int) ($p['t'] ?? 0), (string) ($p['v1'] ?? '')];
})($_SERVER['HTTP_SMSGRAB_SIGNATURE'] ?? '');
$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', $t.'.'.$body, getenv('SMSGRAB_WEBHOOK_SECRET'));
$ok = abs(time() - $t) <= 300 && hash_equals($expected, $v1);
Python
import hmac, hashlib, time

def verify(header: str, body: bytes, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t = int(parts.get("t", "0"))
    expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
    return abs(time.time() - t) <= 300 and hmac.compare_digest(expected, parts.get("v1", ""))
JavaScript
import crypto from 'node:crypto';

export function verify(header, rawBody, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  const t = Number(parts.t ?? 0);
  const expected = crypto.createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest('hex');
  const given = Buffer.from(parts.v1 ?? '', 'utf8');
  return Math.abs(Date.now() / 1000 - t) <= 300 && given.length === expected.length
    && crypto.timingSafeEqual(Buffer.from(expected, 'utf8'), given);
}

Selalu periksa body mentah persis seperti yang Anda terima, sebelum mem-parsing JSON.

Jawab dengan cepat

Jawab dengan status 2xx apa pun dalam 10 detik dan kerjakan tugas lambat sesudahnya, misalnya di antrean. Pengalihan tidak diikuti.

Pengulangan

Pengiriman yang gagal diulang setelah 1 menit, 5 menit, 15 menit, 1 jam, 3 jam, 6 jam, 12 jam, dan 24 jam. Pengulangan membawa id peristiwa yang sama, jadi simpan id yang sudah diproses dan lewati duplikat. Peristiwa untuk satu aktivasi datang berurutan.

Penonaktifan otomatis

  • Menjawab 410 Gone langsung menonaktifkan webhook.
  • Setelah 50 percobaan gagal berturut-turut dalam minimal 24 jam, webhook dinonaktifkan dan Anda mendapat notifikasi. Perbaiki endpoint Anda, lalu aktifkan lagi webhook-nya.
  • Mencabut kunci menonaktifkan webhook-nya.

Uji dan kirim ulang

Kirim peristiwa webhook.test dari halaman webhook untuk langsung melihat kode status, waktu respons, dan galat apa pun. Daftar pengiriman menyimpan setiap pengiriman selama 30 hari, dan Anda bisa mengirim ulang yang mana saja.

Apakah artikel ini membantu?

Masih perlu bantuan?

Tulis ke kami. Kami membalas setiap pesan, biasanya dalam beberapa jam.

Atau kirim email ke support@smsgrab.com