Skip to main content
AZComply Référence API
v1Dernière mise à jour 2026-03-25

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

https://api.azcomply.eu/v1

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.

X-API-Key: az_live_YOUR_SECRET_KEY
⚠️
Gardez votre clé API secrète. Ne l'exposez jamais dans du code côté client, des dépôts publics ou des journaux. En cas de compromission, révoquez-la immédiatement dans le Tableau de bord → Clés API.

Types de clés

PréfixeTypeComportement
az_live_*ProductionClassification réelle, consomme des crédits sur /v1/assess
az_test_*Bac à sableSans 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

Réponse · JSON
{
  "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"
}
gate_pass: false indique que le système a des obligations non satisfaitesutilisez obligations_count et fine_exposure pour prioriser la remédiation. Exécutez POST /v1/assess pour obtenir le récit complet du plan d'action.

POST /v1/classify

POST
/v1/classify

Classification 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.

💡
Portée requise: 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ètreTypeObligatoireDescription
descriptionstringObligatoirePlain-text description of the AI system (10–14,000 chars)e.g. "CV ranking AI used in HR"
system_namestringFacultatifHuman-readable name for the systeme.g. "HireBot v2"
jurisdictionsstring[]FacultatifISO-2 country codes. Loads national law context.e.g. ["FR", "BE"]

Mode B — Faits structurés

ParamètreTypeObligatoireDescription
factsobjectObligatoirePre-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"]
  }'
Réponse · JSON
{
  "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ètreTypeObligatoireDescription
risk_levelstringObligatoirePROHIBITED | HIGH_RISK | LIMITED_RISK | MINIMAL_RISK | GPAI | GPAI_SYSTEMIC | UNCODED
operator_rolestringObligatoirePROVIDER | DEPLOYER | IMPORTER | DISTRIBUTOR
annex_iii_categorystring | nullObligatoireMatched Annex III category if HIGH_RISK, e.g. "Employment & HR — Annex III §4(a)"
obligations_countintegerObligatoireNumber of EU AI Act obligations applicable to this system
fria_requiredbooleanObligatoireWhether a Fundamental Rights Impact Assessment is required (Art. 27)
national_law_flagsstring[]ObligatoireNational law indicators detected, e.g. ["CAO_39_BE", "CNIL_FR"]
compliance_deadlinestring | nullObligatoireISO 8601 date of applicable compliance deadline
fine_exposureobjectObligatoire{ max_tier: string, max_eur: integer } — maximum fine under EU AI Act
gate_passbooleanObligatoireTrue only if no obligations detected (MINIMAL_RISK with no flags)
engine_versionstringObligatoireClassification engine version from /v1/systems/engine-info
sandboxbooleanObligatoireTrue 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

POST
/v1/assess

Pipeline 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.

💡
Portée requise: 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ètreTypeObligatoireDescription
descriptionstringObligatoirePlain-text description of the AI system (20–14,000 chars)
languagestringFacultatifReport language: en, fr, nl, de, it, es. Default: en
jurisdictionsstring[]FacultatifISO-2 country codes for national law context
webhook_urlstringFacultatifHTTPS URL to receive classification.completed / classification.failed events
webhook_secretstringFacultatifSecret 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"
  }'
Réponse · JSON
{
  "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"
StatutSignificationAction
queuedTâche reçue, en attente d'un workerAttendez, réinterrogez
processingPipeline en cours (personas LLM actives)Attendez, réinterrogez
completedToutes les étapes terminées, résultat disponibleRécupérez /result
failedErreur de pipeline — le champ error contient les détailsVérifiez l'erreur, réessayez

Résultat

Lorsque status === completed, récupérez le résultat complet :

GET
/v1/jobs/{job_id}/result

Renvoie le rapport JSON complet lorsque la tâche est terminée

Réponse · JSON
{
  "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

POST
/v1/workpapers

Workpaper 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.

💡
Portée requise: 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ètreTypeObligatoireDescription
descriptionstringObligatoirePlain-text description of the AI system (20-14,000 chars)
system_namestringFacultatifDisplay name used in the generated workpaper
jurisdictionsstring[]FacultatifISO-2 country codes for national law context
brief_scopeauto | single | composite | portfolioFacultatifUse composite for independently operable component suites
componentsobject[]FacultatifComponent boundaries for composite-system workpapers
include_coverage_overlaybooleanFacultatifAdds 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" }
    ]
  }'
Réponse · JSON
{
  "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énementQuandchamps de données
classification.completedPipeline réussijob_id, risk_level, obligations_count, fria_required, compliance_deadline
classification.failedPipeline échoué (crédit libéré)job_id, error

En-têtes sur chaque livraison

X-AZComply-Signature: sha256=<HMAC-SHA256(body, secret)>
X-AZComply-Event: classification.completed
X-AZComply-Timestamp: 1711365000
Content-Type: application/json

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 "", 200

Logique 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é).

⚠️
Votre endpoint doit répondre dans 10 secondes. Retournez 200 immédiatement et traitez la charge utile de manière asynchrone — n'effectuez jamais d'opérations lentes de manière synchrone dans le gestionnaire de webhook.

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é

POST
/v1/keys

Auth JWT · Crée une clé · Clé brute retournée UNE SEULE FOIS

⚠️
La clé brute n'est renvoyée qu'une seule fois dans la réponse de création et n'est jamais stockée. Enregistrez-la immédiatement dans un gestionnaire de secrets — elle ne peut pas être récupérée à nouveau.
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

GET
/v1/keys

Auth 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é

DELETE
/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 Content

Erreurs

CodeNomSignification
200OKRequest succeeded
201CreatedResource created (POST /v1/keys)
202AcceptedJob queued (POST /v1/assess)
401UnauthorizedMissing, invalid, or revoked API key
402Payment RequiredInsufficient credits for /v1/assess
403ForbiddenKey exists but lacks required scope
404Not FoundJob ID not found or belongs to different key
409ConflictJob failed — error field contains details
410GoneJob expired (results retained 7 days)
422UnprocessableValidation error — missing required fields
425Too EarlyJob result not yet ready — retry after Retry-After seconds
429Too Many RequestsDaily rate limit exceeded — see X-RateLimit-* headers
500Server ErrorInternal error — transient, retry with backoff

Format d'erreur

Toutes les erreurs retournent un corps JSON avec un champ detail :

Réponse · JSON
// 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.

EndpointLimite quotidienne par défautNotes
POST /v1/classify500 / key / dayGratuit, moteur uniquement. Aucun coût en crédits.
POST /v1/assess500 / key / dayÉgalement limité par les crédits. La limite la plus basse s'applique.
GET /v1/jobs/*500 / key / dayInterrogez à intervalles de ≤5 secondes.

En-têtes de limite de débit

Chaque réponse inclut ces en-têtes :

X-RateLimit-Limit: 500
X-RateLimit-Remaining: 342
Retry-After: 3600 # only on 429

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.

API Reference - AZComply