Skip to main content
Voir en Markdown

Présentation de l'API REST

Sovrium expose une API REST sur les tables, enregistrements, vues, activité, analytique et authentification. Chaque point de terminaison accepte et renvoie du JSON, applique le RBAC avec des permissions par champ, et émet une unique enveloppe d'erreur canonique.

La liste complète des chemins vit dans la Référence des points de terminaison ; cette page en est le contrat.

URL de base

Tous les points de terminaison sont relatifs à l'URL de base de votre instance Sovrium.

code
http://localhost:3000/api

Authentification et contrôle d'accès

L'authentification repose sur les sessions (Better Auth). Les requêtes touchant des ressources protégées doivent porter l'une des deux formes d'identifiant, et il n'y en a pas d'autre :

Identifiant Comment il circule Quand il s'applique
Cookie de session better-auth.session_token Toujours, dès que auth est configuré. Le mode par défaut du navigateur.
x-api-key: <clé> Un en-tête de requête x-api-key Lorsque auth.apiKeys est actif. Voir Clés API.

L'accès est régi par des rôles plus des permissions par champ. Les permissions de table acceptent all, authenticated, ou une liste arbitraire de noms de rôles — admin, member et viewer sont donc les valeurs intégrées par défaut, pas un ensemble figé. Une application sans bloc auth évalue les requêtes sous un rôle guest.

Conformément à la politique anti-énumération, une requête authentifiée qui n'a pas accès à une ressource renvoie 404, jamais 403, afin que l'appelant ne puisse distinguer « introuvable » de « accès refusé ».

Contrat de réponse d'erreur

Toutes les réponses 4xx/5xx emploient une unique enveloppe JSON canonique : un seul décodeur couvre donc toutes les erreurs.

app.json
{
  "success": false,
  "message": "Authentication required",
  "code": "UNAUTHORIZED"
}

code provient d'une énumération stable de treize valeurs : UNAUTHORIZED, FORBIDDEN, NOT_FOUND, VALIDATION_ERROR, BAD_REQUEST, CONFLICT, PAYLOAD_TOO_LARGE, RATE_LIMITED, INTERNAL_ERROR, SERVICE_UNAVAILABLE, STORAGE_ERROR, DATABASE_ERROR, QUOTA_EXCEEDED. Un error optionnel (identifiant de type hérité) et un details (tableau de chaînes) peuvent également être présents.

Lorsque l'échec porte sur des champs, un tableau errors[] nomme chaque champ fautif :

app.json
{
  "success": false,
  "message": "One or more fields failed validation",
  "code": "VALIDATION_ERROR",
  "errors": [{ "field": "id", "message": "Cannot write to readonly field 'id'" }]
}

Une création d'enregistrement refusée par la base de données alimente ce même tableau. Lorsqu'une contrainte CHECK, de clé étrangère ou NOT NULL rejette une valeur sur POST /api/tables/:table/records, la réponse nomme la colonne sur laquelle la contrainte est déclarée :

app.json
{
  "success": false,
  "message": "A submitted value is not allowed by this resource",
  "code": "VALIDATION_ERROR",
  "field": "status",
  "errors": [{ "field": "status", "message": "A submitted value is not allowed by this resource" }]
}

Seul un champ que vous avez réellement envoyé est nommé, et la réponse n'énumère jamais les valeurs acceptées par un champ. La colonne est retrouvée à partir de la contrainte déclenchée et n'est rapportée que si elle correspond à une clé de votre charge utile : une réponse d'erreur ne peut donc jamais servir à découvrir un schéma que vous ne pouvez pas lire par ailleurs. Si aucune clé envoyée ne correspond, field et errors[] sont omis et le message de la classe répond seul.

Cette attribution se limite à ce chemin de création unitaire. Un PATCH, ou une écriture en lot refusée par la même contrainte, répond avec un statut et un code identiques, le message de la classe et sans field.

Statut code Signification
400 VALIDATION_ERROR Échec de validation de champ (porte errors[])
400 BAD_REQUEST Requête mal formée
401 UNAUTHORIZED Session absente / expirée
403 FORBIDDEN Authentifié, action refusée (rare — voir ci-dessus)
404 NOT_FOUND Introuvable, ou refus d'accès anti-énumération
409 CONFLICT Collision d'unicité (écriture unique et en lot) ou écriture optimiste périmée
413 PAYLOAD_TOO_LARGE La charge utile du lot dépasse la limite dure
429 RATE_LIMITED Limite de débit dépassée
500 INTERNAL_ERROR Erreur serveur inattendue (détails masqués)

Les dépassements de taille de lot se répartissent sur deux codes : dépasser le maximum par opération (1000 en création, 100 en mise à jour, 100 identifiants en suppression, 100 en upsert) est un 400 VALIDATION_ERROR, tandis qu'une charge utile au-delà de la garde dure de 1000 identifiants donne 413.

La forme de la requête ne change jamais son code. Une collision d'unicité répond 409, qu'elle survienne dans une écriture unique ou dans un lot : un seul gestionnaire couvre les deux cas. Les autres classes de contrainte (check, clé étrangère, NOT NULL) répondent 400 VALIDATION_ERROR sur tous les chemins, car celles-là rejettent la valeur envoyée au lieu d'entrer en conflit avec une ligne déjà existante.

La configuration est uniquement du code

Il n'existe aucune API d'édition de schéma à l'exécution. Sovrium est un interpréteur de configuration-as-code : vous modifiez une application en éditant son app.ts / app.yaml puis en redéployant — le même fichier que la CLI valide hors ligne avec sovrium validate. Le tableau de bord d'administration reflète les données d'exécution, jamais la configuration (Tableau de bord d'administration) ; les changements de schéma s'appliquent au démarrage suivant (Migrations).

Santé

Déplacé vers Référence des points de terminaison.

Tables

Déplacé vers Référence des points de terminaison.

Enregistrements

Déplacé vers Référence des points de terminaison.

Vues

Déplacé vers Référence des points de terminaison.

Activité

Déplacé vers Référence des points de terminaison.

Analytique

Déplacé vers Référence des points de terminaison.

Endpoints d'authentification

Déplacé vers Référence des points de terminaison.

Fonctionnalités transversales

  • Pagination — les points de terminaison de liste paginent leurs résultats (limit + offset).
  • Suppressions doucesDELETE met à la corbeille par défaut ; ?permanent=true et ?purge=true suppriment définitivement sur la même route.
  • RBAC — chaque route protégée est filtrée par rôle, avec guest pour les applications sans authentification.
  • Permissions par champ — contrôle fin lecture/écriture par champ et par rôle.
  • Limitation de débit — les points de terminaison d'authentification et d'administration sont limités.
  • Enveloppe d'erreur canonique — chaque 4xx/5xx partage la forme ci-dessus.

Pages associées

Dernière mise à jour 28 août 2026

Cette documentation a été rédigée avec de l'IA : des erreurs ou du contenu obsolète sont donc possibles. Sovrium est en bêta. Les contributions et corrections sont les bienvenues.

Construit avec Sovrium