Lumaktaw sa nilalaman
Gabay sa API

Mga Webhook

Tingnan bilang Markdown Na-update

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.

terminal
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

Request headers
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…
Request body
{
  "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 type ay request.succeeded, request.failed o request.canceled.
  • Ang data ay ang buong object ng kahilingan, eksaktong ibinabalik ng GET /requests/{id}.
  • Ang id ay 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:

  1. Kunin ang raw body bytes nang eksakto gaya ng natanggap (bago ang anumang JSON parsing).
  2. Kuwentahin ang HMAC-SHA256 ng t + "." + body gamit ang secret mo, bilang lowercase hex.
  3. Ihambing ito sa v1 gamit ang constant time.
  4. Tanggihan ang event kapag higit 5 minuto ang layo ng t sa 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);
});

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.