Démarrage rapide
Lancez votre première génération en quelques minutes. Les 1 496 modèles utilisent tous le même type de requête et renvoient le même objet de requête, pour les images, les vidéos et l'audio : apprenez-le une fois ici.
1. Obtenir une clé API
Créez une clé à l'adresse https://doitong.com/developers/dashboard#keys et conservez-la dans une
variable d'environnement : elle n'est affichée qu'une seule fois. Chaque clé peut avoir son propre budget ; vous pouvez donc en donner une à un agent
sans risquer l'intégralité du compte. GET /account renvoie votre solde API.
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())
Les exécutions sont payées depuis le solde API de votre compte en crédits API : 1 000 crédits API = 1 $, et chaque modèle coûte exactement le prix fixé par son créateur. Effectuez un rechargement à l'adresse https://doitong.com/developers/dashboard#balance.
2. Obtenir un devis, puis exécuter
POST /quote/{model_id} prend le JSON d'entrée et renvoie le prix exact. Il ne nécessite aucune clé et ne coûte rien.
L'exécution de la même entrée coûte exactement ce montant : le devis correspond au débit. (Un modèle facturé selon l'utilisation constitue une exception : son
devis est le montant maximal que l'exécution peut coûter, et la partie inutilisée est remboursée après l'exécution.)
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"
}
Envoyez ensuite le même corps à POST /run/{model_id}. Ajoutez ?wait=20 pour maintenir la connexion ouverte jusqu'à 20 secondes : un modèle
rapide renvoie le résultat final en un seul aller-retour. Envoyez un en-tête Idempotency-Key afin qu'une nouvelle tentative n'exécute jamais la requête (et ne la
facture jamais) deux fois.
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)
La réponse est un objet de requête :
{
"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. Suivre l'état
Si le modèle travaille encore à la fin de l'attente, vous recevez 202 Accepted avec l'id de la requête et son
status actuel. Chaque requête suit le même cycle de vie :
-
queuedAcceptée et facturée, en attente d’un worker -
runningLe modèle génère le résultat -
États finaux:
succeededDevis facturé ; outputs[] contient les URL sur notre stockagefailedRemboursée automatiquement ; l’erreur en indique la raisoncanceledArrêtée avant l’obtention d’un résultat ; remboursée
Relisez la requête avec son identifiant. ?wait=20 fonctionne également ici, une simple boucle suffit donc :
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)
Lorsque status vaut succeeded, outputs[].url contient les liens vers les fichiers stockés sur notre service de stockage. Si la requête a
failed ou a été canceled, ses crédits API sont automatiquement remboursés et error indique pourquoi. Annulez tout ce qui est encore queued ou
running :
curl -X POST "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
Pour les longues tâches vidéo, vous pouvez éviter l'interrogation périodique et fournir plutôt un webhook_url (voir Webhooks).
4. Fichiers
Fournissez n'importe quelle URL publique comme entrée, ou demandez une URL d'importation avec POST /files, envoyez le fichier à cette URL avec
PUT et utilisez le file_url renvoyé (voir Fichiers). Une requête réussie répertorie ses résultats dans outputs[] avec
le type, le type de contenu et, lorsque ces informations sont connues, les dimensions et la durée.
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}'
Erreurs
Chaque modèle échoue de la même manière : une enveloppe contenant un type, un code exact, le param en cause et chaque problème
n le details, afin qu'un agent puisse corriger la requête sans lire de texte explicatif. Rien n'est facturé pour une requête invalide.
{
"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"
}
}
Tous les types et codes sont répertoriés dans Erreurs.
Tarification
Les prix sont indiqués en USD et en crédits API et affichés sur chaque page de modèle avant l'exécution. Chaque requête contient cost avec
credits, usd, charged et refunded. Une exécution est facturée lorsqu'elle est acceptée ; les requêtes failed et canceled sont
automatiquement remboursées. Certains modèles sont tarifés exactement selon l'entrée, certains selon la longueur ou la taille des fichiers que vous
envoyez, tandis que d'autres facturent un prix estimé par exécution : dans tous les cas, le devis correspond au montant payé. Quelques modèles (modèles de
langage et de vision, outils vocaux et de traitement) sont facturés selon l'utilisation : le devis est le montant maximal que l'exécution peut coûter, et
la partie non utilisée est automatiquement remboursée. Voir Tarification.
MCP et agents IA
Connectez n'importe quel client MCP à https://api.doitong.com/v1/mcp avec la même clé Bearer. Votre agent peut rechercher dans le catalogue, obtenir un devis et
exécuter des modèles, et lire chaque page de documentation au format Markdown.
claude mcp add --transport http doitong-models https://api.doitong.com/v1/mcp \
--header "Authorization: Bearer YOUR_API_KEY"
Étapes suivantes
- Parcourez tous les modèles. Chaque page contient un générateur de requêtes qui écrit le code pour vous.
- Découvrez le cycle de vie des requêtes : Requêtes.
- Utilisez les mêmes noms de paramètres pour chaque modèle : Paramètres.
- Vous travaillez avec un agent de programmation IA ? Donnez-lui https://doitong.com/developers/llms.txt ou connectez le serveur MCP.