AZComply Référence API
L'API AZComply vous donne un accès programmatique au seul moteur de classification EU AI Act déterministe au monde. Intégrez la détection des risques réglementaires directement dans vos pipelines CI/CD, vos workflows de conformité ou vos applications d'entreprise.
Deux niveaux : POST /v1/classify exécute le moteur Python pur en moins de 100 ms sans crédits ni LLM. POST /v1/assess exécute le pipeline LLM complet à 9 personas de manière asynchrone pour l'analyse narrative, les plans d'action et les rapports prêts pour PDF (1 crédit par évaluation).
/v1/classify
Synchrone · Gratuit · <100 ms · Moteur uniquement
/v1/assess
Asynchrone · 1 crédit · ~60 s · Pipeline complet
Clés API
az_live_* / az_test_* · SHA-256 stocké
URL de base
Toutes les requêtes doivent utiliser HTTPS. Les connexions HTTP seront refusées.
Gestion des versions
L'API est versionnée via le chemin URL (/v1/). Les changements incompatibles seront publiés sous un nouveau préfixe de version (par ex. /v2/) avec un préavis de 12 mois. La version du moteur EU AI Act est renvoyée dans chaque réponse en tant que engine_version.
Authentification
L'API AZComply utilise des clés API pour l'authentification. Incluez votre clé dans chaque requête à l'aide de l'en-tête HTTP X-API-Key.
Types de clés
| Préfixe | Type | Comportement |
|---|---|---|
az_live_* | Production | Classification réelle, consomme des crédits sur /v1/assess |
az_test_* | Bac à sable | Sans LLM, sans crédits. /v1/assess retourne instantanément un résultat simulé déterministe |
Mode bac à sable
Utilisez les clés az_test_* dans votre environnement de développement et CI/CD. Les appels à POST /v1/assess renvoient immédiatement un résultat déterministe (pas de LLM, pas de tâche en arrière-plan, aucun coût en crédits). L'indicateur sandbox: true est toujours présent dans les réponses bac à sable.
Démarrage rapide
Effectuez votre premier appel API en moins de 2 minutes.
1. Créer une clé
Accédez au Tableau de bord → Clés API et cliquez sur Créer une clé. La clé complète est affichée une seule fois — enregistrez-la dans votre gestionnaire de secrets (AWS Secrets Manager, GitHub Secrets, Vault, etc.).
2. Effectuer votre premier appel
Classifiez la description d'un système IA. Aucun crédit consommé.
curl -X POST https://api.azcomply.eu/v1/classify \
-H "X-API-Key: az_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "AI system that automatically ranks job applicants by scoring their CVs before human review",
"jurisdictions": ["FR"]
}'3. Interpréter la réponse
{
"risk_code": "HIGH_RISK",
"ci_status": "block",
"gate_pass": false,
"verdict": {
"classification": "HIGH",
"obligations_count": 9,
"fine_exposure": "€15,000,000 or 3% of global annual turnover"
},
"compliance_deadline": "2027-12-02",
"engine_version": "current",
"classified_at": "2026-03-25T14:30:00Z"
}POST /v1/classify
/v1/classifyClassification déterministe · Sans crédits · <100 ms
Classifie un système IA selon l'EU AI Act 2024/1689 à l'aide du moteur Python déterministe. Zéro coût LLM. Renvoie le niveau de risque, le nombre d'obligations, l'exigence FRIA, l'exposition aux amendes et l'échéance de conformité en moins de 100 ms.
classify (inclus sur toutes les clés par défaut). Cet endpoint est gratuit — le moteur est en Python pur et ne coûte rien à exécuter.Corps de la requête
Deux modes de saisie — fournissez soit description (texte libre), soit facts (structuré).
Mode A — Texte libre
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
description | string | Obligatoire | Plain-text description of the AI system (10–14,000 chars)e.g. "CV ranking AI used in HR" |
system_name | string | Facultatif | Human-readable name for the systeme.g. "HireBot v2" |
jurisdictions | string[] | Facultatif | ISO-2 country codes. Loads national law context.e.g. ["FR", "BE"] |
Mode B — Faits structurés
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
facts | object | Obligatoire | Pre-structured SystemFacts fields. Useful for CI/CD where you know the system properties.e.g. {"is_hr_tool": true, "operator_role": "DEPLOYER"} |
Réponse
curl -X POST https://api.azcomply.eu/v1/classify \
-H "X-API-Key: az_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "AI system that automatically ranks job applicants by scoring their CVs before human review",
"jurisdictions": ["FR"]
}'{
"risk_code": "HIGH_RISK",
"ci_status": "block",
"gate_pass": false,
"verdict": {
"classification": "HIGH",
"obligations_count": 9,
"fine_exposure": "€15,000,000 or 3% of global annual turnover"
},
"compliance_deadline": "2027-12-02",
"engine_version": "current",
"classified_at": "2026-03-25T14:30:00Z"
}Champs de réponse
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
risk_level | string | Obligatoire | PROHIBITED | HIGH_RISK | LIMITED_RISK | MINIMAL_RISK | GPAI | GPAI_SYSTEMIC | UNCODED |
operator_role | string | Obligatoire | PROVIDER | DEPLOYER | IMPORTER | DISTRIBUTOR |
annex_iii_category | string | null | Obligatoire | Matched Annex III category if HIGH_RISK, e.g. "Employment & HR — Annex III §4(a)" |
obligations_count | integer | Obligatoire | Number of EU AI Act obligations applicable to this system |
fria_required | boolean | Obligatoire | Whether a Fundamental Rights Impact Assessment is required (Art. 27) |
national_law_flags | string[] | Obligatoire | National law indicators detected, e.g. ["CAO_39_BE", "CNIL_FR"] |
compliance_deadline | string | null | Obligatoire | ISO 8601 date of applicable compliance deadline |
fine_exposure | object | Obligatoire | { max_tier: string, max_eur: integer } — maximum fine under EU AI Act |
gate_pass | boolean | Obligatoire | True only if no obligations detected (MINIMAL_RISK with no flags) |
engine_version | string | Obligatoire | Classification engine version from /v1/systems/engine-info |
sandbox | boolean | Obligatoire | True if request was made with an az_test_* key |
Mode structuré (CI/CD)
Transmettez les propriétés du système pré-extraites sous forme de faits structurés pour des résultats déterministes dans les pipelines automatisés :
curl -X POST https://api.azcomply.eu/v1/classify \
-H "X-API-Key: az_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"facts": {
"system_name": "CV Ranking Engine",
"system_description": "Scores and ranks job applicants",
"operator_role": "DEPLOYER",
"jurisdictions": ["FR"],
"is_hr_tool": true,
"employee_count": 250,
"uses_gpai_model": false
}
}'POST /v1/assess
/v1/assessPipeline LLM complet à 9 personas · 1 crédit · ~60 s · Async 202
Exécute le pipeline d'évaluation complet : extraction des faits, classification déterministe, 9 personas LLM (critique logique, conseiller FRIA, architecte du plan d'action, rédacteur de rapport, etc.) et renvoie un récit complet avec plan d'action. Retourne immédiatement 202 Accepted avec un job_id.
assess (non inclus par défaut — activez-le lors de la création de votre clé). Coût: 1 crédit, déduit uniquement après la réussite du pipeline.Corps de la requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
description | string | Obligatoire | Plain-text description of the AI system (20–14,000 chars) |
language | string | Facultatif | Report language: en, fr, nl, de, it, es. Default: en |
jurisdictions | string[] | Facultatif | ISO-2 country codes for national law context |
webhook_url | string | Facultatif | HTTPS URL to receive classification.completed / classification.failed events |
webhook_secret | string | Facultatif | Secret for HMAC-SHA256 signature verification |
curl -X POST https://api.azcomply.eu/v1/assess \
-H "X-API-Key: az_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Document describing our AI-powered credit scoring system...",
"language": "en",
"jurisdictions": ["BE"],
"webhook_url": "https://hooks.yourcompany.com/azcomply",
"webhook_secret": "your-webhook-secret"
}'{
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "queued",
"poll_url": "/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"estimated_seconds": 60
}Interrogation de tâche
docs.assess.pollingDesc L'en-tête Retry-After indique l'intervalle d'interrogation recommandé.
# Poll for completion (every 5 seconds)
curl https://api.azcomply.eu/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6 \
-H "X-API-Key: az_live_YOUR_KEY"
# Fetch result once status == "completed"
curl https://api.azcomply.eu/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6/result \
-H "X-API-Key: az_live_YOUR_KEY"| Statut | Signification | Action |
|---|---|---|
queued | Tâche reçue, en attente d'un worker | Attendez, réinterrogez |
processing | Pipeline en cours (personas LLM actives) | Attendez, réinterrogez |
completed | Toutes les étapes terminées, résultat disponible | Récupérez /result |
failed | Erreur de pipeline — le champ error contient les détails | Vérifiez l'erreur, réessayez |
Résultat
Lorsque status === completed, récupérez le résultat complet :
/v1/jobs/{job_id}/resultRenvoie le rapport JSON complet lorsque la tâche est terminée
{
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"risk_level": "HIGH_RISK",
"operator_role": "DEPLOYER",
"obligations_count": 11,
"fria_required": true,
"national_law_flags": ["CAO_39_BE", "CAO_9_BE"],
"compliance_deadline": "2027-12-02",
"fine_exposure": { "max_tier": "TIER_2_HIGH_RISK", "max_eur": 15000000 },
"gate_pass": false,
"validation_score": 94,
"fallacy_flags": [],
"bias_flags": [],
"fria_analysis": "A Fundamental Rights Impact Assessment is required under Art. 27...",
"action_plan": "Phase 1 (0–3 months): Establish AI governance framework...",
"narrative": "This credit scoring system presents significant regulatory risk...",
"completed_at": "2026-03-25T14:31:03Z"
}POST /v1/workpapers
/v1/workpapersWorkpaper Markdown payant · 1 crédit · Async 202 · Transport API/MCP
Génère un workpaper Markdown de qualité payante pour les clients API sans interface et les agents MCP. Il utilise le même flux d'extraction QAE hébergée, de classification déterministe, de réservation de crédit, d'interrogation des tâches et de conservation des résultats que le parcours de rapport API payant, mais renvoie un résultat de tâche lisible par machine contenant du markdown au lieu d'un artefact de rapport PDF.
assess. Coût: 1 crédit, finalisé uniquement après la réussite du workpaper. Utilisez Idempotency-Key lors des nouvelles tentatives pour éviter les réservations en double.Corps de la requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
description | string | Obligatoire | Plain-text description of the AI system (20-14,000 chars) |
system_name | string | Facultatif | Display name used in the generated workpaper |
jurisdictions | string[] | Facultatif | ISO-2 country codes for national law context |
brief_scope | auto | single | composite | portfolio | Facultatif | Use composite for independently operable component suites |
components | object[] | Facultatif | Component boundaries for composite-system workpapers |
include_coverage_overlay | boolean | Facultatif | Adds deterministic coverage matrix rows |
curl -X POST https://api.azcomply.eu/v1/workpapers \
-H "X-API-Key: az_live_YOUR_KEY" \
-H "Idempotency-Key: hospital-suite-2026-05-30" \
-H "Content-Type: application/json" \
-d '{
"system_name": "Hospital Operations Suite",
"description": "Integrated hospital AI suite with triage, scheduling, diagnostics, kiosk, and facilities components...",
"jurisdictions": ["BE"],
"brief_scope": "composite",
"components": [
{ "name": "Patient Triage", "description": "Assigns urgency scores and appointment priority" }
]
}'{
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"status": "queued",
"poll_url": "/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6",
"estimated_seconds": 60
}Résultat
docs.workpapers.resultDesc
Webhooks
Configurez une URL de webhook sur POST /v1/assess pour recevoir des notifications en temps réel lorsqu'une évaluation se termine ou échoue. AZComply signe chaque livraison avec HMAC-SHA256 — vérifiez toujours la signature avant de traiter.
Événements
| Événement | Quand | champs de données |
|---|---|---|
classification.completed | Pipeline réussi | job_id, risk_level, obligations_count, fria_required, compliance_deadline |
classification.failed | Pipeline échoué (crédit libéré) | job_id, error |
En-têtes sur chaque livraison
Vérifier la signature
Vérifiez toujours l'en-tête X-AZComply-Signature avant de traiter les charges utiles de webhook.
import hmac, hashlib, json
def verify_azcomply_signature(
body: bytes,
signature_header: str,
secret: str,
) -> bool:
"""
Verify X-AZComply-Signature header on incoming webhook.
signature_header looks like: sha256=<hex_digest>
"""
expected = "sha256=" + hmac.new(
key=secret.encode(),
msg=body,
digestmod=hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature_header)
# Flask example
from flask import Flask, request, abort
app = Flask(__name__)
WEBHOOK_SECRET = "your-webhook-secret"
@app.route("/webhook", methods=["POST"])
def handle_webhook():
sig = request.headers.get("X-AZComply-Signature", "")
if not verify_azcomply_signature(request.data, sig, WEBHOOK_SECRET):
abort(401)
payload = request.get_json()
event = payload["event"] # "classification.completed"
job_id = payload["data"]["job_id"]
risk_level = payload["data"]["risk_level"]
# ... handle event
return "", 200Logique de réessai
AZComply réessaie les livraisons échouées jusqu'à 3 fois avec un backoff exponentiel : 2 s → 4 s → 8 s. Après 3 tentatives échouées, l'événement est abandonné — vérifiez la disponibilité de votre endpoint. Les réponses 4xx ne font pas l'objet de réessais (traitez-les comme des échecs permanents de votre côté).
Gestion des clés
Gérez les clés API via l'API REST ou le Tableau de bord. Les endpoints de gestion des clés utilisent l'authentification JWT bearer (votre token de session utilisateur) — et non l'authentification par clé API.
Créer une clé
/v1/keysAuth JWT · Crée une clé · Clé brute retournée UNE SEULE FOIS
curl -X POST https://api.azcomply.eu/v1/keys \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "CI/CD Pipeline",
"scopes": ["classify", "assess"],
"sandbox": false
}'
# Response (key shown ONCE — store it now):
{
"key_id": "...",
"raw_key": "az_live_FULL_KEY_SHOWN_ONCE_STORE_NOW",
"key_prefix": "az_live_abcd...",
"name": "CI/CD Pipeline",
"scopes": ["classify", "assess"],
"sandbox": false,
"created_at": "2026-03-25T14:00:00Z",
"warning": "Store this key securely. It will not be shown again."
}Lister les clés
/v1/keysAuth JWT · Retourne toutes les clés de votre compte
curl https://api.azcomply.eu/v1/keys \
-H "Authorization: Bearer YOUR_JWT_TOKEN"Révoquer une clé
/v1/keys/{key_id}Auth JWT · Révocation immédiate · Idempotent
curl -X DELETE https://api.azcomply.eu/v1/keys/KEY_ID \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# Returns 204 No ContentErreurs
| Code | Nom | Signification |
|---|---|---|
| 200 | OK | Request succeeded |
| 201 | Created | Resource created (POST /v1/keys) |
| 202 | Accepted | Job queued (POST /v1/assess) |
| 401 | Unauthorized | Missing, invalid, or revoked API key |
| 402 | Payment Required | Insufficient credits for /v1/assess |
| 403 | Forbidden | Key exists but lacks required scope |
| 404 | Not Found | Job ID not found or belongs to different key |
| 409 | Conflict | Job failed — error field contains details |
| 410 | Gone | Job expired (results retained 7 days) |
| 422 | Unprocessable | Validation error — missing required fields |
| 425 | Too Early | Job result not yet ready — retry after Retry-After seconds |
| 429 | Too Many Requests | Daily rate limit exceeded — see X-RateLimit-* headers |
| 500 | Server Error | Internal error — transient, retry with backoff |
Format d'erreur
Toutes les erreurs retournent un corps JSON avec un champ detail :
// 401 Unauthorized
{
"detail": "Invalid or revoked API key."
}
// 402 Payment Required
{
"detail": "Insufficient credits. Purchase more at https://azcomply.eu/pricing"
}
// 422 Validation Error
{
"detail": "Provide either 'description' (free-text) or 'facts' (structured dict)."
}
// 429 Rate Limit
{
"detail": "Daily rate limit of 500 calls exceeded. Resets at midnight UTC.",
// Headers also set:
// Retry-After: 3600
// X-RateLimit-Limit: 500
// X-RateLimit-Remaining: 0
}Limites de débit
Les limites de débit sont par clé API, réinitialisées quotidiennement à 00:00 UTC. La limite par défaut est de 500 appels/jour. Les compteurs mensuels se réinitialisent le 1er de chaque mois.
| Endpoint | Limite quotidienne par défaut | Notes |
|---|---|---|
POST /v1/classify | 500 / key / day | Gratuit, moteur uniquement. Aucun coût en crédits. |
POST /v1/assess | 500 / key / day | Également limité par les crédits. La limite la plus basse s'applique. |
GET /v1/jobs/* | 500 / key / day | Interrogez à intervalles de ≤5 secondes. |
En-têtes de limite de débit
Chaque réponse inclut ces en-têtes :
Stratégie de backoff
Si vous recevez un 429, attendez le nombre de secondes indiqué dans l'en-tête Retry-After avant de réessayer.
import time, requests
def classify_with_backoff(description: str, api_key: str) -> dict:
for attempt in range(3):
r = requests.post(
"https://api.azcomply.eu/v1/classify",
headers={"X-API-Key": api_key},
json={"description": description},
)
if r.status_code == 429:
wait = int(r.headers.get("Retry-After", 60))
print(f"Rate limited. Retrying in {wait}s...")
time.sleep(wait)
continue
r.raise_for_status()
return r.json()
raise Exception("Rate limit exceeded after 3 attempts")Moteur current · UE 2024/1689 · Résidence des données RGPD : europe-west4
© 2026 AZComply — Outil de détection, pas un conseil juridique.