Wybierz język

Webhooki

Odbieraj zdarzenia aktywacji na serwerze w czasie rzeczywistym, weryfikuj nagłówek SmsGrab-Signature i poznaj ponowienia, dostawy testowe oraz automatyczne wyłączanie.

Na tej stronie
  1. Zdarzenia
  2. Tworzenie webhooka
  3. Jak wygląda dostawa
  4. Weryfikacja podpisu
  5. Odpowiadaj szybko
  6. Ponowienia
  7. Automatyczne wyłączanie
  8. Test i ponowna dostawa

Webhooki wysyłają zdarzenia na Twój serwer w chwili, gdy się dzieją, więc nie musisz odpytywać. Webhook należy do jednego klucza API. Odbiera zdarzenia numerów kupionych tym kluczem oraz alerty o niskim saldzie konta.

Zdarzenia

Zdarzenie Kiedy
activation.created Kupiono numer
activation.code_received Każdy nowy SMS, ze wszystkimi dotychczasowymi wiadomościami
activation.completed Zakończony przez Ciebie albo po upływie czasu po kodzie
activation.cancelled Anulowany przed kodem, zwrócony
activation.expired Brak kodu na czas, zwrócony
activation.refunded Każdy zwrot opłaty
balance.low Saldo spadło poniżej ustawionego progu
webhook.test Uruchomiona przez Ciebie dostawa testowa

Tworzenie webhooka

W Konto > Deweloperzy otwórz klucz i dodaj webhook z adresem URL, wybranymi zdarzeniami i opcjonalnym opisem. Każdy klucz może mieć do 3 webhooków.

Adres URL musi:

  • zaczynać się od https://;
  • używać nazwy hosta, a nie adresu IP;
  • prowadzić do adresu publicznego. Sieci prywatne, localhost i podobne zakresy są odrzucane.

Otrzymujesz sekret podpisu zaczynający się od whsec_. Tak jak klucz API, jest pokazywany tylko raz. Później możesz go wymienić, co również wymaga hasła.

Jak wygląda dostawa

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" } } }

Weryfikacja podpisu

SmsGrab-Signature zawiera znacznik czasu t i v1, czyli HMAC-SHA256 z t, kropki i surowej treści żądania, z Twoim sekretem jako kluczem. Odrzucaj dostawy, których znacznik czasu różni się od Twojego zegara o więcej niż 300 sekund, i porównuj podpisy w stałym czasie.

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);
}

Zawsze sprawdzaj surową treść dokładnie w otrzymanej postaci, zanim sparsujesz JSON.

Odpowiadaj szybko

Odpowiedz dowolnym statusem 2xx w ciągu 10 sekund, a czasochłonną pracę wykonaj później, na przykład w kolejce. Przekierowania nie są obsługiwane.

Ponowienia

Nieudana dostawa jest ponawiana po 1 minucie, 5 minutach, 15 minutach, 1 godzinie, 3 godzinach, 6 godzinach, 12 godzinach i 24 godzinach. Ponowienie powtarza ten sam id zdarzenia, więc zapamiętuj przetworzone identyfikatory i pomijaj duplikaty. Zdarzenia jednej aktywacji przychodzą w kolejności.

Automatyczne wyłączanie

  • Odpowiedź 410 Gone od razu wyłącza webhook.
  • Po 50 nieudanych próbach z rzędu w ciągu co najmniej 24 godzin webhook zostaje wyłączony, a Ty dostajesz powiadomienie. Napraw endpoint, a potem włącz webhook ponownie.
  • Unieważnienie klucza wyłącza jego webhooki.

Test i ponowna dostawa

Wyślij zdarzenie webhook.test ze strony webhooka, aby od razu zobaczyć kod statusu, czas odpowiedzi i ewentualny błąd. Lista dostaw przechowuje każdą dostawę przez 30 dni i możesz wysłać dowolną z nich ponownie.

Czy ten artykuł był pomocny?

Nadal potrzebujesz pomocy?

Napisz do nas. Odpowiadamy na każdą wiadomość, zwykle w ciągu kilku godzin.

Albo napisz na adres support@smsgrab.com