# 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.

> [!NOTE]
> URL de base `https://api.doitong.com/v1`. Chaque appel envoie `Authorization: Bearer <your key>`, et la même clé fonctionne pour l'API
> HTTP et le serveur MCP.

## 1. Obtenir une clé API

Créez une clé à l'adresse [https://doitong.com/developers/dashboard#keys](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.

```bash
export DOITONG_API_KEY="doitong_..."

curl "https://api.doitong.com/v1/account" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```
```javascript
const res = await fetch("https://api.doitong.com/v1/account", {
  headers: { Authorization: `Bearer ${process.env.DOITONG_API_KEY}` },
});

console.log(await res.json());
```
```python
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](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.)

```bash
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}'
```
```javascript
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"
```
```python
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
```

```json 200 OK · devis
{
  "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.

```bash
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"}'
```
```javascript
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);
```
```python
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 :

```json 200 OK · 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 :

Cycle de vie d’une requête: `queued` → `running` → `succeeded` | `failed` | `canceled` (final ; les échecs et les annulations sont remboursés).

Relisez la requête avec son identifiant. `?wait=20` fonctionne également ici, une simple boucle suffit donc :

```bash
curl "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```
```javascript
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);
```
```python
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` :

```bash
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](https://doitong.com/developers/docs/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](https://doitong.com/developers/docs/files)). 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.

```bash
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}'
```

> [!TIP]
> **Fichiers conservés indéfiniment, ou pendant 7 jours gratuitement : à vous de choisir.** Les fichiers de sortie sont copiés dans notre
> stockage avant la réussite d'une requête. Par défaut, ils restent jusqu'à leur suppression (100 crédits API
> par Go et par mois) ; désactivez « Conserver les fichiers indéfiniment » dans le tableau de bord, ou transmettez `?storage=temporary`, pour les conserver
> 7 jours gratuitement (voir [Fichiers](https://doitong.com/developers/docs/files#storage)).

## 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.

```json 422 Unprocessable Entity
{
  "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](https://doitong.com/developers/docs/errors).

## 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](https://doitong.com/developers/docs/pricing).

## 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.

```bash Claude Code
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](https://doitong.com/developers/models). 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](https://doitong.com/developers/docs/requests).
- Utilisez les mêmes noms de paramètres pour chaque modèle : [Paramètres](https://doitong.com/developers/docs/parameters).
- Vous travaillez avec un agent de programmation IA ? Donnez-lui [https://doitong.com/developers/llms.txt](https://doitong.com/developers/llms.txt) ou connectez le [serveur MCP](https://doitong.com/developers/docs/mcp).
