Démarrage rapide
- Connecte-toi à la console avec ton compte Baguette Bot (1 € offert pour essayer, une fois ton e-mail vérifié).
- Crée une clé dans Clés API. Elle commence par
bb_live_et n'est affichée qu'une fois. - Crée un agent, puis donne-lui une tâche :
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 :
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
{
"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ètre | Type | |
|---|---|---|
| name | string, requis | Jusqu'à 80 caractères. |
| instructions | string | Consignes permanentes de l'agent (20 000 caractères max). |
| model | string | Un identifiant de GET /v1/models. Par défaut : anthropic/claude-haiku-5.5. |
| idle_minutes | entier 1–120 | Minutes sans activité avant que l'ordinateur s'éteigne. Par défaut : 5. |
| metadata | objet | Tes propres données (identifiant client…), renvoyées telles quelles. |
Répond 201 avec l'agent.
Lister, lire, modifier, supprimer
limit jusqu'à 500).name, instructions, model, idle_minutes ou metadata.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ètre | Type | |
|---|---|---|
| content | string, requis | La tâche, en langage naturel (100 000 caractères max). |
| wait | booléen | true : 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. |
{
"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.
limit (50 par défaut, 200 max) et after (un identifiant de message, pour ne lire que la suite).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énement | Donné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. |
| message | message | Un nouveau message (même format que la conversation). |
| message.updated | message | Un message complété. |
| computer | { status } | L'ordinateur change d'état (provisioning, running, stopped…). |
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) :
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.
none, provisioning, running, stopped…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ètre | Type | |
|---|---|---|
| interactive | booléen | true : ton utilisateur peut prendre la souris et le clavier (un captcha, une connexion). Par défaut, lecture seule. |
| ttl_seconds | entier 60–86400 | Durée de validité du lien. Par défaut : 3600. |
{ "object": "live_view", "url": "https://api.baguettebot.com/v1/live/…", "interactive": false, "expires_at": "2026-10-22T10:12:03.000Z" }<iframe src="LIVE_URL"
style="width:100%;aspect-ratio:16/10;border:0;border-radius:12px"></iframe>Fichiers
path (ex. ~/Uploads/facture.pdf) et content_base64 (jusqu'à environ 30 Mo). Répond 201.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
eur_per_million_input_tokens, eur_per_million_output_tokens, context_length et vision, et le prix de l'ordinateur.{ "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
{ "error": { "code": "insufficient_balance", "message": "…" } }| Code HTTP | Signification | |
|---|---|---|
| 400 | Requête invalide | Paramètre manquant ou hors limites, modèle inconnu (invalid_model). |
| 401 | Non authentifié | Clé absente, invalide ou révoquée (invalid_api_key). |
| 402 | Solde épuisé | insufficient_balance : recharge dans la console. |
| 404 | Introuvable | Agent inexistant ou qui n'est pas à toi, fichier introuvable. |
| 409 | Conflit | L'ordinateur est éteint (computer_not_running). |
| 429 | Trop de requêtes | Limite 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+)
// 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
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"])