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
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
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.
[$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);
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", ""))
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 Goneod 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?
Dziękujemy! Cieszymy się, że pomogło.