Vyberte jazyk

Webhooky

Přijímejte události aktivací na svém serveru v reálném čase, ověřujte hlavičku SmsGrab-Signature a pochopte opakování, testovací doručení a automatické vypnutí.

Na této stránce
  1. Události
  2. Vytvoření webhooku
  3. Jak vypadá doručení
  4. Ověření podpisu
  5. Odpovídejte rychle
  6. Opakování
  7. Automatické vypnutí
  8. Test a opětovné doručení

Webhooky posílají události na váš server ve chvíli, kdy nastanou, takže se nemusíte dotazovat. Webhook patří k jednomu klíči API. Přijímá události čísel koupených tímto klíčem a také upozornění na nízký zůstatek účtu.

Události

Událost Kdy
activation.created Bylo koupeno číslo
activation.code_received Každá nová SMS, se všemi dosavadními zprávami
activation.completed Dokončeno vámi, nebo po vypršení času po kódu
activation.cancelled Zrušeno před kódem, peníze vráceny
activation.expired Kód nepřišel včas, peníze vráceny
activation.refunded Jakékoli vrácení platby
balance.low Zůstatek klesl pod nastavenou hranici
webhook.test Testovací doručení, které jste spustili

Vytvoření webhooku

V Účet > Vývojáři otevřete klíč a přidejte webhook s URL, požadovanými událostmi a volitelným popisem. Každý klíč může mít až 3 webhooky.

URL musí:

  • začínat https://;
  • používat název hostitele, ne IP adresu;
  • vést na veřejnou adresu. Soukromé sítě, localhost a podobné rozsahy se odmítají.

Dostanete podpisový tajný klíč začínající whsec_. Stejně jako klíč API se zobrazí jen jednou. Později ho můžete vyměnit, což také vyžaduje heslo.

Jak vypadá doručení

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

Ověření podpisu

SmsGrab-Signature obsahuje časové razítko t a v1, tedy HMAC-SHA256 z t, tečky a nezpracovaného těla požadavku, klíčovaný vaším tajným klíčem. Odmítejte doručení, jejichž časové razítko se od vašich hodin liší o víc než 300 sekund, a podpisy porovnávejte v konstantním čase.

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

Vždy ověřujte nezpracované tělo přesně tak, jak jste ho přijali, ještě před parsováním JSON.

Odpovídejte rychle

Odpovězte jakýmkoli stavem 2xx do 10 sekund a pomalou práci udělejte až potom, například ve frontě. Přesměrování se nesledují.

Opakování

Neúspěšné doručení se opakuje po 1 minutě, 5 minutách, 15 minutách, 1 hodině, 3 hodinách, 6 hodinách, 12 hodinách a 24 hodinách. Opakování nese stejné id události, takže si zpracovaná id pamatujte a duplicity přeskakujte. Události jedné aktivace přicházejí popořadě.

Automatické vypnutí

  • Odpověď 410 Gone webhook okamžitě vypne.
  • Po 50 neúspěšných pokusech za sebou během alespoň 24 hodin se webhook vypne a dostanete oznámení. Opravte endpoint a potom webhook znovu zapněte.
  • Zneplatnění klíče vypne jeho webhooky.

Test a opětovné doručení

Pošlete ze stránky webhooku událost webhook.test a hned uvidíte stavový kód, dobu odezvy a případnou chybu. Seznam doručení uchovává každé doručení 30 dní a kterékoli z nich můžete poslat znovu.

Pomohl vám tento článek?

Stále potřebujete pomoc?

Napište nám. Odpovídáme na každou zprávu, obvykle během několika hodin.

Nebo nám napište na support@smsgrab.com