Skip to main content
AZComply Referencia API
v1Última actualización 2026-03-25

AZComply Referencia API

La API de AZComply le proporciona acceso programático al único motor de clasificación determinista del Reglamento IA de la UE del mundo. Integre la detección de riesgos regulatorios directamente en sus pipelines CI/CD, flujos de trabajo de cumplimiento o aplicaciones empresariales.

Dos niveles: POST /v1/classify ejecuta el motor Python puro en <100 ms sin créditos ni LLM. POST /v1/assess ejecuta la pipeline LLM completa de 9 personas de forma asíncrona para análisis narrativo, planes de acción e informes listos para PDF (1 crédito por evaluación).

/v1/classify

Síncrono · Gratuito · <100 ms · Solo motor

🔬

/v1/assess

Asíncrono · 1 crédito · ~60 s · Pipeline completa

🔑

Claves API

az_live_* / az_test_* · SHA-256 almacenado

URL base

https://api.azcomply.eu/v1

Todas las solicitudes deben usar HTTPS. Las conexiones HTTP serán rechazadas.

Control de versiones

La API tiene control de versiones mediante la ruta URL (/v1/). Los cambios incompatibles se publicarán bajo un nuevo prefijo de versión (p. ej. /v2/) con un aviso de obsolescencia de 12 meses. La versión del motor del Reglamento IA de la UE se devuelve en cada respuesta como engine_version.

Autenticación

La API de AZComply utiliza claves API para la autenticación. Incluya su clave en cada solicitud mediante la cabecera HTTP X-API-Key.

X-API-Key: az_live_YOUR_SECRET_KEY
⚠️
Mantenga su clave API en secreto. Nunca la exponga en código de cliente, repositorios públicos o registros. Si se ve comprometida, revóquela de inmediato en el Panel → Claves API.

Tipos de clave

PrefijoTipoComportamiento
az_live_*ProducciónClasificación real, consume créditos en /v1/assess
az_test_*SandboxSin LLM, sin créditos. /v1/assess devuelve al instante un resultado simulado determinista

Modo sandbox

Utilice claves az_test_* en su entorno de desarrollo y CI/CD. Las llamadas a POST /v1/assess devuelven de inmediato un resultado determinista (sin LLM, sin trabajo en segundo plano, sin coste de créditos). El indicador sandbox: true siempre está presente en las respuestas de sandbox.

Inicio rápido

Realice su primera llamada a la API en menos de 2 minutos.

1. Crear una clave

Acceda al Panel → Claves API y haga clic en Crear clave. La clave completa se muestra una sola vez — guárdela en su gestor de secretos (AWS Secrets Manager, GitHub Secrets, Vault, etc.).

2. Realizar la primera llamada

Clasifique la descripción de un sistema de IA. Sin créditos consumidos.

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. Interpretar la respuesta

Respuesta · 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 indica que el sistema tiene obligaciones incumplidasuse obligations_count y fine_exposure para priorizar la remediación. Ejecute POST /v1/assess para obtener el relato completo del plan de acción.

POST /v1/classify

POST
/v1/classify

Clasificación determinista · Sin créditos · <100 ms

Clasifica un sistema de IA según el Reglamento IA UE 2024/1689 utilizando el motor Python determinista. Cero coste de LLM. Devuelve el nivel de riesgo, el recuento de obligaciones, el requisito FRIA, la exposición a multas y el plazo de cumplimiento en menos de 100 ms.

💡
Ámbito requerido: classify (incluido en todas las claves por defecto). Este endpoint es gratuito — el motor es Python puro y no cuesta nada ejecutarlo.

Cuerpo de la solicitud

Dos modos de entrada — proporcione description (texto libre) o facts (estructurado).

Modo A — Texto libre

ParámetroTipoObligatorioDescripción
descriptionstringObligatorioPlain-text description of the AI system (10–14,000 chars)e.g. "CV ranking AI used in HR"
system_namestringOpcionalHuman-readable name for the systeme.g. "HireBot v2"
jurisdictionsstring[]OpcionalISO-2 country codes. Loads national law context.e.g. ["FR", "BE"]

