Développeurs
API SeveUp
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
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.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 secretsk_…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'organisation2.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.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-Keypermet 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.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
completevé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.Créer la maquette
La conversion démarre aussitôt : réponse
202avec un job, et son adresse dansLocation. 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.Suivre le traitement
Statuts :
QUEUED,PROCESSING, puisCOMPLETEouERROR(avecerror.code). Plutôt que d'interroger, un webhookrevision.processing.completedpeut 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.Contrôler avec un IDS et lire le résultat
Choisissez un jeu d'exigences existant, ou déposez un
.ids(dépôtpurpose: ids, puisPOST /api/v1/requirement-sets). Le contrôle est un job comme les autres. Dans le résultat, une spécification compte dans le score siapplicableest 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, ouTEMPLATE_NOT_FOUNDpour 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.
{
"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.
Projets
Projets de l'organisation visibles par la clé.
Espaces
Espaces de l'organisation (regroupements de projets), et ce qui y est rangé.
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.
Maquettes
Maquettes IFC et leurs révisions.
- get
/api/v1/projects/{project_id}/modelsLister les maquettes d'un projet - post
/api/v1/projects/{project_id}/modelsCréer une maquette depuis un fichier déposé - get
/api/v1/modelsRechercher les maquettes de l'organisation - get
/api/v1/models/{model_id}Lire une maquette - patch
/api/v1/models/{model_id}Renommer une maquette - delete
/api/v1/models/{model_id}Archiver une maquette - get
/api/v1/models/{model_id}/naming-checkContrôler le nom de fichier d'une maquette - get
/api/v1/models/{model_id}/revisionsLister les révisions d'une maquette - post
/api/v1/models/{model_id}/revisionsAjouter une révision depuis un fichier déposé - get
/api/v1/revisions/{revision_id}Lire une révision et son état de traitement - patch
/api/v1/revisions/{revision_id}Changer le jalon d'une révision - get
/api/v1/revisions/{revision_id}/objectsChercher des objets d'une révision (classe, propriété, valeur) - get
/api/v1/naming-conventionsLister les conventions de nommage - get
/api/v1/naming-conventions/{naming_convention_id}Lire une convention de nommage - post
/api/v1/naming-conventions/{naming_convention_id}/checkContrôler des noms de fichiers
Fichiers
Dépôt de fichiers par URL signée, avant création d'une révision ou d'un jeu d'exigences.
IDS
Jeux d'exigences IDS et contrôles de conformité.
- get
/api/v1/revisions/{revision_id}/ids-resultsRésultats IDS d'une révision - get
/api/v1/revisions/{revision_id}/ids-failuresÉchecs IDS détaillés d'une révision pour un jeu d'exigences - get
/api/v1/revisions/{revision_id}/ids-failures/bcfNon-conformités IDS d'une révision en fichier BCF - get
/api/v1/projects/{project_id}/ids-summarySynthèse IDS d'un projet (dernière révision de chaque maquette) - post
/api/v1/spaces/{space_id}/requirement-setsRanger un jeu d'exigences existant dans un espace - get
/api/v1/requirement-setsLister les jeux d'exigences IDS - post
/api/v1/requirement-setsCréer un jeu d'exigences depuis un fichier IDS déposé - get
/api/v1/requirement-sets/{requirement_set_id}Lire un jeu d'exigences - delete
/api/v1/requirement-sets/{requirement_set_id}Supprimer un jeu d'exigences - get
/api/v1/requirement-sets/{requirement_set_id}/specificationsLire ce que demande un jeu d'exigences - post
/api/v1/ids-checksContrôler une révision avec un jeu d'exigences
Exports
Export des données d'une révision.
Visa
Grille de visa des projets et fiches de visa des maquettes, en lecture.
Documents
Documents de la bibliothèque visibles depuis un projet, leurs versions et leurs fichiers, en lecture.
Kairnial
Projets du connecteur Kairnial et exports zip de leurs fichiers.
Issues
Points à traiter sur les maquettes (issues BCF de l'App) et leurs commentaires.
Jobs
Suivi des traitements longs.
Webhooks
Abonnements aux événements de l'organisation.
- get
/api/v1/webhooksLister les abonnements webhook - post
/api/v1/webhooksCréer un abonnement webhook - delete
/api/v1/webhooks/{webhook_id}Supprimer un abonnement webhook - get
/api/v1/webhooks/{webhook_id}/deliveriesJournal de livraison d'un abonnement - post
/api/v1/webhooks/{webhook_id}/deliveries/{delivery_id}/retryRejouer une livraison
É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.
- Problem
- Page
- ProcessingStatus
- Organization
- Project
- ModelUpdate
- RevisionUpdate
- ProjectCreate
- ProjectUpdate
- Model
- ModelProject
- ModelSearchItem
- ModelCreate
- StepStatus
- Revision
- RevisionCreate
- IdsSpecificationResult
- IdsResult
- IdsFacet
- IdsObjectCheck
- IdsInvalidObject
- IdsSpecificationFailure
- IdsFailures
- IdsFailuresBcf
- ObjectRow
- ObjectPage
- IdsSummary
- RequirementSet
- RequirementSetSpecification
- RequirementSetSpecifications
- RequirementSetCreate
- Space
- DashboardTemplate
- Dashboard
- DashboardCreate
- SpaceRequirementSet
- IdsCheckCreate
- ExportCreate
- UploadCreate
- Upload
- Job
- NamingConvention
- NamingConventionPart
- NamingProblem
- FileNameCheckRequest
- FileNameResult
- FileNameCheck
- ModelNameCheck
- VisaGrid
- DocumentVersion
- Document
- DocumentDownload
- KairnialProject
- KairnialExportCreate
- KairnialExport
- VisaSheet
- IssueBoard
- IssueComment
- Issue
- IssueCreate
- IssueUpdate
- IssueCommentCreate
- WebhookEventType
- Webhook
- WebhookCreate
- WebhookDelivery
- WebhookEvent
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êtesDeprecation(RFC 9745),Sunset(RFC 8594) etLink(rel="deprecation", vers le journal) sur ses réponses. Elle fonctionne normalement jusqu'à la date de retrait, puis répond410avec le codeGONE.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)
- · v1.18.0
Nouvelle opération : GET /api/v1/organization.
- · v1.17.0
Nouvelle opération : GET /api/v1/models.
- · 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.
- · v1.15.0
Nouveau champ de réponse : GET /api/v1/revisions/{revision_id}/ids-results.
- · 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.