Référence
Erreurs et limites
L'enveloppe d'erreur, les codes rencontrés, les limites de débit et de solde.
Toute erreur /v1, quelle que soit la route, prend la même forme, jamais une page HTML ni une trace :
{
"error": { "type": "invalid_request", "code": "invalid_parameter", "message": "instructions must be a string of at most 20000 characters.", "param": "instructions" },
"request_id": "req_01k6examplereq00000000000"
}
param n'apparaît que lorsqu'un champ précis est en cause. request_id est toujours présent, voir Authentification.
Types et codes rencontrés
| Statut | type | code | Cas |
|---|---|---|---|
| 400 | invalid_request | invalid_parameter | Un champ a une valeur invalide (borne dépassée, format incorrect). Pour un output_schema invalide (racine non objet, plus de 32 Ko, $ref externe, boucle de $ref…), param vaut output_schema. |
| 400 | invalid_request | unknown_parameter | Un champ du corps n'est pas reconnu. |
| 400 | invalid_request | agent_inactive | L'agent visé par le run est désactivé (active: false). |
| 400 | invalid_request | webhook_secret_missing | webhook_url fourni sans secret de signature créé au préalable. |
| 400 | invalid_request | unknown_tool | Un outil listé dans tools n'existe pas. |
| 400 | invalid_request | tool_unavailable | Un outil listé dans tools n'est pas utilisable par votre organisation maintenant. |
| 400 | invalid_request | invalid_idempotency_key | Idempotency-Key vide ou trop long. |
| 400 | invalid_request | invalid_last_event_id | Last-Event-ID ou ?after= n'est pas un entier valide. |
| 400 / 415 | invalid_request | empty_file, unsupported_file_type, file_unsafe, storage_quota_exceeded, upload_failed | Refus d'un envoi à POST /v1/files, voir Fichiers. |
| 413 | invalid_request | file_too_large | Corps ou fichier au-delà de 20 Mo. |
| 405 | invalid_request | method_not_allowed | Méthode HTTP non supportée sur cette route. |
| 401 | authentication | missing_api_key, invalid_api_key, api_key_revoked, api_key_expired | Voir Authentification. |
| 403 | permission | insufficient_scope | La clé n'a pas le droit requis par cette route. |
| 403 | permission | organization_locked | L'organisation est verrouillée : facture impayée, ou période d'essai terminée (choisissez une formule dans leem). Le message de l'erreur précise la cause. |
| 403 | permission | invalid_signature | Lien de téléchargement de fichier invalide ou expiré. |
| 422 | invalid_request | model_unavailable | Le modèle demandé n'est pas dans votre formule (voir GET /v1/models). Le même code peut aussi apparaître dans error d'un run terminé failed, quand son modèle a quitté la formule avant son démarrage. |
| 422 | invalid_request | invalid_client_tool | Une définition de client_tools est invalide (nom, description, parameters, doublon, plus de 20 outils) ; param nomme le champ. Voir Outils client. |
| 422 | invalid_request | client_tool_name_taken | Un outil client porte le nom d'un outil leem (préfixe leem_ compris), ou d'un outil client déjà déclaré sur l'agent. |
| 422 | invalid_request | unknown_tool_call, duplicate_tool_output, missing_tool_outputs, tool_output_too_large | Refus de POST /v1/runs/{run}/tool_outputs : un call_id n'est pas en attente, est répondu deux fois, un appel en attente n'a pas de résultat, ou un résultat dépasse 100 000 octets. |
| 422 | invalid_request | output_schema_unsupported | Un output_schema est posé (ou le sera) sur un modèle qui ne peut pas garantir une sortie structurée : choisissez un modèle dont structured_output vaut true dans GET /v1/models. Voir Sortie structurée. |
| 403 | permission | widget_unavailable | POST /v1/widgets/{widget}/sessions : widget désactivé, aucun agent actif dans l'équipe du widget, ou option absente de la formule. Voir Widget. |
| 409 | conflict | file_in_use | DELETE /v1/files/{file} sur un document de connaissance : utilisez DELETE /v1/agents/{agent}/documents/{file}. |
| 409 | conflict | support_unavailable | Côté widget : signalement demandé alors que le widget n'a pas d'adresse de support. |
| 422 | invalid_request | too_many_documents | Un agent porte 20 documents de connaissance au plus. |
| 404 | not_found | resource_not_found | Agent, run ou fichier introuvable, y compris celui d'une autre organisation, toujours rendu comme absent. |
| 404 | not_found | route_not_found | Aucune route à ce chemin. |
| 409 | conflict | agent_name_taken | Un agent de ce nom existe déjà dans l'organisation. |
| 409 | conflict | run_not_active | POST /v1/runs/{run}/cancel sur un run déjà terminal. |
| 409 | conflict | run_not_waiting | POST /v1/runs/{run}/tool_outputs sur un run qui n'est pas en requires_action. |
| 409 | conflict | idempotency_key_in_progress, idempotency_key_reused, idempotency_key_sensitive_replay, idempotency_key_stream_replay | Voir « Idempotence » ci-dessous. |
| 402 | insufficient_credits | insufficient_credits | Crédit mensuel et crédits supplémentaires épuisés. |
| 402 | billing | organization_suspended | L'organisation est suspendue (renouvellement impayé). |
| 429 | rate_limit | too_many_requests | Débit de requêtes dépassé, voir ci-dessous. |
| 429 | rate_limit | concurrent_runs_exceeded | Trop de runs actifs en même temps. |
| 503 | server | stream_capacity_reached | Trop de flux SSE ouverts sur la plateforme, voir Flux d'événements (SSE). |
| 5xx | server | internal_error, service_unavailable, http_5xx | Panne côté leem. Réessayez plus tard ; persistant, contactez le support avec request_id. |
Échec d'un run
Un run terminé failed porte error: {"code": "...", "message": "..."}. Le message ne contient jamais le texte brut d'un fournisseur d'IA. Le code indique la conduite à tenir :
error.code | Cas | Que faire |
|---|---|---|
service_unavailable | Le service IA est momentanément indisponible ; l'équipe leem est prévenue. | Réessayer plus tard. |
model_unreachable | Le modèle du run est momentanément injoignable ; l'équipe leem est prévenue. | Réessayer plus tard, ou choisir un autre modèle (GET /v1/models). |
model_busy | Le modèle est très sollicité en ce moment. | Réessayer dans un instant. |
free_model_quota | Le quota du modèle de test gratuit est atteint (organisations de test uniquement). | Réessayer plus tard, ou choisir un autre modèle (GET /v1/models). |
request_refused | Le filtre de sécurité du modèle a refusé la demande. | Reformuler la demande. |
context_too_long | La conversation ou les pièces jointes dépassent ce que le modèle accepte. | Raccourcir les instructions ou retirer des fichiers. |
run_error | Une autre erreur côté leem. | Réessayer ; persistant, contacter le support avec le request_id. |
model_unavailable | Le modèle a quitté votre formule avant le démarrage du run. | Choisir un modèle de GET /v1/models. |
run_interrupted | Le worker qui exécutait le run s'est arrêté. | Relancer le run. |
run_timeout | Le run a dépassé sa durée maximale. | Relancer avec une demande plus courte. |
insufficient_credits | Le crédit mensuel et les crédits supplémentaires ont été épuisés en cours de run. | Acheter des crédits supplémentaires ou attendre le renouvellement mensuel, puis relancer. |
agent_unavailable | L'agent a été supprimé ou désactivé avant le démarrage. | Réactiver l'agent ou en viser un autre. |
empty_output | Le modèle n'a produit aucune réponse. | Relancer, ou reformuler la demande. |
tool_outputs_timeout | Le run attendait les résultats de vos outils client depuis plus de 10 minutes. Fichiers et graphiques déjà produits conservés. | Relancer, et répondre plus vite à run.requires_action, voir Outils client. |
output_invalid | La réponse ne respecte pas output_schema, même après une correction. output.text est conservé. | Relancer, assouplir le schéma ou préciser les instructions. |
output_schema_rejected | L'hébergeur du modèle refuse output_schema. | Simplifier le schéma, voir Sortie structurée. |
output_schema_unsupported | Le modèle n'est plus compatible avec la sortie structurée. | Choisir un modèle avec structured_output à true. |
Les trois derniers codes concernent les runs avec un schéma de sortie : les crédits déjà consommés restent débités ; seuls les appels de mise en forme et de correction réellement servis sont facturés, voir Sortie structurée.
Outils client
Bornes propres aux outils client : 20 par agent, 20 par run, 1 024 caractères de description, 16 384 octets de parameters, 100 000 octets par résultat de tool_outputs, et 10 minutes d'attente au plus d'un run en requires_action.
Avertissements de widget
Un run lancé par un widget peut porter, dans warnings :
client_tool_unreachable: le widget n'a pas d'URL de webhook, ou l'organisation pas de secret de webhook ; l'outil clientserverest écarté du run.widget_tool_unavailable: un outil qui donnerait accès aux données leem ou à un serveur MCP est retiré du run (un widget ne les porte pas).
Les codes propres aux routes navigateur du widget (invalid_session, origin_not_allowed, user_rate_limited…) sont listés dans Widget.
Débit de requêtes
120 requêtes par minute et par clé API par défaut (peut être ajusté par organisation ou par formule). Chaque réponse d'une requête authentifiée et admise porte X-RateLimit-Limit et X-RateLimit-Remaining (pas une réponse 401 ou 429, ni le téléchargement signé GET /v1/files/{file}/content) ; au-delà, 429 too_many_requests avec un en-tête Retry-After en secondes.
Runs simultanés
5 runs actifs (queued ou running) au plus par organisation par défaut ; la limite est propre à chaque organisation (fixée par sa formule, ou ajustée pour elle). Un run en requires_action (en attente des résultats d'un outil client) n'est pas compté. Un POST /v1/runs qui dépasserait cette limite reçoit 429 concurrent_runs_exceeded avec Retry-After.
Crédit disponible
Les runs se paient en crédits, à l'usage : d'abord le crédit mensuel de la formule, puis les crédits supplémentaires. POST /v1/runs vérifie que l'organisation a encore du crédit (credit.available dans GET /v1/organization) ; sinon la requête est refusée en 402 insufficient_credits : aucun run n'est créé.
Un run lancé s'arrête automatiquement quand le crédit est épuisé : il passe en failed avec l'erreur insufficient_credits, et les fichiers et graphiques déjà produits sont conservés. Le dépassement est borné à un tour du modèle. Achetez des crédits supplémentaires depuis la page Consommation de votre espace (/parametres/consommation) ou attendez le renouvellement mensuel, puis relancez le run.
Idempotence
Tout POST /v1 accepte un en-tête Idempotency-Key (1 à 255 caractères), propre à votre organisation, conservé 24 heures :
- Rejouer la même requête (même méthode, même chemin, même corps) sous la même clé renvoie la réponse déjà produite, avec
Idempotent-Replayed: true: l'action n'est jamais refaite. - Rejouer un flux SSE sous la même clé (
POST /v1/runsavecstream: true) rouvre un flux sur le même run, repris depuis votreLast-Event-ID. - Utiliser la même clé avec un corps différent est refusé (
409 idempotency_key_reused). - Une requête encore en cours sous cette clé refuse une seconde requête concurrente (
409 idempotency_key_in_progress). - Une réponse qui montrait un secret une seule fois (rotation du secret de webhook) n'est jamais rejouée (
409 idempotency_key_sensitive_replay) : renvoyez sansIdempotency-Keypour une nouvelle tentative. - Une réponse
402,409,429ou5xxne réserve jamais la clé : elle reste libre pour un nouvel essai immédiat.
Versionnement
/v1 n'ajoute que des points d'entrée et des champs ; à partir de la 1.1, rien n'en est retiré ni renommé. Un client tolérant aux champs qu'il ne connaît pas encore reste compatible sans changement de version.
Historique :
- 1.5 (2026-11-01) : équipe d'agents du widget. Ajout facultatif : le champ
agentsdePOST /v1/widgets/{widget}/sessions, dans le corps et dans la réponse. Sans lui, une session a accès à toute l'équipe du widget. Voir Widget. - 1.4 (2026-10-31) : widget et documents de connaissance. Ajouts facultatifs :
GET/POST /v1/agents/{agent}/documents,DELETE /v1/agents/{agent}/documents/{file},POST /v1/widgets/{widget}/sessions,DELETE /v1/widget_users/{id}, les champsexecutionetlabeldes outils client, les avertissementsclient_tool_unreachableetwidget_tool_unavailable, les codestoo_many_documents,file_in_useetwidget_unavailable. Voir Widget. - 1.3 (2026-10-30) : outils client. Ajouts facultatifs :
client_tools(agents et runs), statutrequires_actionetrequired_actionsur le run, événement SSE et webhookrun.requires_action,POST /v1/runs/{run}/tool_outputs, les codesinvalid_client_tool,client_tool_name_taken,run_not_waiting,unknown_tool_call,duplicate_tool_output,missing_tool_outputs,tool_output_too_largeet l'erreur de runtool_outputs_timeout. Aussi :is_testsur les modèles et l'erreur de runfree_model_quota(modèles de test gratuits, organisations de test uniquement). Un client qui ignore ces ajouts continue de fonctionner tant que ses agents n'en déclarent pas. Voir Outils client. - 1.2 (2026-10-26) : sortie structurée garantie. Ajouts facultatifs :
output_schema(agents et runs),output.jsonetoutput_schemasur le run,structured_outputsur les modèles,422 output_schema_unsupportedet trois codes d'échec de run. Voir Sortie structurée. - 1.1 (2026-10-24) :
balancedevientcredit;usage.cost(MGA) devientusage.credits. La règle « rien n'est retiré ni renommé » s'applique à partir de la 1.1.