← Présentation de l'API
v1 · REST · JSON

Documentation de l'API

L'API Baguette Bot crée des agents IA qui travaillent sur leur propre ordinateur cloud (bureau Linux, Chrome, terminal, fichiers). Tu leur envoies une tâche en langage naturel, ils l'exécutent sur leur ordinateur et te rendent le résultat, avec leur écran en direct à intégrer dans ton app. Une API REST en JSON, sans SDK obligatoire.

Démarrage rapide

  1. Connecte-toi à la console avec ton compte Baguette Bot (1 € offert pour essayer, une fois ton e-mail vérifié).
  2. Crée une clé dans Clés API. Elle commence par bb_live_ et n'est affichée qu'une fois.
  3. Crée un agent, puis donne-lui une tâche :
bash
export KEY=bb_live_…

# 1. Un agent (son ordinateur s'allumera à sa première tâche)
curl https://api.baguettebot.com/v1/agents -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"name": "Veille prix", "instructions": "Réponds en français, avec un tableau."}'

# 2. Une tâche, et la réponse quand c'est fini (jusqu'à 120 s)
curl https://api.baguettebot.com/v1/agents/AGENT_ID/messages -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"content": "Compare le prix de la PS5 sur Amazon, la Fnac et Boulanger", "wait": true}'

Authentification

Chaque requête porte ta clé dans l'en-tête Authorization :

http
Authorization: Bearer bb_live_…

URL de base : https://api.baguettebot.com. Les corps et les réponses sont en JSON (Content-Type: application/json). Garde la clé côté serveur : jamais dans une app mobile ni dans le code d'une page web. Une clé révoquée dans la console cesse de fonctionner immédiatement.

Agents

Un agent a un nom, des instructions (son rôle, ton style de réponse…), un modèle d'IA, une mémoire et son propre ordinateur, isolé de celui des autres agents. Ses fichiers et ses sessions de navigateur sont conservés entre les tâches, jusqu'à sa suppression.

L'objet agent

json
{
  "id": "6f1c2a8e-…",
  "object": "agent",
  "name": "Shopping assistant",
  "model": "anthropic/claude-haiku-5.5",
  "instructions": "…",
  "status": "idle",            // idle | working | blocked
  "status_text": null,
  "computer": { "status": "stopped" },
  "idle_minutes": 5,
  "metadata": { "customer_id": "c_42" },
  "created_at": "2026-10-22T09:12:03.000Z"
}

Créer un agent

POST /v1/agents

ParamètreType
namestring, requisJusqu'à 80 caractères.
instructionsstringConsignes permanentes de l'agent (20 000 caractères max).
modelstringUn identifiant de GET /v1/models. Par défaut : anthropic/claude-haiku-5.5.
idle_minutesentier 1–120Minutes sans activité avant que l'ordinateur s'éteigne. Par défaut : 5.
metadataobjetTes propres données (identifiant client…), renvoyées telles quelles.

Répond 201 avec l'agent.

Lister, lire, modifier, supprimer

