Passer au contenu

API du validateur BPMN

Envoyez un fichier BPMN 2.0 en XML et recevez un rapport JSON : erreurs, avertissements et informations, avec la règle concernée et sa position dans le fichier. L'API est gratuite et ne demande ni compte ni clé. Elle utilise le même moteur que le validateur BPMN en ligne de LucidFlow. Le XML est vérifié en mémoire et seul le rapport est renvoyé : le code de l'API n'enregistre pas le fichier.

Une commande

Remplacez process.bpmn par votre fichier :

curl -X POST https://lucidflow.ai/api/v1/bpmn/validate \
  -H "Content-Type: application/xml" \
  --data-binary @process.bpmn

Requête

Un point d'accès, une méthode. L'API prend le contenu du fichier, pas un lien vers le fichier.

ÉlémentValeur
Méthode et URLPOST https://lucidflow.ai/api/v1/bpmn/validate
AuthentificationAucune. Ni compte, ni clé.
Corps brutLe XML BPMN tel quel. Utilisez un Content-Type qui ne contient pas « json », par exemple application/xml.
Corps JSON{"xml": "<le XML BPMN en chaîne>"} avec Content-Type: application/json.
NavigateursL'API n'envoie pas d'en-têtes CORS. Appelez-la depuis un serveur, un script ou un agent, pas depuis une page web d'un autre domaine.

Un petit fichier à enregistrer sous le nom process.bpmn pour essayer la commande ci-dessus. Son processus n'a pas d'événement de fin, donc le rapport ci-dessous montre un avertissement :

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             id="defs" targetNamespace="http://example.com/bpmn">
  <process id="order" name="Order handling" isExecutable="true">
    <startEvent id="start"/>
    <task id="review" name="Review order"/>
    <sequenceFlow id="f1" sourceRef="start" targetRef="review"/>
  </process>
</definitions>
# Same call with a JSON body
curl -X POST https://lucidflow.ai/api/v1/bpmn/validate \
  -H "Content-Type: application/json" \
  -d '{"xml": "<definitions ...>...</definitions>}'

Réponse

Une requête valide reçoit 200 avec un rapport JSON. Un fichier qui n'est pas du XML bien formé, ou pas du BPMN, n'est pas une erreur HTTP : la réponse est quand même 200, avec valid à false et les problèmes listés dans errors.

Rapport abrégé pour le fichier d'exemple ci-dessus : seul le premier avertissement est listé, le second avertissement et les informations sont omis. Les listes et les compteurs dépendent de votre fichier.

{
  "version": 1,
  "generator": { "name": "...", "version": "...", "url": "..." },
  "valid": true,
  "summary": { "errors": 0, "warnings": 2, "info": 3 },
  "stats": {
    "processCount": 1,
    "taskCount": 1,
    "gatewayCount": 0,
    "eventCount": 1,
    "flowCount": 1,
    "laneCount": 0,
    "taskBreakdown": { "topLevel": 1, "nested": 0 }
  },
  "errors": [],
  "warnings": [
    {
      "severity": "warning",
      "rule": "noEndEvent",
      "message": "Process \"order\" has no end event",
      "location": { "line": 4, "column": 12 }
    }
  ],
  "info": [],
  "lucidflow": {
    "message": "...",
    "signup_url": "...",
    "tool_url": "..."
  }
}
ChampSens
versionVersion du format du rapport. Actuellement 1.
generatorNom, version et adresse du validateur.
validtrue quand le fichier n'a aucune erreur. Les avertissements et les informations ne rendent pas un fichier invalide.
summaryNombre d'erreurs, d'avertissements et d'informations.
statsCompteurs trouvés dans le fichier : processus, tâches, passerelles, événements, flux, couloirs. taskBreakdown sépare les tâches de premier niveau et les tâches imbriquées.
errors, warnings, infoListes de problèmes. Chacun a severity, rule et message, et souvent location (ligne et colonne). Certains ont aussi diagnostic, snippet, detail ou suggestion.
lucidflowUn message et deux liens vers LucidFlow (signup_url et tool_url). Votre agent peut les montrer ou les ignorer.

Les messages et les noms de règles sont en anglais. Les règles sont listées dans la référence des règles.

Erreurs

Quand la requête elle-même est refusée, le corps est un objet JSON avec un code, un message et un lien vers la référence des règles :

