ObjectOS
Référence

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

CheminMéthodeObjectif
/api/v1GETDécouverte de service — liste toutes les routes enregistrées, la version, le mode de cadrage
/api/v1/discoveryGETAlias explicite du document de découverte ci-dessus
/api/v1/openapi.jsonGETSpécification OpenAPI 3.0 pour chaque point de terminaison du runtime en cours d'exécution
/api/v1/searchGETRecherche 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éfaut true) — définissez false pour 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).

CheminMéthodeObjectif
/data/:objectGETLister / interroger — passez where, orderBy, limit, offset, cursor, expand, select comme paramètres de requête
/data/:object/queryPOSTRequête avancée — corps ObjectQL complet avec groupBy + aggregations (voir ObjectQL)
/data/:object/:idGETRécupérer un enregistrement. Prend en charge ?select= et ?expand=
/data/:objectPOSTCréer. Renvoie 201 avec le nouvel enregistrement
/data/:object/:idPATCHMettre à 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/:idDELETESupprimer. Même règle If-Match
/data/:object/importPOSTImport en masse (CSV ou JSON). Corps : { format, csv? | rows?, mapping?, dryRun? }. Maximum 5 000 lignes/requête
/data/:object/exportPOSTExporter les enregistrements en csv / xlsx / pdf / json
/data/:object/:id/sharesGET / POSTPartage par enregistrement — lister les octrois, accorder l'accès
/data/:object/:id/shares/:shareIdDELETERévoquer un partage
/data/lead/:id/convertPOSTConversion 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.

CheminMéthodePermissionObjectif
/ai/modelsGETai:chatLister les modèles disponibles des fournisseurs configurés
/ai/chatPOSTai:chatComplétion de chat en un seul coup (synchrone)
/ai/chat/streamPOSTai:chatChat en streaming (SSE)
/ai/completePOSTai:chatPoint de terminaison de complétion brute
/ai/conversationsGET / POSTai:chatLister / créer des conversations persistantes
/ai/conversations/:idGET / DELETEai:chatLire / supprimer une conversation
/ai/conversations/:id/messagesPOSTai:chatAjouter un message utilisateur et exécuter l'agent
/ai/pending-actionsGETai:readLa file d'approbation HITL — mutations proposées par l'IA
/ai/pending-actions/:idGETai:readInspecter une mutation en file d'attente
/ai/pending-actions/:id/approvePOSTai:approveAppliquer la mutation
/ai/pending-actions/:id/rejectPOSTai:approveLa 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.

CheminMéthodeObjectif
/actions/:actionPOSTInvoquer 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/*

CheminMéthodeObjectif
/flows/:flow/startPOSTDémarrer un flow. Le corps correspond à l'entrée du flow
/flows/:flow/runs/:runIdGETStatut + sortie des étapes d'un flow en cours / terminé
/flows/:flow/runs/:runId/cancelPOSTAnnuler 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.

CheminMéthodeObjectif
/metaGETTous les types de métadonnées (object, view, action, flow, agent, …)
/meta/:typeGETLister les éléments d'un type. Filtrer avec ?package=<id>
/meta/:type/:nameGETRécupérer un élément. ?layers=true renvoie la vue de diff à 3 états (base / package / overlay)
/meta/:type/:name/referencesGETTrouver chaque élément de métadonnées qui référence celui-ci
/meta/:type/:name/historyGETPiste d'audit pour cet élément
/meta/:type/:section/:nameGET / POSTLire / insérer-ou-mettre-à-jour un élément de métadonnées sectionné
/meta/:type/:section/:nameDELETESupprimer un élément sectionné

Partage et approbations

CheminMéthodeObjectif
/sharing/rulesGET / POST / DELETEGérer les règles de partage
/sharing/rules/:idOrName/evaluatePOSTExécuter une règle à blanc sur un contexte
/approvals/processesGET / POSTDéfinitions de processus d'approbation
/approvals/requestsGET / POSTSoumettre / lister les demandes d'approbation
/approvals/requests/:id/approvePOSTDécision : approuver
/approvals/requests/:id/rejectPOSTDécision : rejeter

Rapports et recherche

CheminMéthodeObjectif
/reportsGET / POST / PATCHCRUD des rapports
/reports/:id/runPOSTExécuter un rapport — renvoie des lignes agrégées
/reports/:id/schedulePOSTPlanifier une diffusion récurrente

Formulaires publics

Les seules routes qui sont non authentifiées, activées de manière optionnelle via FormView.sharing.allowAnonymous.

CheminMéthodeAuthentification
/forms/:slugGETpublique — renvoie le schéma du formulaire
/forms/:slug/submitPOSTpublique — soumet une réponse

Utilitaires

CheminMéthodePermissionObjectif
/email/sendPOSTemail:sendEnvoyer 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

On this page