Référence API
Guide complet de l'API Appstrate â authentification, versioning, gestion d'erreurs, rate limiting, idempotence, pagination et streaming SSE.
đ Base URL
Toutes les requĂȘtes sont relatives Ă la racine /api de votre instance :
http://localhost:3000/apiLa spécification OpenAPI est disponible publiquement (aucune authentification requise) :
- JSON :
GET /api/openapi.json - Swagger UI :
GET /api/docs
đ Authentification
L'API supporte deux méthodes d'authentification.
Cookie session
Utilisée par le frontend. L'authentification repose sur Better Auth avec email/mot de passe et login social optionnel (Google, GitHub). Le cookie de session est envoyé automatiquement par le navigateur.
Pour les routes scopées à une organisation, ajoutez le header X-Org-Id :
curl -b cookies.txt \
-H "X-Org-Id: org_abc123" \
http://localhost:3000/api/applicationsClé API
Pour les intégrations headless. Les clés API utilisent le préfixe ask_ et sont scopées à une application.
curl -H "Authorization: Bearer ask_votre_clé" \
-H "X-App-Id: app_abc123" \
http://localhost:3000/api/agentsLe header X-App-Id est requis pour les routes scopées à une application : agents, runs, schedules, webhooks, end-users, api-keys, packages, providers et connections.
SSE et clés API
Les endpoints SSE (Server-Sent Events) ne supportent pas les headers custom via EventSource. Passez la clé API en query param :
curl -N "http://localhost:3000/api/realtime/runs/run_abc?token=ask_votre_clĂ©"đ€ Impersonation d'end-users
L'API permet d'exĂ©cuter des requĂȘtes au nom d'un end-user via le header Appstrate-User :
curl -H "Authorization: Bearer ask_votre_clé" \
-H "X-App-Id: app_abc123" \
-H "Appstrate-User: eu_xyz789" \
http://localhost:3000/api/runsContraintes :
- ClĂ© API uniquement â retourne
400si utilisée avec une session cookie - L'end-user doit appartenir à l'application associée à la clé API
- Toutes les requĂȘtes sont tracĂ©es dans le journal d'audit (requestId, apiKeyId, endUserId, applicationId, IP, userAgent)
đą Versioning de l'API
L'API utilise un versioning basé sur les dates, inspiré du modÚle Stripe. Envoyez le header Appstrate-Version pour cibler une version spécifique :
Appstrate-Version: 2026-03-21- Sans header : utilise la version épinglée de l'organisation, ou la version courante par défaut
- Ăpinglage : configurez la version par dĂ©faut dans les paramĂštres de votre organisation
- Deprecation : les versions obsolĂštes retournent un header
Sunsetavec la date de fin de support
â ïž Format d'erreur
Toutes les erreurs suivent la spécification RFC 9457 (application/problem+json). Chaque réponse inclut un header Request-Id (préfixe req_) pour le suivi.
{
"type": "https://appstrate.dev/errors/validation-error",
"title": "Validation Error",
"status": 422,
"detail": "Le champ 'name' est requis et ne peut pas ĂȘtre vide.",
"instance": "/api/agents"
}Le Request-Id est présent sur toutes les réponses (succÚs et erreurs) :
Request-Id: req_a1b2c3d4e5f6đŠ Rate limiting
Le rate limiting est backed par Redis via rate-limiter-flexible. Les clés sont construites à partir de la méthode, du path et de l'identifiant de l'appelant :
- Session cookie :
method:path:userId - Clé API :
method:path:apikey:apiKeyId
Chaque réponse inclut les headers IETF standard :
RateLimit: limit=20, remaining=18, reset=45
RateLimit-Policy: 20;w=60En cas de dépassement (429 Too Many Requests), un header Retry-After indique le délai en secondes.
Limites principales :
| Catégorie | Limite |
|---|---|
| Endpoints de run | 20 requĂȘtes/min |
| Import de packages | 10 requĂȘtes/min |
| CrĂ©ation de ressources | 10 requĂȘtes/min |
đ Idempotence
Les routes POST critiques (end-users, webhooks, lancement de run) supportent le header Idempotency-Key pour garantir l'idempotence :
curl -X POST \
-H "Authorization: Bearer ask_votre_clé" \
-H "X-App-Id: app_abc123" \
-H "Idempotency-Key: my-unique-key-123" \
-H "Content-Type: application/json" \
-d '{"agentId": "agent_abc"}' \
http://localhost:3000/api/runsComportement :
- Les clés sont stockées dans Redis avec un TTL de 24 heures
- Un hash SHA-256 du body est utilisé pour détecter les conflits
409 Conflict: requĂȘte concurrente avec la mĂȘme clĂ© (traitement en cours)422 Unprocessable Entity: mĂȘme clĂ© mais body diffĂ©rent- Les replays retournent le header
Idempotent-Replayed: true
đ Pagination
Les endpoints de liste utilisent une pagination offset-based :
curl -H "Authorization: Bearer ask_votre_clé" \
-H "X-App-Id: app_abc123" \
"http://localhost:3000/api/agents?page=2&pageSize=20"Format de réponse :
{
"data": [{ "id": "agent_abc", "name": "Mon agent" }],
"pagination": {
"page": 2,
"pageSize": 20,
"total": 47,
"totalPages": 3
}
}đĄ Streaming SSE (temps rĂ©el)
L'API expose des endpoints SSE pour suivre les runs en temps réel. Les événements incluent les changements de statut et les entrées de log.
| Endpoint | Description |
|---|---|
GET /api/realtime/runs/:id | Un seul run (replay historique + logs en direct) |
GET /api/realtime/agents/:id/runs | Tous les runs d'un agent |
GET /api/realtime/runs | Tous les runs de l'application |
Exemple de connexion avec clé API :
curl -N -H "Accept: text/event-stream" \
"http://localhost:3000/api/realtime/runs/run_abc?token=ask_votre_clé"Pour l'authentification par cookie, les headers standard (Cookie, X-Org-Id) sont utilisés normalement.