Schnellstart
Führe deine erste Generierung in wenigen Minuten aus. Alle 1.496 Modelle akzeptieren dieselbe Art von Anfrage und geben dasselbe Anfrageobjekt zurück – für Bild, Video und Audio: Lerne es hier einmal.
1. API-Schlüssel abrufen
Erstelle einen Schlüssel unter https://doitong.com/developers/dashboard#keys und speichere ihn in einer
Umgebungsvariable: Er wird nur einmal angezeigt. Jeder Schlüssel kann ein eigenes Budget haben, sodass du ihn einem Agenten geben kannst,
ohne das gesamte Konto zu gefährden. GET /account gibt dein API-Guthaben zurück.
export DOITONG_API_KEY="doitong_..."
curl "https://api.doitong.com/v1/account" \
-H "Authorization: Bearer $DOITONG_API_KEY"
const res = await fetch("https://api.doitong.com/v1/account", {
headers: { Authorization: `Bearer ${process.env.DOITONG_API_KEY}` },
});
console.log(await res.json());
import os
import requests
r = requests.get(
"https://api.doitong.com/v1/account",
headers={"Authorization": f"Bearer {os.environ['DOITONG_API_KEY']}"},
)
print(r.json())
Ausführungen werden vom API-Guthaben deines Kontos in API-Credits bezahlt: 1.000 API-Credits = 1 $, und jedes Modell kostet genau den Preis seines Anbieters. Lade unter https://doitong.com/developers/dashboard#balance Guthaben auf.
2. Preis abfragen, dann ausführen
POST /quote/{model_id} nimmt das Eingabe-JSON entgegen und gibt den exakten Preis zurück. Dafür ist kein Schlüssel erforderlich und es entstehen keine Kosten.
Die Ausführung derselben Eingabe kostet genau diesen Betrag: Das Angebot ist die Abbuchung. (Eine Ausnahme bilden Modelle, die nach Nutzung abgerechnet werden:
Ihr Angebot ist der Höchstbetrag, den die Ausführung kosten kann; der nicht genutzte Teil wird nach der Ausführung erstattet.)
curl -X POST "https://api.doitong.com/v1/quote/kling-video/v3/pro/image-to-video" \
-H "Content-Type: application/json" \
-d '{"image": "https://example.com/fox.jpg", "duration": 5, "generate_audio": true}'
const res = await fetch("https://api.doitong.com/v1/quote/kling-video/v3/pro/image-to-video", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ image: "https://example.com/fox.jpg", duration: 5, generate_audio: true }),
});
const quote = await res.json();
console.log(quote.credits, quote.usd); // 840 "0.84"
import requests
r = requests.post(
"https://api.doitong.com/v1/quote/kling-video/v3/pro/image-to-video",
json={"image": "https://example.com/fox.jpg", "duration": 5, "generate_audio": True},
)
print(r.json()["credits"], r.json()["usd"]) # 840 0.84
{
"object": "quote",
"model": "kling-video/v3/pro/image-to-video",
"credits": 840,
"usd": "0.84",
"unit": "second",
"quantity": 5,
"unit_credits": 168,
"mode": "exact",
"breakdown": "5 s × 168 API credits"
}
Sende anschließend denselben Body an POST /run/{model_id}. Füge ?wait=20 hinzu, um die Verbindung bis zu 20 Sekunden zu halten: Ein schnelles
Modell gibt das fertige Ergebnis in einer einzigen Hin- und Rückübertragung zurück. Sende einen Idempotency-Key-Header, damit ein erneuter Versuch niemals zweimal
läuft (oder zweimal abgerechnet wird).
curl -X POST "https://api.doitong.com/v1/run/flux/schnell?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: lighthouse-001" \
-d '{"prompt": "A lighthouse on a rocky coast at dusk, warm light in the window"}'
const res = await fetch("https://api.doitong.com/v1/run/flux/schnell?wait=20", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.DOITONG_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "lighthouse-001",
},
body: JSON.stringify({ prompt: "A lighthouse on a rocky coast at dusk, warm light in the window" }),
});
const request = await res.json();
console.log(request.status, request.outputs[0]?.url);
import os
import requests
r = requests.post(
"https://api.doitong.com/v1/run/flux/schnell",
params={"wait": 20},
headers={
"Authorization": f"Bearer {os.environ['DOITONG_API_KEY']}",
"Idempotency-Key": "lighthouse-001",
},
json={"prompt": "A lighthouse on a rocky coast at dusk, warm light in the window"},
)
request = r.json()
print(request["status"], request["outputs"][0]["url"] if request["outputs"] else None)
Die Antwort ist ein Anfrageobjekt:
{
"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
"object": "request",
"model": "flux/schnell",
"status": "succeeded",
"cost": { "credits": 3, "usd": "0.003", "charged": 3, "refunded": 0 },
"outputs": [
{ "type": "image", "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.jpeg",
"content_type": "image/jpeg", "width": 1024, "height": 768, "stored": true }
],
"error": null
}
3. Status verfolgen
Wenn das Modell beim Ende der Wartezeit noch arbeitet, erhältst du 202 Accepted mit der id der Anfrage und ihrem aktuellen
status. Jede Anfrage durchläuft denselben Lebenszyklus:
-
queuedAkzeptiert und abgerechnet, wartet auf einen Worker -
runningDas Modell generiert -
Endstatus:
succeededDas Angebot wurde berechnet; outputs[] enthält URLs in unserem SpeicherfailedAutomatisch erstattet; der Fehler erklärt den GrundcanceledVor einem Ergebnis gestoppt; erstattet
Lies die Anfrage erneut mit ihrer ID. Auch hier funktioniert ?wait=20, daher genügt eine einfache Schleife:
curl "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY"
const headers = { Authorization: `Bearer ${process.env.DOITONG_API_KEY}` };
let request = await (await fetch("https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20", { headers })).json();
while (request.status === "queued" || request.status === "running") {
const res = await fetch(`https://api.doitong.com/v1/requests/${request.id}?wait=20`, { headers });
request = await res.json();
}
console.log(request.status, request.outputs[0]?.url);
import os
import requests
headers = {"Authorization": f"Bearer {os.environ['DOITONG_API_KEY']}"}
request = {"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t", "status": "queued"}
while request["status"] in ("queued", "running"):
request = requests.get(
f"https://api.doitong.com/v1/requests/{request['id']}",
params={"wait": 20},
headers=headers,
).json()
print(request["status"], request["outputs"][0]["url"] if request["outputs"] else None)
Wenn status succeeded lautet, enthält outputs[].url Links zu den Dateien in unserem Speicher. Wenn die Anfrage failed oder
canceled lautet, werden ihre API-Credits automatisch erstattet, und error gibt den Grund an. Brich alles ab, was noch queued oder
running ist:
curl -X POST "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Bei langen Videoaufträgen kannst du das Polling überspringen und stattdessen eine webhook_url übergeben (siehe Webhooks).
4. Dateien
Übergebe eine beliebige öffentliche URL als Eingabe oder fordere mit POST /files eine Upload-URL an, führe dort PUT für die Datei aus und verwende die zurückgegebene
file_url (siehe Dateien). Eine erfolgreiche Anfrage listet ihre Ergebnisse in outputs[] mit
type, content type und, sofern bekannt, Abmessungen und Dauer auf.
curl -X POST "https://api.doitong.com/v1/files" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-d '{"filename": "fox.jpg", "content_type": "image/jpeg", "size": 482113}'
Fehler
Jedes Modell schlägt auf dieselbe Weise fehl: ein Umschlag mit einem type, einem exakten code, dem verursachenden param und jedem Problem
in details, sodass ein Agent die Anfrage korrigieren kann, ohne Fließtext zu lesen. Für eine ungültige Anfrage wird nichts abgerechnet.
{
"error": {
"type": "invalid_request",
"code": "invalid_input",
"message": "duration must be one of 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15.",
"param": "duration",
"details": [ { "param": "duration", "message": "duration must be one of 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15." } ],
"request_id": null,
"doc_url": "https://doitong.com/developers/docs/errors#invalid_input"
}
}
Jeder Typ und jeder Code ist unter Fehler aufgeführt.
Preise
Die Preise werden in USD und API-Credits angegeben und auf jeder Modellseite angezeigt, bevor du eine Ausführung startest. Jede Anfrage enthält cost mit
credits, usd, charged und refunded. Eine Ausführung wird abgerechnet, sobald sie angenommen wurde; failed- und canceled-Anfragen werden
automatisch erstattet. Einige Modelle werden exakt anhand der Eingabe bepreist, einige anhand der Länge oder Größe der von dir gesendeten Dateien,
bei anderen gilt ein geschätzter Preis pro Ausführung: In jedem Fall ist das Angebot der zu zahlende Betrag. Einige Modelle (Sprach- und
Vision-Modelle, Sprach- und Verarbeitungszeit-Tools) werden nach Nutzung abgerechnet: Das Angebot ist der Höchstbetrag, den die Ausführung kosten kann,
der nicht genutzte Teil wird automatisch erstattet. Siehe Preise.
MCP und AI-Agenten
Verbinde jeden MCP-Client mit https://api.doitong.com/v1/mcp und demselben Bearer-Schlüssel. Dein Agent kann den Katalog durchsuchen, Modelle abfragen und
ausführen sowie jede Dokumentationsseite als Markdown lesen.
claude mcp add --transport http doitong-models https://api.doitong.com/v1/mcp \
--header "Authorization: Bearer YOUR_API_KEY"
Nächste Schritte
- Durchsuche alle Modelle. Jede Seite enthält einen Anfrage-Builder, der den Code für dich erstellt.
- Lerne den Lebenszyklus einer Anfrage kennen: Anfragen.
- Verwende für jedes Modell dieselben Parameternamen: Parameter.
- Arbeitest du mit einem KI-Coding-Agenten? Gib ihm https://doitong.com/developers/llms.txt oder verbinde den MCP-Server.