Μετάβαση στο περιεχόμενο
Οδηγός API

Webhook

Προβολή ως Markdown Ενημερώθηκε

Αντί για polling, δώστε σε μια εκτέλεση ένα webhook_url. Όταν το αίτημα φτάσει σε τελική κατάσταση (succeeded, failed ή canceled), στέλνουμε υπογεγραμμένο POST σε αυτή τη διεύθυνση.

τερματικό
curl -X POST "https://api.doitong.ru/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 δευτερολέπτων. Οτιδήποτε άλλο (ή ένα timeout) επαναλαμβάνεται: έως 6 προσπάθειες συνολικά, μετά από 30 δευτερόλεπτα, 2 λεπτά, 10 λεπτά, 1 ώρα και 6 ώρες. Εκτελέστε τις αργές εργασίες μετά την απάντηση, όχι πριν.

Επαλήθευση υπογραφής

Κάθε κλειδί έχει το δικό του μυστικό υπογραφής. Διαβάστε το μία φορά από το GET https://api.doitong.ru/v1/account (webhook_signing_secret, ξεκινά με whsec_) και αποθηκεύστε το μαζί με το κλειδί.

Η κεφαλίδα Doitong-Signature είναι t=<unix time>,v1=<signature>, όπου η υπογραφή είναι το hex HMAC-SHA256 του "<t>.<raw request body>", με το μυστικό σας ως κλειδί. Για επαλήθευση:

  1. Πάρτε τα byte του αρχικού σώματος ακριβώς όπως παραλήφθηκαν (πριν από οποιαδήποτε ανάλυση JSON).
  2. Υπολογίστε HMAC-SHA256 του t + "." + body με το μυστικό σας, ως πεζά δεκαεξαδικά.
  3. Συγκρίνετέ το με το v1 σε σταθερό χρόνο.
  4. Απορρίψτε το συμβάν όταν το 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);
});

Συμβουλές

  • Απαντήστε γρήγορα και τοποθετήστε την επεξεργασία στη δική σας ουρά.
  • Το μυστικό ανήκει στο κλειδί API που ξεκίνησε την εκτέλεση. Τα κλειδιά σε διαφορετικές υπηρεσίες έχουν διαφορετικά μυστικά.