Documentación · API REST v1

API de Autenflow

Integra la verificación forense de documentos en tu CRM, marketplace o flujo interno. La API procesa nóminas, vidas laborales y contratos en menos de 30 segundos por documento.

Autenticación

Todas las llamadas requieren cabecera Authorization: Bearer <tu_api_key>.

Las API keys se generan desde el panel: Cuenta → API Keys.

  • Live (prefijo vrd_live_): consume créditos reales del plan.
  • Test (prefijo vrd_test_): para pruebas, no consume créditos.

Endpoint principal · Verificar un documento

POST/api/v1/verify

Sube un PDF o imagen, recibe un verification_id

Multipart con tres campos: file, document_type y opcional client_ref.

curl -X POST 'https://backend-production-173a.up.railway.app/api/v1/verify' \
  -H 'Authorization: Bearer vrd_live_xxxxx' \
  -F 'file=@/ruta/al/documento.pdf' \
  -F 'document_type=nomina' \
  -F 'client_ref=candidato-juan-perez-123'

Respuesta inmediata (202):

{
  "verification_id": "8c4f2e8a-...",
  "status": "pending"
}
document_typenomina · contrato · vida_laboral
Tipos de archivo aceptadosPDF, JPG, PNG, WEBP (máx. 10 MB)
client_ref (opcional)Cualquier string que uses para agrupar verificaciones del mismo candidato (cross-document detecta coherencia automáticamente).

Consultar resultado

GET/api/v1/verify/{verification_id}

Recupera el resultado de una verificación

El procesamiento tarda 8-25 segundos. Hacé polling hasta que status === "completed" o "failed".

curl 'https://backend-production-173a.up.railway.app/api/v1/verify/8c4f2e8a-...' \
  -H 'Authorization: Bearer vrd_live_xxxxx'

Respuesta cuando completed (200):

{
  "verification_id": "8c4f2e8a-...",
  "document_type": "nomina",
  "status": "completed",
  "score": 91,
  "verdict": "AUTENTICO",
  "recommendation": "La nómina presenta evidencia positiva suficiente...",
  "flags": [],
  "flags_count": { "critical": 0, "high": 0, "medium": 0, "low": 0 },
  "trust_signals": [
    { "code": "MATH_NOMINA_COHERENTE", "points": 15, "detail": "..." },
    ...
  ],
  "extracted_data": {
    "empresa": "ACME SL",
    "cif": "B12345674",
    "trabajador": "JUAN PEREZ",
    "nif": "12345678Z",
    "salario_bruto": 2200.0,
    "salario_neto": 1850.0,
    "irpf_pct": 12.5,
    "periodo": "2026-04"
  },
  "document_hash": "sha256:...",
  "processing_time_ms": 18432,
  "created_at": "2026-05-25T10:00:00Z",
  "completed_at": "2026-05-25T10:00:18Z",
  "error_message": null
}

Veredictos posibles

  • AUTENTICO≥ 75Evidencia positiva suficiente. Proceder con normalidad.
  • REVISAR50 – 74Señales mixtas o falta evidencia. Solicitar contraste antes de decidir.
  • SOSPECHOSO25 – 49Múltiples indicadores de manipulación. No usar como prueba única.
  • ALTO_RIESGO0 – 24Indicadores graves de falsificación. No proceder.

Descargar el informe PDF

GET/api/v1/verify/{verification_id}/report

PDF descargable con análisis completo

curl 'https://backend-production-173a.up.railway.app/api/v1/verify/8c4f2e8a-.../report' \
  -H 'Authorization: Bearer vrd_live_xxxxx' \
  -o informe.pdf

Listar verificaciones

GET/api/v1/verifications

Lista paginada de tus verificaciones (filtros opcionales)

curl 'https://backend-production-173a.up.railway.app/api/v1/verifications?page=1&page_size=25&verdict=AUTENTICO' \
  -H 'Authorization: Bearer vrd_live_xxxxx'

Filtros: page, page_size (max 100), verdict, document_type, search (busca en client_ref).

Ejemplos rápidos por lenguaje

Python

import requests

API_KEY = "vrd_live_xxxxx"
BASE = "https://backend-production-173a.up.railway.app/api/v1"

# 1. Subir documento
with open("nomina.pdf", "rb") as f:
    r = requests.post(
        f"{BASE}/verify",
        headers={"Authorization": f"Bearer {API_KEY}"},
        files={"file": f},
        data={"document_type": "nomina", "client_ref": "candidato-001"},
    )
verification_id = r.json()["verification_id"]

# 2. Polling hasta completed
import time
while True:
    r = requests.get(
        f"{BASE}/verify/{verification_id}",
        headers={"Authorization": f"Bearer {API_KEY}"},
    )
    data = r.json()
    if data["status"] in ("completed", "failed"):
        break
    time.sleep(2)

print(f"Veredicto: {data['verdict']} (score {data['score']}/100)")

Node.js (fetch)

const API_KEY = "vrd_live_xxxxx";
const BASE = "https://backend-production-173a.up.railway.app/api/v1";

// 1. Subir documento
const fd = new FormData();
fd.append("file", fileBlob, "nomina.pdf");
fd.append("document_type", "nomina");
fd.append("client_ref", "candidato-001");

let r = await fetch(`${BASE}/verify`, {
  method: "POST",
  headers: { Authorization: `Bearer ${API_KEY}` },
  body: fd,
});
const { verification_id } = await r.json();

// 2. Polling
let data;
while (true) {
  r = await fetch(`${BASE}/verify/${verification_id}`, {
    headers: { Authorization: `Bearer ${API_KEY}` },
  });
  data = await r.json();
  if (data.status === "completed" || data.status === "failed") break;
  await new Promise(r => setTimeout(r, 2000));
}

console.log(`Veredicto: ${data.verdict} (score ${data.score}/100)`);

Rate limits y SLA

  • Pro: 100 verificaciones/mes, sin rate limit individual.
  • Business: 500 verificaciones/mes, hasta 10 calls simultáneas por API key.
  • Enterprise: volumen ilimitado + SLA 99,9% + soporte 24/7. Consulta: founder@autenflow.es.

Códigos de error

StatusSignificado
401API key inválida o ausente
402Plan agotado (sin créditos)
413Archivo > 10 MB
415Tipo de archivo no soportado
429Demasiadas requests simultáneas
500Error interno (retry en 5s)

OpenAPI / Swagger