GET/v1/agents
Tes agents, du plus récent au plus ancien (limit jusqu'à 500).
GET/v1/agents/{id}
Un agent, avec son statut et celui de son ordinateur.
PATCH/v1/agents/{id}
Change name, instructions, model, idle_minutes ou metadata.
DELETE/v1/agents/{id}
Supprime l'agent, sa conversation et son ordinateur (fichiers compris). Irréversible.

Tâches et messages

POST /v1/agents/{id}/messages donne une tâche ou un message à l'agent. Il reprend la conversation là où elle en était : tu peux enchaîner les demandes (« et maintenant exporte-le en PDF »).

ParamètreType
contentstring, requisLa tâche, en langage naturel (100 000 caractères max).
waitbooléentrue : la réponse arrive quand l'agent a fini, jusqu'à 120 s. Sinon 202 immédiat et tu suis l'agent avec les événements.
json
{
  "object": "run",
  "agent_id": "6f1c2a8e-…",
  "message_id": "b2e0…",
  "status": "done",            // done | working (still running after 120 s)
  "output": "| Shop | Price |\n|---|---|\n| … |",
  "messages": [
    { "id": "…", "role": "assistant", "content": null, "tool_calls": [{ "name": "browser", "summary": "…" }], "created_at": "…" },
    { "id": "…", "role": "tool", "content": "…", "tool": { "name": "browser", "ok": true, "summary": "…" }, "created_at": "…" },
    { "id": "…", "role": "assistant", "content": "| Shop | Price | …", "created_at": "…" }
  ]
}

output est la dernière réponse de l'agent (Markdown). Si la tâche dure plus de 120 s, status vaut working : suis la suite avec GET /v1/agents/{id}/events ou relis la conversation.

GET/v1/agents/{id}/messages
La conversation : limit (50 par défaut, 200 max) et after (un identifiant de message, pour ne lire que la suite).
POST/v1/agents/{id}/stop
Arrête la tâche en cours.

Rôles des messages : user (tes demandes), assistant (l'agent ; tool_calls résume les actions qu'il lance), tool (le résultat d'une action, avec tool.name, tool.ok et tool.summary), event (informations du système, par exemple un solde épuisé).

Événements en direct

GET /v1/agents/{id}/events ouvre un flux Server-Sent Events (text/event-stream) : tout ce que fait l'agent, en temps réel. Un commentaire : ping arrive toutes les 15 s pour garder la connexion ouverte.

ÉvénementDonnées
ready{ agent_id }Le flux est ouvert.
status{ status, text }working, idle ou blocked, avec ce que l'agent est en train de faire.
delta{ message_id, text }Un morceau de la réponse en cours d'écriture.
messagemessageUn nouveau message (même format que la conversation).
message.updatedmessageUn message complété.
computer{ status }L'ordinateur change d'état (provisioning, running, stopped…).
text
event: ready
data: {"agent_id":"6f1c2a8e-…"}

event: status
data: {"status":"working","text":"…"}

event: delta
data: {"message_id":"…","text":"The cheapest"}

event: message
data: {"id":"…","role":"tool","content":"…","tool":{"name":"browser","ok":true,"summary":"…"},"created_at":"…"}

event: computer
data: {"status":"running"}

Lire le flux en Node (l'en-tête d'autorisation empêche d'utiliser EventSource du navigateur : relaie le flux depuis ton serveur) :

javascript
const res = await fetch("https://api.baguettebot.com/v1/agents/" + agentId + "/events", {
  headers: { Authorization: "Bearer " + process.env.BAGUETTE_API_KEY },
});
const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();
let buffer = "";
for (;;) {
  const { value, done } = await reader.read();
  if (done) break;
  buffer += value;
  let i;
  while ((i = buffer.indexOf("\n\n")) !== -1) {
    const chunk = buffer.slice(0, i); buffer = buffer.slice(i + 2);
    const type = /^event: (.+)$/m.exec(chunk)?.[1];
    const data = /^data: (.+)$/m.exec(chunk)?.[1];
    if (type && data) console.log(type, JSON.parse(data));
  }
}

L'ordinateur de l'agent

Chaque agent a un ordinateur Linux (bureau 1280×800, Chrome, terminal, utilisateur avec sudo). Il s'allume tout seul à la première tâche, en quelques secondes, et s'éteint après idle_minutes sans activité. Ses fichiers sont gardés quand il est éteint. Les bannières de cookies sont refusées automatiquement.

GET/v1/agents/{id}/computer
Son état : none, provisioning, running, stopped…
POST/v1/agents/{id}/computer/start
L'allumer à l'avance (pour qu'il soit prêt à la première tâche).
POST/v1/agents/{id}/computer/stop
L'éteindre tout de suite (la facturation s'arrête).
GET/v1/agents/{id}/computer/screenshot
Une capture d'écran JPEG (409 s'il est éteint).

Montrer l'écran dans ton app

POST /v1/agents/{id}/computer/live crée un lien signé et temporaire vers l'écran de l'agent, à intégrer dans une iframe. Crée-le côté serveur et donne seulement l'URL à ta page : elle ne contient pas ta clé.

ParamètreType
interactivebooléentrue : ton utilisateur peut prendre la souris et le clavier (un captcha, une connexion). Par défaut, lecture seule.
ttl_secondsentier 60–86400Durée de validité du lien. Par défaut : 3600.
json
{ "object": "live_view", "url": "https://api.baguettebot.com/v1/live/…", "interactive": false, "expires_at": "2026-10-22T10:12:03.000Z" }
html
<iframe src="LIVE_URL"
  style="width:100%;aspect-ratio:16/10;border:0;border-radius:12px"></iframe>

Fichiers

POST/v1/agents/{id}/files
Dépose un fichier : path (ex. ~/Uploads/facture.pdf) et content_base64 (jusqu'à environ 30 Mo). Répond 201.
GET/v1/agents/{id}/files?path=…
Récupère un fichier de l'ordinateur (ce que l'agent a produit ou téléchargé), en binaire.

Ces deux routes allument l'ordinateur s'il est éteint. Indique le chemin du fichier dans ta tâche pour que l'agent s'en serve (« le fichier est dans ~/Uploads/facture.pdf »), ou demande-lui où il a enregistré ce qu'il a produit.

Modèles et solde

GET/v1/models
Les modèles disponibles (plus de 300 : Claude, GPT, Gemini, Mistral, DeepSeek…) avec eur_per_million_input_tokens, eur_per_million_output_tokens, context_length et vision, et le prix de l'ordinateur.
GET/v1/account
Ton solde : { "balance_eur": 12.37, "currency": "eur" }.

Un modèle avec vision: true voit l'écran de son ordinateur ; les autres travaillent à partir du texte des pages, ce qui suffit pour la plupart des tâches web.

Tarifs

Pas d'abonnement : un solde prépayé en euros, rechargé dans la console (à partir de 20 € : 20, 50, 100 € ou le montant de ton choix), qui n'expire pas.

  • Modèle d'IA : selon les tokens utilisés, au prix par million de tokens du modèle (GET /v1/models).
  • Ordinateur : 2 € de l'heure tant qu'il est allumé, facturé à la seconde.

Quand le solde est épuisé, les tâches s'arrêtent et l'API répond 402. La console détaille ce que coûte chaque agent.

Erreurs et limites

json
{ "error": { "code": "insufficient_balance", "message": "…" } }
Code HTTPSignification
400Requête invalideParamètre manquant ou hors limites, modèle inconnu (invalid_model).
401Non authentifiéClé absente, invalide ou révoquée (invalid_api_key).
402Solde épuiséinsufficient_balance : recharge dans la console.
404IntrouvableAgent inexistant ou qui n'est pas à toi, fichier introuvable.
409ConflitL'ordinateur est éteint (computer_not_running).
429Trop de requêtesLimite de débit dépassée, ou nombre maximal d'agents atteint (too_many_agents).
  • 600 requêtes par minute par adresse IP, dont 60 créations d'agents et 120 envois de tâches.
  • 200 agents par compte : supprime ceux qui ne servent plus.
  • Les agents n'envoient pas d'e-mails et ne passent pas d'appels. L'usage doit respecter nos conditions : pas de spam, de fraude, de collecte abusive de données personnelles ni d'attaque de sites.

Exemples complets

JavaScript (Node 18+)

javascript
// Node 18+
const KEY = process.env.BAGUETTE_API_KEY;
const api = (path, body, method = body ? "POST" : "GET") =>
  fetch("https://api.baguettebot.com" + path, {
    method,
    headers: { Authorization: `Bearer ${KEY}`, "Content-Type": "application/json" },
    body: body && JSON.stringify(body),
  }).then(async (r) => {
    if (!r.ok) throw new Error((await r.json()).error?.message ?? r.statusText);
    return r.json();
  });

const agent = await api("/v1/agents", { name: "Assistant", model: "anthropic/claude-haiku-5.5" });
const run = await api(`/v1/agents/${agent.id}/messages`, { content: "…", wait: true });
console.log(run.output);

Python

python
import os, requests

API = "https://api.baguettebot.com"
H = {"Authorization": f"Bearer {os.environ['BAGUETTE_API_KEY']}"}

agent = requests.post(f"{API}/v1/agents", headers=H, json={"name": "Assistant"}).json()
run = requests.post(f"{API}/v1/agents/{agent['id']}/messages", headers=H,
                    json={"content": "…", "wait": True}, timeout=150).json()
print(run["output"])