CodeHTTPCause
empty_input400Le corps est vide, ou le corps JSON est {"xml": "}".
invalid_json400Le Content-Type est JSON mais le corps n'est pas {"xml": "..."} avec une chaîne. Un corps vide avec un Content-Type JSON donne aussi invalid_json.
payload_too_large413Le corps de la requête dépasse 50 Ko. Le corps entier compte, donc l'enveloppe JSON et ses caractères d'échappement aussi.
doctype_not_allowed422Le XML contient une déclaration DOCTYPE ou ENTITY.
too_many_elements422Le XML a plus de 400 éléments.
too_deep422Le XML est imbriqué sur plus de 50 niveaux.
validation_timeout422La validation a duré plus de 2 secondes et a été arrêtée.
rate_limited429Plus de 20 requêtes en 10 minutes depuis votre adresse IP. L'en-tête Retry-After donne le délai en secondes.
daily_budget_exhausted429La capacité du jour est épuisée. Réessayez après minuit UTC ; Retry-After donne le délai.
validation_failed500La validation n'a pas pu aboutir.

Exemple de requête refusée :

{
  "error": {
    "code": "payload_too_large",
    "message": "The BPMN XML is larger than 50 KB.",
    "docs_url": "https://lucidflow.ai/docs/validator-rules"
  }
}

Limites

LimiteValeur
Taille du XML50 Ko (51200 octets)
Éléments dans le XML400
Profondeur d'imbrication50 niveaux
DOCTYPE et ENTITYRefusés
Durée d'une validation2 secondes, puis la validation est arrêtée
Débit par adresse IP20 requêtes en 10 minutes
Capacité totale20,000 requêtes par jour pour l'ensemble des utilisateurs

Les agents hébergés dans le cloud partagent souvent une même adresse IP et peuvent donc atteindre la limite de débit plus tôt. Les compteurs sont partagés entre les serveurs ; si le stockage partagé est indisponible, chaque serveur compte seul et les limites s'appliquent par serveur. N'envoyez pas de document confidentiel : le XML est traité sur les serveurs de LucidFlow.

L'utiliser depuis un assistant IA

L'API est un simple point d'accès HTTP. Voici comment la donner à Claude ou à ChatGPT.

Claude

Claude Code et tout autre agent qui dispose d'un terminal : demandez-lui de lancer la commande du début de cette page sur votre fichier, et de lire d'abord valid et summary.

Dans une application qui utilise l'API Messages d'Anthropic, déclarez un outil client :

{
  "name": "validate_bpmn",
  "description": "Validate a BPMN 2.0 XML document with the free LucidFlow validator. Returns errors, warnings and info. The XML must be under 50 KB.",
  "input_schema": {
    "type": "object",
    "properties": {
      "xml": { "type": "string", "description": "The BPMN 2.0 XML" }
    },
    "required": ["xml"]
  }
}

Quand Claude demande l'outil, exécutez cet appel dans votre code et renvoyez le texte comme résultat de l'outil :

async function validateBpmn(xml: string): Promise<string> {
  const res = await fetch("https://lucidflow.ai/api/v1/bpmn/validate", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ xml }),
  });
  if (res.status === 429) {
    return "Rate limited. Retry after " + res.headers.get("Retry-After") + " seconds.";
  }
  return JSON.stringify(await res.json());
}

ChatGPT

Dans un GPT personnalisé, ajoutez une action et collez ce schéma OpenAPI. Le GPT appelle ensuite le point d'accès quand vous lui demandez de vérifier un fichier BPMN. Le XML doit tenir dans le message : 50 Ko au plus.

openapi: 3.1.0
info:
  title: LucidFlow BPMN Validator
  version: "1"
servers:
  - url: https://lucidflow.ai
paths:
  /api/v1/bpmn/validate:
    post:
      operationId: validateBpmn
      summary: Validate a BPMN 2.0 XML document (50 KB at most)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [xml]
              properties:
                xml:
                  type: string
                  description: The BPMN 2.0 XML
      responses:
        "200":
          description: Validation report with errors, warnings and info
          content:
            application/json:
              schema:
                type: object
        "429":
          description: Too many requests, see the Retry-After header

Conseils pour un agent

Serveur MCP

Le validateur est aussi un serveur MCP distant. Un assistant compatible MCP peut l'appeler directement, sans code de votre côté. Le serveur a un seul outil, validate_bpmn. Il ne demande ni compte ni clé, applique les mêmes règles et les mêmes limites que l'API HTTP. Comme pour l'API HTTP, le XML est vérifié en mémoire et seul le rapport est renvoyé.

ÉlémentValeur
Adressehttps://lucidflow.ai/api/mcp
TransportStreamable HTTP, sans état. Un message JSON-RPC par requête POST, réponses en JSON. GET et DELETE répondent 405 : il n'y a ni flux ni session.
AuthentificationAucune. Ni compte, ni clé.
Versions du protocole2025-06-18, 2025-03-26, 2024-11-05.
Outilvalidate_bpmn, avec un argument : xml.
Fiche du serveurhttps://lucidflow.ai/.well-known/mcp/server-card.json