Modo B — Hechos estructurados

ParámetroTipoObligatorioDescripción
factsobjectObligatorioPre-structured SystemFacts fields. Useful for CI/CD where you know the system properties.e.g. {"is_hr_tool": true, "operator_role": "DEPLOYER"}

Respuesta

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"]
  }'
Respuesta · 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"
}

Campos de respuesta

ParámetroTipoObligatorioDescripción
risk_levelstringObligatorioPROHIBITED | HIGH_RISK | LIMITED_RISK | MINIMAL_RISK | GPAI | GPAI_SYSTEMIC | UNCODED
operator_rolestringObligatorioPROVIDER | DEPLOYER | IMPORTER | DISTRIBUTOR
annex_iii_categorystring | nullObligatorioMatched Annex III category if HIGH_RISK, e.g. "Employment & HR — Annex III §4(a)"
obligations_countintegerObligatorioNumber of EU AI Act obligations applicable to this system
fria_requiredbooleanObligatorioWhether a Fundamental Rights Impact Assessment is required (Art. 27)
national_law_flagsstring[]ObligatorioNational law indicators detected, e.g. ["CAO_39_BE", "CNIL_FR"]
compliance_deadlinestring | nullObligatorioISO 8601 date of applicable compliance deadline
fine_exposureobjectObligatorio{ max_tier: string, max_eur: integer } — maximum fine under EU AI Act
gate_passbooleanObligatorioTrue only if no obligations detected (MINIMAL_RISK with no flags)
engine_versionstringObligatorioClassification engine version from /v1/systems/engine-info
sandboxbooleanObligatorioTrue if request was made with an az_test_* key

Modo estructurado (CI/CD)

Proporcione las propiedades del sistema preextraídas como hechos estructurados para obtener resultados deterministas en pipelines automatizadas:

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 completa de 9 personas · 1 crédito · ~60 s · Async 202

Ejecuta la pipeline de evaluación completa: extracción de hechos, clasificación determinista, 9 personas LLM (crítico lógico, asesor FRIA, arquitecto del plan de acción, redactor de informes, etc.) y devuelve un narrativo completo con plan de acción. Devuelve de inmediato 202 Accepted con un job_id.

💡
Ámbito requerido: assess (no incluido por defecto — actívelo al crear su clave). Coste: 1 crédito, descontado solo tras la finalización correcta de la pipeline.

Cuerpo de la solicitud

ParámetroTipoObligatorioDescripción
descriptionstringObligatorioPlain-text description of the AI system (20–14,000 chars)
languagestringOpcionalReport language: en, fr, nl, de, it, es. Default: en
jurisdictionsstring[]OpcionalISO-2 country codes for national law context
webhook_urlstringOpcionalHTTPS URL to receive classification.completed / classification.failed events
webhook_secretstringOpcionalSecret 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"
  }'
Respuesta · JSON
{
  "job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "queued",
  "poll_url": "/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "estimated_seconds": 60
}

Sondeo de trabajo

docs.assess.pollingDesc La cabecera Retry-After indica el intervalo de sondeo recomendado.

# 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"
EstadoSignificadoAcción
queuedTrabajo recibido, esperando a un workerEspere, sondee de nuevo
processingPipeline en ejecución (personas LLM activas)Espere, sondee de nuevo
completedTodas las etapas completadas, resultado disponibleObtenga /result
failedError de pipeline — el campo error contiene los detallesCompruebe el error y vuelva a intentarlo

Resultado

Cuando status === completed, obtenga el resultado completo:

GET
/v1/jobs/{job_id}/result

Devuelve el informe JSON completo cuando el trabajo está completado

Respuesta · 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 de pago · 1 crédito · Async 202 · Transporte API/MCP

Genera un workpaper Markdown de calidad de pago para clientes API headless y agentes MCP. Utiliza el mismo flujo de extracción QAE alojada, clasificación determinista, reserva de crédito, sondeo de trabajos y retención de resultados que la ruta de informes API de pago, pero devuelve un resultado de trabajo legible por máquina que contiene markdown en lugar de un artefacto de informe PDF.

