Snelstart
Voer je eerste generatie uit in enkele minuten. Alle 1.496 modellen gebruiken hetzelfde type request en retourneren hetzelfde requestobject voor afbeeldingen, video en audio: leer het hier één keer.
1. Een API-sleutel ophalen
Maak een sleutel aan op https://doitong.com/developers/dashboard#keys en bewaar deze in een
environmentvariabele: hij wordt maar één keer weergegeven. Elke sleutel kan een eigen budget hebben, zodat je er een aan een agent kunt geven zonder risico voor het volledige account. GET /account retourneert je API-saldo.
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())
Runs worden betaald uit het API-saldo van je account in API-credits: 1.000 API-tegoed = $ 1, en elk model kost exact de prijs van de maker. Waardeer op via https://doitong.com/developers/dashboard#balance.
2. Offerte opvragen en vervolgens uitvoeren
POST /quote/{model_id} neemt de JSON-invoer en retourneert de exacte prijs. Er is geen sleutel nodig en er zijn geen kosten aan verbonden. Dezelfde invoer uitvoeren kost precies dat bedrag: de offerte is de afschrijving. (Een model dat op basis van gebruik wordt afgerekend is de uitzondering: de offerte is het maximale bedrag dat de run kan kosten, en het ongebruikte deel wordt na de run terugbetaald.)
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"
}
Verzend vervolgens dezelfde body naar POST /run/{model_id}. Voeg ?wait=20 toe om de verbinding maximaal 20 seconden open te houden: een snel model retourneert het voltooide resultaat in één roundtrip. Verzend een Idempotency-Key-header zodat een retry nooit twee keer wordt uitgevoerd (of in rekening gebracht).
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)
De response is een requestobject:
{
"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. De status volgen
Als het model nog bezig is wanneer de wachttijd eindigt, ontvang je 202 Accepted met de id en huidige status van het request. Elk request doorloopt dezelfde levenscyclus:
-
queuedGeaccepteerd en in rekening gebracht, wacht op een worker -
runningHet model genereert -
Eindstatussen:
succeededOfferte in rekening gebracht; outputs[] bevatten URL's in onze opslagfailedAutomatisch terugbetaald; de fout vermeldt waaromcanceledGestopt voordat er een resultaat was; terugbetaald
Lees het request opnieuw met zijn id. ?wait=20 werkt hier ook, dus een eenvoudige lus volstaat:
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)
Wanneer status succeeded is, bevat outputs[].url links naar de bestanden in onze opslag. Als het request failed of canceled is, worden de API-credits automatisch terugbetaald en geeft error de reden aan. Annuleer alles wat nog queued of running is:
curl -X POST "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Voor lange videoruns kun je polling overslaan en in plaats daarvan een webhook_url doorgeven (zie Webhooks).
4. Bestanden
Geef een openbare URL door als invoer, of vraag POST /files om een upload-URL, voer daar een PUT uit met het bestand en gebruik de geretourneerde file_url (zie Bestanden). Een geslaagd request vermeldt de resultaten in outputs[] met type, contenttype en, indien bekend, afmetingen en duur.
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}'
Fouten
Elk model mislukt op dezelfde manier: één envelop met een type, een exacte code, de betreffende param en elk probleem in details, zodat een agent het request kan herstellen zonder proza te lezen. Voor een ongeldig request worden geen kosten in rekening gebracht.
{
"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"
}
}
Elk type en elke code staat vermeld in Fouten.
Prijzen
Prijzen zijn in USD en API-credits en worden vóór uitvoering op elke modelpagina weergegeven. Elk request bevat cost met credits, usd, charged en refunded. Een run wordt in rekening gebracht zodra deze is geaccepteerd; failed en canceled requests worden automatisch terugbetaald. Sommige modellen worden exact op basis van de invoer geprijsd, sommige op basis van de lengte of grootte van de bestanden die je verzendt, en bij andere geldt een geschatte prijs per run: in alle gevallen is de offerte het bedrag dat je betaalt. Enkele modellen (taal- en visiemodellen, spraak- en verwerkingstijdtools) worden op basis van gebruik afgerekend: de offerte is het maximale bedrag dat de run kan kosten, en het deel dat de run niet heeft gebruikt wordt automatisch terugbetaald. Zie Prijzen.
MCP en AI-agents
Verbind elke MCP-client met https://api.doitong.com/v1/mcp met dezelfde Bearer-sleutel. Je agent kan de catalogus doorzoeken, offertes opvragen en modellen uitvoeren, en elke documentatiepagina als Markdown lezen.
claude mcp add --transport http doitong-models https://api.doitong.com/v1/mcp \
--header "Authorization: Bearer YOUR_API_KEY"
Volgende stappen
- Bekijk alle modellen. Elke pagina heeft een requestbuilder die de code voor je schrijft.
- Leer de levenscyclus van een request: Requests.
- Gebruik dezelfde parameternamen voor elk model: Parameters.
- Werk je met een AI-codeeragent? Geef hem https://doitong.com/developers/llms.txt of verbind de MCP-server.