Mga Webhook
Sa halip na mag-poll, magbigay ng webhook_url para sa isang run. Kapag umabot ang kahilingan sa final status (succeeded, failed o canceled), nagpapadala kami ng pirmadong POST sa URL na iyon.
curl -X POST "https://api.doitong.com/v1/run/{model_id}?webhook_url=https://example.com/hooks/doitong" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "..."}'
Ang event
POST /hooks/doitong HTTP/1.1
Content-Type: application/json
User-Agent: Doitong-Webhooks/1
Doitong-Request-Id: req_8k2m4q7x1z9c3v5b6n0p2r4t
Doitong-Signature: t=1760961609,v1=5f1c0d6e2b…
{
"id": "evt_8k2m4q7x1z9c3v5b6n0p2r4t_succeeded",
"object": "event",
"type": "request.succeeded",
"created_at": "2026-10-20T12:00:09Z",
"data": {
"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
"object": "request",
"status": "succeeded",
"outputs": [ { "type": "video", "url": "https://content.doitong.com/dev-api/…/0-output.mp4" } ]
}
}
- Ang
typeayrequest.succeeded,request.failedorequest.canceled. - Ang
dataay ang buong object ng kahilingan, eksaktong ibinabalik ngGET /requests/{id}. - Ang
iday stable para sa isang kahilingan at final status nito. Gamitin ito para balewalain ang delivery na naproseso mo na.
Mga delivery at muling pagsubok
Tumugon gamit ang anumang 2xx status sa loob ng 10 segundo. Ang iba pa (o timeout) ay muling sinusubukan: hanggang 6 na pagtatangka sa kabuuan, makalipas ang 30 segundo, 2 minuto, 10 minuto, 1 oras at 6 na oras. Gawin ang mabagal na pagproseso pagkatapos tumugon, hindi bago.
I-verify ang signature
May sariling signing secret ang bawat key. Basahin ito nang isang beses mula sa GET https://api.doitong.com/v1/account (webhook_signing_secret, nagsisimula ito sa whsec_) at itago kasama ng key.
Ang Doitong-Signature header ay t=<unix time>,v1=<signature>, kung saan ang signature ay hex HMAC-SHA256 ng "<t>.<raw request body>" gamit ang secret mo bilang key. Para i-verify:
- Kunin ang raw body bytes nang eksakto gaya ng natanggap (bago ang anumang JSON parsing).
- Kuwentahin ang HMAC-SHA256 ng
t + "." + bodygamit ang secret mo, bilang lowercase hex. - Ihambing ito sa
v1gamit ang constant time. - Tanggihan ang event kapag higit 5 minuto ang layo ng
tsa orasan mo (proteksiyon laban sa replay).
Kumpletong receiver sa Node.js (Express) at Python (Flask):
import crypto from "node:crypto";
import express from "express";
const SECRET = process.env.DOITONG_WEBHOOK_SECRET; // whsec_...
const app = express();
app.post("/hooks/doitong", express.raw({ type: "application/json" }), (req, res) => {
const header = req.get("Doitong-Signature") || "";
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
const t = Number(parts.t);
const expected = crypto.createHmac("sha256", SECRET).update(t + "." + req.body).digest("hex");
const given = Buffer.from(parts.v1 || "", "utf8");
const valid =
given.length === expected.length &&
crypto.timingSafeEqual(given, Buffer.from(expected, "utf8")) &&
Math.abs(Date.now() / 1000 - t) < 300;
if (!valid) return res.status(400).send("bad signature");
const event = JSON.parse(req.body);
if (event.type === "request.succeeded") {
console.log(event.data.id, event.data.outputs.map((o) => o.url));
}
res.sendStatus(204);
});
import hashlib
import hmac
import json
import os
import time
from flask import Flask, abort, request
SECRET = os.environ["DOITONG_WEBHOOK_SECRET"].encode() # whsec_...
app = Flask(__name__)
@app.post("/hooks/doitong")
def doitong_hook():
body = request.get_data() # raw bytes
parts = dict(p.split("=", 1) for p in request.headers.get("Doitong-Signature", "").split(",") if "=" in p)
t = parts.get("t", "0")
expected = hmac.new(SECRET, t.encode() + b"." + body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, parts.get("v1", "")) or abs(time.time() - int(t)) > 300:
abort(400)
event = json.loads(body)
if event["type"] == "request.succeeded":
print(event["data"]["id"], [o["url"] for o in event["data"]["outputs"]])
return "", 204
Mga tip
- Tumugon agad at i-queue ang sarili mong pagproseso.
- Ang secret ay pagmamay-ari ng API key na nagsimula ng run. Magkakaiba ang secret ng mga key sa iba't ibang service.