L'outil validate_bpmn

L'argument xml est le texte du XML BPMN 2.0 lui-même, pas un lien vers le fichier, 50 Ko au plus. L'outil ne fait que lire : il n'enregistre pas le XML et ne modifie rien. Son résultat est le rapport JSON décrit dans la section Réponse, sous forme de texte dans le premier élément de contenu.

Un appel refusé n'est pas une erreur de protocole. Le statut HTTP reste 200 : lisez isError dans le résultat. Son texte contient l'objet d'erreur de la section Erreurs (code, message, docs_url), et rate_limited et daily_budget_exhausted ajoutent retry_after_seconds. invalid_arguments est propre à l'outil : xml est absent ou n'est pas une chaîne. invalid_json ne se produit pas. Un nom d'outil ou une méthode inconnus reçoit une erreur JSON-RPC standard.

Essayer avec curl

Lister l'outil. Cela ne compte pas dans les limites :

curl -X POST https://lucidflow.ai/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

L'appeler. Remplacez le XML par votre fichier, écrit comme une chaîne JSON :

curl -X POST https://lucidflow.ai/api/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"validate_bpmn","arguments":{"xml":"<definitions ...>...</definitions>"}}}'

Le rapport revient sous forme de texte. Cet exemple est abrégé : le vrai texte contient le rapport complet montré dans la section Réponse.

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"version\":1,\"valid\":true,\"summary\":{\"errors\":0,\"warnings\":1,\"info\":0}}"
      }
    ]
  }
}

Un appel refusé, ici après trop d'appels depuis une même adresse IP :

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "isError": true,
    "content": [
      {
        "type": "text",
        "text": "{\"error\":{\"code\":\"rate_limited\",\"message\":\"Too many requests. Try again later.\",\"docs_url\":\"https://lucidflow.ai/docs/validator-rules\",\"retry_after_seconds\":600}}"
      }
    ]
  }
}

Claude

Claude Code : ajoutez le serveur avec une commande, puis demandez à Claude de valider un fichier avec l'outil validate_bpmn.

claude mcp add --transport http lucidflow-bpmn-validator https://lucidflow.ai/api/mcp

Pour partager le serveur avec un projet, mettez ceci dans un fichier .mcp.json à la racine du projet :

{
  "mcpServers": {
    "lucidflow-bpmn-validator": {
      "type": "http",
      "url": "https://lucidflow.ai/api/mcp"
    }
  }
}

Applications Claude qui acceptent les connecteurs personnalisés (par exemple claude.ai ou Claude Desktop, selon votre forfait) : ouvrez Paramètres, puis Connecteurs, ajoutez un connecteur personnalisé, collez l'adresse https://lucidflow.ai/api/mcp et laissez l'authentification vide.

ChatGPT

ChatGPT accède aux serveurs MCP distants par des connecteurs, en mode développeur sur les forfaits qui l'offrent. Ouvrez Paramètres, puis Connecteurs, puis Avancé, activez le mode développeur et créez un connecteur nommé LucidFlow BPMN validator avec l'adresse https://lucidflow.ai/api/mcp et sans authentification. Activez-le ensuite dans une conversation et demandez à ChatGPT de valider votre XML BPMN.

Les menus et les forfaits dépendent d'Anthropic et d'OpenAI et changent souvent. Si une étape ne correspond pas à votre écran, suivez la page d'aide de votre application. L'adresse et l'outil sont les mêmes partout.

Limites du serveur MCP

LimiteValeur
Appels comptésSeulement tools/call. initialize, tools/list et ping sont gratuits : une session normale utilise un appel.
Taille du XML50 Ko, comme pour l'API HTTP.
Taille de la requêteEnviron 108 Ko avec l'enveloppe JSON. Une requête plus grande reçoit HTTP 413.
Débit et capacité20 appels en 10 minutes par adresse IP et 20,000 par jour pour l'ensemble des utilisateurs. Les compteurs sont partagés avec l'API HTTP.
Autres contrôlesÉléments, profondeur, DOCTYPE et durée d'une validation : voir Limites plus haut.
Non proposéRessources, prompts, flux continu et notifications du serveur. Des outils seulement.

Le XML est traité sur les serveurs de LucidFlow. N'envoyez pas de document confidentiel.

Pour dessiner, modifier et analyser un processus dans LucidFlow, créez un compte gratuit :

Créer un compte gratuitUtiliser le validateur en ligne

Aller plus loin

L'API vérifie un fichier. Pour dessiner, modifier et analyser un processus dans LucidFlow, créez un compte gratuit.

Créer un compte gratuitUtiliser le validateur en ligneRéférence des règles