API REST
La surface HTTP exposée par ObjectOS — générée à partir de vos métadonnées, cadrée par les permissions, décrite via OpenAPI.
API REST
Chaque objet que vous déclarez obtient automatiquement un ensemble complet de points de terminaison REST.
Chaque action devient un POST. Chaque flow devient un POST vers
/flows/.... Il n'y a aucune couche API distincte à écrire ou à déployer.
URL de base : https://<your-host>/api/v1.
La spécification OpenAPI est disponible en direct sur /api/v1/openapi.json.
Authentification
ObjectOS utilise Better Auth. Toutes les routes
sous /api/v1 requièrent une session authentifiée, sauf si elles sont explicitement
marquées comme publiques (voir Formulaires publics). Les méthodes d'authentification sont
configurées dans apps/<app>/auth.config.ts — typiquement un cookie de session ou
un jeton bearer issu de /api/v1/auth/sign-in.
Les permissions sont vérifiées par route, par enregistrement. Les routes annotées
ci-dessous avec une clé de permission (par ex. ai:chat) appellent
requirePermission(...) ; l'accès au niveau de l'enregistrement est appliqué par RBAC +
sécurité au niveau des lignes + sécurité au niveau des champs au sein du moteur de données.
Discovery
| Chemin | Méthode | Objectif |
|---|---|---|
/api/v1 | GET | Découverte de service — liste toutes les routes enregistrées, la version, le mode de cadrage |
/api/v1/discovery | GET | Alias explicite du document de découverte ci-dessus |
/api/v1/openapi.json | GET | Spécification OpenAPI 3.0 pour chaque point de terminaison du runtime en cours d'exécution |
/api/v1/search | GET | Recherche plein texte sur les champs recherchables de tous les objets |
Restreindre la surface d'API
Les endpoints générés automatiquement sont gouvernés par objet, de sorte que vous pouvez retirer un objet de l'API ou le rendre en lecture seule sans écrire aucun code de route :
apiEnabled(booléen, par défauttrue) — définissezfalsepour retirer entièrement l'objet de la surface REST. Les requêtes vers ses routes renvoient 404.apiMethods(liste blanche optionnelle) — lorsqu'elle est définie, seules les opérations listées sont accessibles ; toute autre opération est rejetée au niveau de la couche REST. Valeurs autorisées :get,list,create,update,delete,upsert,bulk,aggregate,history,search,restore,purge,import,export.
// Un objet de référence en lecture seule, jamais inscriptible via l'API :
defineObject({
name: 'exchange_rate',
apiMethods: ['get', 'list'],
// ...fields
})
// Un objet interne que l'API n'expose jamais :
defineObject({
name: 'sync_cursor',
apiEnabled: false,
// ...fields
})Les deux sont désormais appliqués au niveau de la couche REST (ADR-0049) — les versions antérieures analysaient ces propriétés mais ne les appliquaient pas.
Données — /api/v1/data/*
CRUD + requêtes avancées pour chaque objet que vous déclarez. :object est le
name de l'objet (snake_case).
| Chemin | Méthode | Objectif |
|---|---|---|
/data/:object | GET | Lister / interroger — passez where, orderBy, limit, offset, cursor, expand, select comme paramètres de requête |
/data/:object/query | POST | Requête avancée — corps ObjectQL complet avec groupBy + aggregations (voir ObjectQL) |
/data/:object/:id | GET | Récupérer un enregistrement. Prend en charge ?select= et ?expand= |
/data/:object | POST | Créer. Renvoie 201 avec le nouvel enregistrement |
/data/:object/:id | PATCH | Mettre à jour. Passez l'en-tête If-Match: <version> (ou expectedVersion dans le corps) pour la concurrence optimiste — 409 CONCURRENT_UPDATE en cas de conflit |
/data/:object/:id | DELETE | Supprimer. Même règle If-Match |
/data/:object/import | POST | Import en masse (CSV ou JSON). Corps : { format, csv? | rows?, mapping?, dryRun? }. Maximum 5 000 lignes/requête |
/data/:object/export | POST | Exporter les enregistrements en csv / xlsx / pdf / json |
/data/:object/:id/shares | GET / POST | Partage par enregistrement — lister les octrois, accorder l'accès |
/data/:object/:id/shares/:shareId | DELETE | Révoquer un partage |
/data/lead/:id/convert | POST | Conversion de lead à la Salesforce (modèle CRM). Corps : { accountId?, contactId?, createOpportunity? } |
Exemple rapide
GET /api/v1/data/support_ticket?where={"status":{"$eq":"open"}}&orderBy=-created_at&limit=20
Authorization: Bearer <token>{
"items": [ { "id": "...", "subject": "...", "status": "open" } ],
"total": 137,
"nextCursor": "eyJpZCI6IjAxSDA..."
}IA — /api/v1/ai/*
Les points de terminaison sur lesquels reposent l'AI Builder et vos agents.
| Chemin | Méthode | Permission | Objectif |
|---|---|---|---|
/ai/models | GET | ai:chat | Lister les modèles disponibles des fournisseurs configurés |
/ai/chat | POST | ai:chat | Complétion de chat en un seul coup (synchrone) |
/ai/chat/stream | POST | ai:chat | Chat en streaming (SSE) |
/ai/complete | POST | ai:chat | Point de terminaison de complétion brute |
/ai/conversations | GET / POST | ai:chat | Lister / créer des conversations persistantes |
/ai/conversations/:id | GET / DELETE | ai:chat | Lire / supprimer une conversation |
/ai/conversations/:id/messages | POST | ai:chat | Ajouter un message utilisateur et exécuter l'agent |
/ai/pending-actions | GET | ai:read | La file d'approbation HITL — mutations proposées par l'IA |
/ai/pending-actions/:id | GET | ai:read | Inspecter une mutation en file d'attente |
/ai/pending-actions/:id/approve | POST | ai:approve | Appliquer la mutation |
/ai/pending-actions/:id/reject | POST | ai:approve | La rejeter |
La séparation entre ai:read et ai:approve est la primitive de sécurité
qui rend l'AI Builder sûr pour les utilisateurs finaux.
Actions — /api/v1/actions/*
Chaque *.action.ts que vous déclarez devient un point de terminaison.
| Chemin | Méthode | Objectif |
|---|---|---|
/actions/:action | POST | Invoquer l'action. Le corps correspond au schéma d'entrée de l'action. Les permissions et la validation des entrées proviennent de la déclaration de l'action |
Chaque action est également exposée à l'IA sous forme d'outil action_<name> — voir
Actions.
Flows — /api/v1/flows/*
| Chemin | Méthode | Objectif |
|---|---|---|
/flows/:flow/start | POST | Démarrer un flow. Le corps correspond à l'entrée du flow |
/flows/:flow/runs/:runId | GET | Statut + sortie des étapes d'un flow en cours / terminé |
/flows/:flow/runs/:runId/cancel | POST | Annuler une exécution en cours |
Métadonnées — /api/v1/meta/*
Introspection en lecture seule des métadonnées du runtime en cours d'exécution. Utile pour l'outillage et la Console.
| Chemin | Méthode | Objectif |
|---|---|---|
/meta | GET | Tous les types de métadonnées (object, view, action, flow, agent, …) |
/meta/:type | GET | Lister les éléments d'un type. Filtrer avec ?package=<id> |
/meta/:type/:name | GET | Récupérer un élément. ?layers=true renvoie la vue de diff à 3 états (base / package / overlay) |
/meta/:type/:name/references | GET | Trouver chaque élément de métadonnées qui référence celui-ci |
/meta/:type/:name/history | GET | Piste d'audit pour cet élément |
/meta/:type/:section/:name | GET / POST | Lire / insérer-ou-mettre-à-jour un élément de métadonnées sectionné |
/meta/:type/:section/:name | DELETE | Supprimer un élément sectionné |
Partage et approbations
| Chemin | Méthode | Objectif |
|---|---|---|
/sharing/rules | GET / POST / DELETE | Gérer les règles de partage |
/sharing/rules/:idOrName/evaluate | POST | Exécuter une règle à blanc sur un contexte |
/approvals/processes | GET / POST | Définitions de processus d'approbation |
/approvals/requests | GET / POST | Soumettre / lister les demandes d'approbation |
/approvals/requests/:id/approve | POST | Décision : approuver |
/approvals/requests/:id/reject | POST | Décision : rejeter |
Rapports et recherche
| Chemin | Méthode | Objectif |
|---|---|---|
/reports | GET / POST / PATCH | CRUD des rapports |
/reports/:id/run | POST | Exécuter un rapport — renvoie des lignes agrégées |
/reports/:id/schedule | POST | Planifier une diffusion récurrente |
Formulaires publics
Les seules routes qui sont non authentifiées, activées de manière optionnelle via
FormView.sharing.allowAnonymous.
| Chemin | Méthode | Authentification |
|---|---|---|
/forms/:slug | GET | publique — renvoie le schéma du formulaire |
/forms/:slug/submit | POST | publique — soumet une réponse |
Utilitaires
| Chemin | Méthode | Permission | Objectif |
|---|---|---|---|
/email/send | POST | email:send | Envoyer un e-mail via le fournisseur configuré |
Enveloppe d'erreur
Chaque réponse non-2xx suit la même forme :
{
"error": {
"code": "PERMISSION_DENIED",
"message": "Missing ai:approve on conversation 01H…",
"details": { "permission": "ai:approve", "subject": "01H…" }
}
}Codes courants : UNAUTHENTICATED, PERMISSION_DENIED,
VALIDATION_ERROR, NOT_FOUND, CONCURRENT_UPDATE,
RATE_LIMITED, INTERNAL.
Versionnage
/api/v1 est l'API stable. Les changements incompatibles vont vers /api/v2 et
les deux sont servies en parallèle pendant une version mineure. La version actuelle et
l'horizon de dépréciation se trouvent dans GET /api/v1.
Voir aussi
- ObjectQL — le langage de requête utilisé par
/data/* - Types de champs — les formes que peuvent prendre les données
- Build → Actions — déclarer des points de terminaison personnalisés
- Sécurité — ce que chaque route vérifie avant de s'exécuter