DecaEasy

API e integración

Crea, consulta, actualiza, publica, rectifica, sustituye, anula y archiva DeCA desde tu ERP, TMS o WMS.

Especificación OpenAPI Colección Postman

Autenticación

Crea claves en Ajustes → API, de lectura o de lectura y escritura. Envía Authorization: Bearer deca_…. Cada clave pertenece a un espacio de trabajo.

Flujo recomendado

POST https://decaeasy.es/api/v1/documents          # crea borrador (o "publish": true para publicar directamente)
POST https://decaeasy.es/api/v1/documents/{ref}/publish
GET  https://decaeasy.es/api/v1/documents/{ref}     # {ref} = id, número de DeCA o ext:{externalId}

Crear y publicar

curl -X POST https://decaeasy.es/api/v1/documents \
  -H "Authorization: Bearer $DECA_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-48213" \
  -d '{
  "externalId": "PED-48213",
  "publish": true,
  "data": {
    "cargador": {"nombre": "Cerámicas Levante SL", "nif": "B12345674", "domicilio": "Ctra. Onda km 3, Onda"},
    "transportista": {"nombre": "Transportes Pérez SL", "nif": "12345678Z"},
    "fecha_transporte": "2026-10-05",
    "vehiculo": {"matricula_tractora": "1234LMN", "matricula_remolque": "R5678BCD"},
    "conductor": {"nif": "X1234567L"},
    "envios": [{
      "origen": {"direccion": "Ctra. Onda km 3", "municipio": "Onda", "provincia": "Castellón"},
      "destino": {"direccion": "Av. del Puerto 10", "municipio": "Valencia"},
      "naturaleza": "Azulejos paletizados", "peso_kg": 18500, "bultos": "22 palés", "referencia": "ALB-9912"
    }]
  }}'

Respuesta 201 con id, number, url (la del QR), pdf_url, version y sha256.

Validación y avisos

Los errores devuelven 422 con errors por campo (p. ej. "envios.0.peso_kg"). Si solo hay avisos (fecha pasada, matrícula extranjera), reenvía con "confirmWarnings": true.

Idempotencia

Envía Idempotency-Key (o requestId en el cuerpo). Un reintento con la misma clave devuelve el documento ya creado con 200 en lugar de duplicarlo.

Modificar

PATCH /api/v1/documents/{ref}              # borrador: actualiza datos
PATCH /api/v1/documents/{ref}  {"reason": "...", "data": {...}}   # publicado: rectifica (mismo QR)
POST  /api/v1/documents/{ref}/replace {"reason": "...", "data": {...}}   # nuevo DeCA, nuevo QR
POST  /api/v1/documents/{ref}/void    {"reason": "..."}
POST  /api/v1/documents/{ref}/archive
GET   /api/v1/documents/{ref}/pdf

Si omites la versión, la API trabaja siempre sobre la versión vigente.

Directorios

GET|POST /api/v1/companies · /vehicles · /addresses · /drivers

Para asignar un conductor, indica driverId o su NIF en data.conductor.nif.

Webhooks firmados

Eventos: document.draft_created, document.published, document.corrected, document.replaced, document.voided, document.archived. Cabecera X-DeCA-Signature: t=…,v1=… con HMAC-SHA256 de "{t}.{cuerpo}".

const [t, v1] = header.split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', SECRET).update(t + '.' + rawBody).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1))) throw new Error('firma inválida');

Límites

DeCA emitidos por API al mes según el plan (1000 en Flexible, 5000 en Pro). Máximo 120 peticiones por minuto por IP.