💡
Ámbito requerido: assess. Coste: 1 crédito, finalizado solo tras la finalización correcta del workpaper. Utilice Idempotency-Key en los reintentos para evitar reservas duplicadas.

Cuerpo de la solicitud

ParámetroTipoObligatorioDescripción
descriptionstringObligatorioPlain-text description of the AI system (20-14,000 chars)
system_namestringOpcionalDisplay name used in the generated workpaper
jurisdictionsstring[]OpcionalISO-2 country codes for national law context
brief_scopeauto | single | composite | portfolioOpcionalUse composite for independently operable component suites
componentsobject[]OpcionalComponent boundaries for composite-system workpapers
include_coverage_overlaybooleanOpcionalAdds 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" }
    ]
  }'
Respuesta · JSON
{
  "job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "status": "queued",
  "poll_url": "/v1/jobs/3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "estimated_seconds": 60
}

Resultado

docs.workpapers.resultDesc

Webhooks

Configure una URL de webhook en POST /v1/assess para recibir notificaciones en tiempo real cuando una evaluación se complete o falle. AZComply firma cada entrega con HMAC-SHA256 — verifique siempre la firma antes de procesar.

Eventos

EventoCuándocampos de datos
classification.completedPipeline correctajob_id, risk_level, obligations_count, fria_required, compliance_deadline
classification.failedPipeline fallida (crédito liberado)job_id, error

Cabeceras en cada entrega

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

Verificar firma

Verifique siempre la cabecera X-AZComply-Signature antes de procesar los payloads 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

Lógica de reintento

AZComply reintenta las entregas fallidas hasta 3 veces con backoff exponencial: 2 s → 4 s → 8 s. Tras 3 intentos fallidos el evento se descarta — compruebe la disponibilidad de su endpoint. Las respuestas 4xx no se reintentan (trátelas como fallos permanentes en su extremo).

⚠️
Su endpoint debe responder en 10 segundos. Devuelva 200 de inmediato y procese el payload de forma asíncrona — nunca realice operaciones lentas de forma síncrona en el controlador de webhook.

Gestión de claves

Gestione las claves API a través de la API REST o el Panel. Los endpoints de gestión de claves utilizan autenticación JWT bearer (su token de sesión de usuario) — no la autenticación por clave API.

Crear clave

POST
/v1/keys

Auth JWT · Crea clave · Clave sin procesar devuelta UNA VEZ

⚠️
La clave sin procesar se devuelve solo una vez en la respuesta de creación y nunca se almacena. Guárdela inmediatamente en un gestor de secretos — no se puede recuperar de nuevo.
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."
}

Listar claves

GET
/v1/keys

Auth JWT · Devuelve todas las claves de su cuenta

curl https://api.azcomply.eu/v1/keys \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Revocar clave

DELETE
/v1/keys/{key_id}

Auth JWT · Revocación inmediata · Idempotente

curl -X DELETE https://api.azcomply.eu/v1/keys/KEY_ID \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"
# Returns 204 No Content

Errores

CódigoNombreSignificado
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

Formato de error

Todos los errores devuelven un cuerpo JSON con un campo detail:

Respuesta · 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
}

Límites de velocidad

Los límites de velocidad son por clave API y se reinician diariamente a las 00:00 UTC. El límite predeterminado es de 500 llamadas/día. Los contadores mensuales se reinician el día 1 de cada mes.

EndpointLímite diario predeterminadoNotas
POST /v1/classify500 / key / dayGratuito, solo motor. Sin coste de créditos.
POST /v1/assess500 / key / dayTambién limitado por créditos. Se aplica el límite más bajo.
GET /v1/jobs/*500 / key / daySondee a intervalos de ≤5 segundos.

Cabeceras de límite de velocidad

Cada respuesta incluye estas cabeceras:

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

Estrategia de backoff

Si recibe un 429, espere el número de segundos indicado en la cabecera Retry-After antes de volver a intentarlo.

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")

Motor current · UE 2024/1689 · Residencia de datos RGPD: europe-west4

© 2026 AZComply — Herramienta de detección, no asesoramiento jurídico.

API Reference - AZComply