וועבהאָאָקס
אַנשטאָט צו פּאָלן, געבט אַ לויף אַ webhook_url. ווען די בקשה דערגרייכט אַ לעצטן סטאַטוס (succeeded, failed אָדער
canceled), שיקן מיר אַן אונטערגעשריבענע POST צו יענער URL.
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": "..."}'
דער עווענט
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" } ]
}
}
typeאיזrequest.succeeded,request.failedאָדערrequest.canceled.dataאיז דער גאַנצער בקשה־אָביעקט, פּונקט דאָס וואָסGET /requests/{id}גיט צוריק.idאיז סטאַביל פֿאַר אַ בקשה און איר לעצטן סטאַטוס. ניצט עס צו איגנאָרירן אַ דעליווערי וואָס איר האָט שוין פּראַסעסט.
דעליווערי און ווידער־פּרואוון
ענטפֿערט מיט סיי וועלכן 2xx סטאַטוס אין 10 סעקונדעס. אַלץ אַנדערש (אָדער אַ טיימאַוט) ווערט ווידער געפּרואווט: ביז 6 פּרואוון אין גאַנצן,
נאָך 30 סעקונדעס, 2 מינוט, 10 מינוט, 1 שעה און 6 שעה. טוט די פּאַמעלעך אַרבעט נאָך אייער ענטפֿער, נישט פֿריִער.
באַשטעטיקט די סיגנאַטור
יעדער שליסל האָט זײַן אייגענע אונטערשרײַב־סוד. לייענט עס איין מאָל פֿון GET https://api.doitong.com/v1/account (webhook_signing_secret,
עס הייבט זיך אָן מיט whsec_) און היט עס בײַם שליסל.
דער Doitong-Signature כעדער איז t=<unix time>,v1=<signature>, וווּ די סיגנאַטור איז דער העקס
HMAC-SHA256 פֿון "<t>.<raw request body>" מיט אייער סוד ווי דער שליסל. צו באַשטעטיקן:
- נעמט די רויע גוף־בייטן פּונקט ווי זיי זענען אָנגעקומען (איידער סיי וועלכע JSON פּאַרסינג).
- רעכנט אויס HMAC-SHA256 פֿון
t + "." + bodyמיט אייער סוד, ווי קליינע העקס־אותיות. - פֿאַרגלייכט עס מיט
v1אין קאַנסטאַנטער צײַט. - פֿאַרוואַרפֿט דעם עווענט ווען
tאיז מער ווי 5 מינוט ווײַט פֿון אייער זייגער (שוץ קעגן ווידערשפּילן).
א גאַנצער ריסיווער אין Node.js (Express) און 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
עצות
- ענטפֿערט שנעל און לייגט אייער אייגענע פּראַסעסינג אין אַ ריי.
- דער סוד געהערט צום API שליסל וואָס האָט אָנגעהויבן דעם לויף. שליסלען אין פאַרשידענע סערוויסן האָבן פאַרשידענע סודות.