Obrázky a videa
Webhooky
Dostanete HTTPS notifikaci, když úloha s obrázkem nebo videem skončí nebo selže, místo neustálého dotazování.
Nastavení
Endpointy přidáte na stránce Webhooky, nebo pošlete webhook_url u jednotlivého požadavku. Každý zapnutý endpoint dostává job.completed a job.failed.
Obsah
http
POST https://your-app.com/webhooks/sweetrouter
SweetRouter-Event: job.completed
SweetRouter-Delivery: cmg9a1...
SweetRouter-Signature: t=1791105133,v1=5f1c...
{
"id": "cmg9a1...",
"type": "job.completed",
"created_at": "2026-10-04T09:12:13.500Z",
"data": { "id": "cmg8x2k0d0001", "object": "job", "status": "completed", "outputs": [ ... ] }
}Ověření podpisu
Každý požadavek nese SweetRouter-Signature: t=timestamp,v1=hmac. Spočítejte HMAC-SHA256 z timestamp.rawBody se svým podpisovým klíčem a porovnejte. Odmítněte vše starší než 5 minut.
node.js
import crypto from "node:crypto"
export function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((part) => part.split("=")))
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`)
.digest("hex")
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300
return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1))
}Opakování
Odpovězte libovolným 2xx do 10 sekund. Jinak to zkusíme znovu za 1 minutu, 5 minut, 30 minut, 2 hodiny a 6 hodin a pak přestaneme. Doručení může dorazit víckrát, proto deduplikujte podle id doručení.