Aller au contenu

Développeurs

API SeveUp

Projets, maquettes IFC, révisions, contrôles IDS et exports de SeveUp App.

L'API est en service à l'adresse https://api.seve-up.app. Le contrat OpenAPI fait foi.

API publique de SeveUp App, réservée aux plans PRO, BUSINESS, ENTREPRISE et CUSTOM (TRIAL : lecture seule).

Authentification. Une clé d'organisation sk_…, créée dans la console d'organisation (section « Clés d'API »), envoyée en Authorization: Bearer sk_…. Chaque clé porte des scopes ; une route sans le scope requis répond 403 avec code: SCOPE_MISSING. Aucun secret n'est accepté dans une URL.

Erreurs. Toujours application/problem+json (RFC 9457). Le champ code est stable : le programme s'appuie dessus, jamais sur title ou detail. Le type s'en déduit (SCOPE_MISSING donne https://seve-up.com/problems/scope-missing). Une requête invalide (VALIDATION) détaille chaque champ fautif dans errors. Un identifiant inconnu, mal formé ou d'une autre organisation répond 404 NOT_FOUND.

Pagination. Par curseur opaque : ?limit= (1 à 200, 50 par défaut) et ?cursor= (valeur de next_cursor de la page précédente). Fin de liste : has_more: false et next_cursor: null.

Plans. L'API est ouverte aux plans PRO, BUSINESS, ENTREPRISE et CUSTOM. Le plan d'essai (TRIAL) l'ouvre en lecture seule : toute écriture répond 403 PLAN_READ_ONLY. Les autres plans répondent 403 PLAN_REQUIRED. Un plan payant arrivé à échéance reste lisible ; ses écritures répondent PLAN_READ_ONLY.

Débit. Chaque réponse porte RateLimit-Policy et RateLimit (draft-ietf-httpapi-ratelimit-headers), par clé et par fenêtre d'une minute : 60 requêtes en essai, 600 en PRO, 1 200 en BUSINESS, 3 000 en ENTREPRISE et CUSTOM. Au-delà : 429 RATE_LIMITED avec Retry-After en secondes.

Quotas. Par organisation et par mois calendaire (UTC) : appels, versions déposées, volume déposé, contrôles IDS. Un quota atteint répond 429 QUOTA_EXCEEDED, avec Retry-After jusqu'au 1er du mois suivant. Un quota se consomme avant le lancement du traitement : une requête refusée ne compte pas. Si la vérification est momentanément impossible, l'appel répond 503 BUSY plutôt que de passer sans être compté.

Capacité. Les opérations marquées x-heavy (dépôt, conversion, contrôle IDS, export, synthèses) partagent un nombre limité de places ; une organisation a au plus un nombre fixé de traitements actifs (3 en PRO, 5 en BUSINESS, 10 en ENTREPRISE et CUSTOM). Place indisponible : 503 BUSY avec Retry-After. Trop de traitements en cours : 429 QUOTA_EXCEEDED avec Retry-After.

Idempotence. Tout POST accepte Idempotency-Key (1 à 200 caractères, gardée 24 h par organisation). Rejouer la même clé avec le même corps renvoie la réponse d'origine et Idempotent-Replayed: true ; avec un autre corps, 409 IDEMPOTENCY_KEY_REUSED.

Traitements longs. Conversion d'une maquette, contrôle IDS et export répondent 202 avec une ressource Job ; suivre GET /api/v1/jobs/{job_id} ou s'abonner aux webhooks.

Types. Les nombres et booléens sont de vrais types JSON. Les dates sont en RFC 3339 (UTC).

Serveurs

  • https://api.seve-up.appProduction

Version complète sur une seule page (Markdown)

Sans écrire de code, vous pouvez aussi interroger SeveUp depuis un assistant IA. SeveUp dans Claude et ChatGPT

Ce que l'API de SeveUp App échange avec votre logicielVotre logiciel appelle l'API REST de SeveUp App avec une clé d'API, sur les projets, maquettes et révisions. Il lance des contrôles IDS suivis par job, récupère des exports de données, et reçoit des événements par webhook.Votre logicielAppels REST, clé d'APIAPI SeveUp AppProjets, maquettes, révisionsContrôles IDSLancés et suivis par jobExports de donnéesObjets et propriétésWebhooksÉvénements vers votre URL
Avec une clé d'API, votre logiciel lit projets, maquettes et révisions, lance des contrôles IDS, récupère des exports de données et reçoit les événements par webhook.

Démarrer

De la clé au résultat d'un contrôle IDS, en sept appels. Les exemples utilisent curl et jq ; toute requête porte Authorization: Bearer suivi de la clé.

  1. 1.Créer une clé

    Dans SeveUp App, console d'organisation, section « Clés d'API » (réservée aux administrateurs) : « Clé de l'API publique », cochez les scopes utiles (projects:read, models:read, models:write, ids:read, ids:write). Le secret sk_… n'est montré qu'une fois. La même section affiche l'usage de l'API : appels, quotas du mois et erreurs.

    Shell
    export SEVEUP_API=https://api.seve-up.app
    export SEVEUP_KEY=sk_…   # clé d'organisation
  2. 2.Lister les projets

    Réponse paginée par curseur : data, has_more, next_cursor.

    Shell
    curl -s "$SEVEUP_API/api/v1/projects" -H "Authorization: Bearer $SEVEUP_KEY" | jq '.data[] | {id, name}'
  3. 3.Ouvrir un dépôt

    Le fichier ne passe pas par l'API : la réponse donne une adresse d'envoi TUS et ses en-têtes, valables 2 h. Idempotency-Key permet de rejouer l'appel sans créer un second dépôt.

    Shell
    FICHIER=maquette.ifc
    TAILLE=$(wc -c < "$FICHIER")
    curl -s -X POST "$SEVEUP_API/api/v1/uploads" \
      -H "Authorization: Bearer $SEVEUP_KEY" -H "Content-Type: application/json" \
      -H "Idempotency-Key: depot-$(date +%s)" \
      -d "{\"file_name\": \"$FICHIER\", \"size_bytes\": $TAILLE, \"purpose\": \"model\"}" > depot.json
    DEPOT=$(jq -r .id depot.json)
  4. 4.Envoyer le fichier

    Protocole TUS 1.0 : création, puis envoi des octets. Pour un gros fichier, préférez un client TUS (tus-js-client, tuspy…) qui reprend après une coupure, avec des morceaux de 6 Mo. Puis complete vérifie que le fichier est arrivé en entier.

    Shell
    URL=$(jq -r .upload_url depot.json)
    AUTH=$(jq -r '.upload_headers.Authorization' depot.json)
    META=$(jq -r '.upload_headers["Upload-Metadata"]' depot.json)
    LOC=$(curl -s -i -X POST "$URL" -H "Authorization: $AUTH" -H "Tus-Resumable: 1.0.0" \
      -H "Upload-Metadata: $META" -H "Upload-Length: $TAILLE" \
      | awk 'tolower($1)=="location:" {print $2}' | tr -d '\r')
    curl -s -X PATCH "$LOC" -H "Authorization: $AUTH" -H "Tus-Resumable: 1.0.0" \
      -H "Upload-Offset: 0" -H "Content-Type: application/offset+octet-stream" --data-binary @"$FICHIER"
    curl -s -X POST "$SEVEUP_API/api/v1/uploads/$DEPOT/complete" \
      -H "Authorization: Bearer $SEVEUP_KEY" -H "Content-Type: application/json" -d '{}'
  5. 5.Créer la maquette

    La conversion démarre aussitôt : réponse 202 avec un job, et son adresse dans Location. Pour une nouvelle version d'une maquette existante : POST /api/v1/models/{model_id}/revisions.

    Shell
    PROJET=…   # id d'un projet de l'étape 2
    curl -s -X POST "$SEVEUP_API/api/v1/projects/$PROJET/models" \
      -H "Authorization: Bearer $SEVEUP_KEY" -H "Content-Type: application/json" \
      -d "{\"name\": \"Ma maquette\", \"upload_id\": \"$DEPOT\"}" > job.json
    REVISION=$(jq -r .target.id job.json)
  6. 6.Suivre le traitement

    Statuts : QUEUED, PROCESSING, puis COMPLETE ou ERROR (avec error.code). Plutôt que d'interroger, un webhook revision.processing.completed peut vous prévenir.

    Shell
    JOB=$(jq -r .id job.json)
    until s=$(curl -s "$SEVEUP_API/api/v1/jobs/$JOB" -H "Authorization: Bearer $SEVEUP_KEY" | jq -r .status); \
      [ "$s" = COMPLETE ] || [ "$s" = ERROR ]; do sleep 20; done; echo "$s"
  7. 7.Contrôler avec un IDS et lire le résultat

    Choisissez un jeu d'exigences existant, ou déposez un .ids (dépôt purpose: ids, puis POST /api/v1/requirement-sets). Le contrôle est un job comme les autres. Dans le résultat, une spécification compte dans le score si applicable est vrai.

    Shell
    JEU=$(curl -s "$SEVEUP_API/api/v1/requirement-sets" -H "Authorization: Bearer $SEVEUP_KEY" | jq -r '.data[0].id')
    curl -s -X POST "$SEVEUP_API/api/v1/ids-checks" \
      -H "Authorization: Bearer $SEVEUP_KEY" -H "Content-Type: application/json" \
      -d "{\"revision_id\": \"$REVISION\", \"requirement_set_id\": \"$JEU\"}"
    # … suivre le job comme à l'étape 6, puis :
    curl -s "$SEVEUP_API/api/v1/revisions/$REVISION/ids-results" -H "Authorization: Bearer $SEVEUP_KEY" \
      | jq '.data[] | {score_percent, specification_count_failed}'

Erreurs

Toute erreur répond en application/problem+json (RFC 9457) : un code stable à tester dans votre code, un title lisible et, pour une requête invalide, la liste des champs en cause. La liste des codes peut s'allonger : traitez un code inconnu d'après le statut HTTP. Ces réponses valent pour la plupart des opérations ; chaque opération ne détaille que les siennes.

  • 400Requête invalide.
  • 401Clé absente, inconnue, expirée ou révoquée.
  • 403Scope manquant (SCOPE_MISSING), plan sans accès à l'API ou à la fonction demandée (PLAN_REQUIRED), écriture refusée en plan TRIAL (PLAN_READ_ONLY), route non ouverte aux clés (API_KEY_ROUTE_FORBIDDEN) ou modèle de tableau de bord réservé (TEMPLATE_RESERVED).
  • 404Ressource inexistante ou appartenant à une autre organisation (jamais distingué) : NOT_FOUND, ou TEMPLATE_NOT_FOUND pour le modèle d'un tableau de bord à créer.
  • 429Débit de la clé dépassé (RATE_LIMITED) ou quota mensuel du plan atteint (QUOTA_EXCEEDED).
  • 500Erreur inattendue du serveur, déjà journalisée de notre côté ; réessayer plus tard.
  • 503Capacité de traitement saturée pour l'instant ; réessayer après Retry-After.
Exemple de réponse d'erreur
{
  "type": "https://seve-up.com/problems/validation",
  "title": "Bad Request",
  "status": 400,
  "code": "VALIDATION",
  "detail": "limit : doit être compris entre 1 et 200.",
  "instance": "/api/v1/projects",
  "errors": [
    {
      "field": "limit",
      "message": "doit être compris entre 1 et 200"
    }
  ]
}

Référence

Chaque groupe a sa page : paramètres, corps, réponses et exemples de requête en curl, JavaScript et Python.

Organisation

Organisation à laquelle la clé est rattachée.

Référence détaillée : Organisation (1 opération)

Projets

Projets de l'organisation visibles par la clé.

Référence détaillée : Projets (5 opérations)

Espaces

Espaces de l'organisation (regroupements de projets), et ce qui y est rangé.

Référence détaillée : Espaces (1 opération)

Tableaux de bord

Tableaux de bord (modèles de rapports de l'App) d'un espace, et modèles proposés pour en créer.

Référence détaillée : Tableaux de bord (3 opérations)

Maquettes

Maquettes IFC et leurs révisions.

Référence détaillée : Maquettes (15 opérations)

Fichiers

Dépôt de fichiers par URL signée, avant création d'une révision ou d'un jeu d'exigences.

Référence détaillée : Fichiers (2 opérations)

IDS

Jeux d'exigences IDS et contrôles de conformité.

Référence détaillée : IDS (11 opérations)

Exports

Export des données d'une révision.

Référence détaillée : Exports (1 opération)

Visa

Grille de visa des projets et fiches de visa des maquettes, en lecture.

Référence détaillée : Visa (3 opérations)

Documents

Documents de la bibliothèque visibles depuis un projet, leurs versions et leurs fichiers, en lecture.

Référence détaillée : Documents (3 opérations)

Kairnial

Projets du connecteur Kairnial et exports zip de leurs fichiers.

Référence détaillée : Kairnial (3 opérations)

Issues

Points à traiter sur les maquettes (issues BCF de l'App) et leurs commentaires.

Référence détaillée : Issues (6 opérations)

Jobs

Suivi des traitements longs.

Référence détaillée : Jobs (1 opération)

Webhooks

Abonnements aux événements de l'organisation.

Référence détaillée : Webhooks (5 opérations)

Événements webhook

Événements envoyés en POST à l'URL d'un abonnement.

Schémas

Objets échangés par l'API, champ par champ.

Versions et dépréciation

  • La version majeure est dans le chemin : /api/v1. À l'intérieur d'une version, seuls des changements compatibles sont publiés : nouvelles opérations, nouveaux champs de réponse, nouveaux paramètres facultatifs. Votre code doit ignorer les champs qu'il ne connaît pas et traiter un code d'erreur inconnu d'après le statut HTTP : la liste des codes peut s'allonger.

  • Un changement incompatible (champ retiré ou renommé, type modifié, paramètre rendu obligatoire) passe par une nouvelle version, /api/v2. La version précédente reste servie au moins 12 mois après la sortie de la suivante.

  • Dans v1, un champ n'est jamais retiré. Une opération vouée à disparaître est annoncée au moins 6 mois avant son retrait : entrée dans le journal des changements (aussi en flux Atom), e-mail aux administrateurs des organisations dont une clé l'a appelée dans les 90 derniers jours, 6 mois puis 1 mois avant le retrait, et en-têtes Deprecation (RFC 9745), Sunset (RFC 8594) et Link (rel="deprecation", vers le journal) sur ses réponses. Elle fonctionne normalement jusqu'à la date de retrait, puis répond 410 avec le code GONE.

  • Seule exception : un correctif de sécurité peut s'appliquer sans préavis. Il est alors décrit dans le journal des changements le jour même.

Journal des changements

Journal complet, changement par changementVersion JSONFlux AtomToute la référence en Markdown (pour les agents IA)

  1. · v1.18.0

    Nouvelle opération : GET /api/v1/organization.

  2. · v1.17.0

    Nouvelle opération : GET /api/v1/models.

  3. · v1.16.0

    Nouvelle opération : GET /api/v1/dashboard-templates, GET /api/v1/spaces, GET /api/v1/spaces/{space_id}/dashboards, POST /api/v1/spaces/{space_id}/dashboards, POST /api/v1/spaces/{space_id}/requirement-sets ; Nouveau paramètre facultatif : GET /api/v1/requirement-sets ; Nouveau champ facultatif dans la requête : POST /api/v1/requirement-sets ; Nouveau statut d'erreur documenté : POST /api/v1/requirement-sets.

  4. · v1.15.0

    Nouveau champ de réponse : GET /api/v1/revisions/{revision_id}/ids-results.

  5. · v1.14.0

    Nouveau paramètre facultatif : GET /api/v1/revisions/{revision_id}/objects ; Nouveau champ de réponse : GET /api/v1/revisions/{revision_id}/objects.