Para emitir documentos electrónicos de control administrativo desde tu propio sistema de gestión, sin teclear nada dos veces.
Mandas los datos del transporte. Nosotros componemos el DeCA en PDF, le estampamos el código QR, le incrustamos los datos estructurados eFTI, lo firmamos digitalmente si tu suscripción tiene firma, lo archivamos en tu Digitaldocu y avisamos al conductor.
Te devolvemos su número de expedición y su identificador. A partir de ahí el documento vive en tu Digitaldocu como cualquier otro.
Solo si tu contrato lleva tope. Por defecto no hay tope: se
mide el consumo, se avisa y el exceso se factura, pero se emite siempre. Si tu
contrato sí lo lleva, agotar el volumen devuelve 402
volumen_agotado y no se emite hasta ampliarlo. Conviene que tu
programa lo contemple: es el único error que no se arregla reintentando.
La API decide qué dice el DeCA. Tu suscripción decide cómo se emite. La firma digital, el aviso por SMS al conductor y la generación automática son ajustes de tu suscripción, no parámetros de la llamada. Se cambian desde el panel.
Un DeCA nombra siempre a las dos partes, así que la API pide los datos de las dos vengas de donde vengas. Lo que cambia es cuáles son tuyos:
| Tus datos (los ponemos nosotros) | Los de la otra parte (por envío) | |
|---|---|---|
| Eres el cargador | cargador, cargador_nif, cargador_domicilio |
transportista, transportista_nif |
| Eres el transportista | transportista, transportista_nif |
cargador, cargador_nif, cargador_domicilio |
Tus datos no hace falta que los mandes. Guárdalos una vez en el panel, en Los datos de tu empresa: dices de qué lado estás y los ponemos nosotros en cada DeCA. Si aun así los mandas en la petición, mandan los tuyos — lo guardado es solo el valor por defecto.
Merece la pena aunque tu programa pueda repetirlos: son los datos que no cambian nunca, y repetirlos mil veces son mil oportunidades de colar una errata. Un NIF mal escrito acaba impreso y firmado en un documento legal.
Se crea desde el panel, en Claves para tu programa. Se enseña una sola vez: guárdala en cuanto la veas, porque ni nosotros podemos volver a mostrarla. Si se pierde, se revoca y se crea otra.
Authorization: Bearer deca_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
La clave identifica tu suscripción por sí sola: no hay que mandar ningún otro dato para decir quién eres. Solo sirve para lo que hay en este documento — no da acceso al resto de tus documentos de Digitaldocu.
Son los que exige la norma (Orden FOM/2861/2012, art. 6). Si falta alguno no se emite nada y te decimos cuáles. Los de tu propia empresa puedes omitirlos si los has guardado en el panel (ver el punto 2).
| Campo | Ejemplo | |
|---|---|---|
cargador | INDUSTRIAS EJEMPLO, S.L. | Cargador contractual |
cargador_nif | B00000000 | |
cargador_domicilio | Calle Ejemplo 1, Valencia | |
transportista | TRANSPORTES EJEMPLO, S.L. | Transportista efectivo |
transportista_nif | B11111111 | |
origen | Valencia | Lugar de carga |
destino | Madrid | Lugar de entrega |
fecha | 2026-08-25 | aaaa-mm-dd |
mercancia | Palés de mercancía general | |
peso | 17000 · 17,00 Tn · 1.500 kg | Con unidad o sin ella |
matricula | 1234BCD | Vehículo tractor |
El peso admite la unidad que uses. Si mandas 17,00 Tn
lo convertimos a 17.000 kg. Si mandas un número pelado lo tomamos por kilos.
Y comprobamos que sea un peso razonable para un camión: por encima de 60 t
avisamos, porque suele ser un error de unidad.
| Campo | |
|---|---|
conductor | Nombre del conductor |
movil | Su móvil, para el aviso |
remolque | Matrícula del remolque |
bultos | Texto libre: 15, 26 big-bags |
cliente | Destinatario, si no es el del destino |
Manda tu propia referencia en la cabecera Idempotency-Key —tu número
de expedición sirve—. Si repites la llamada porque se te cayó la red y no viste
la respuesta, te devolvemos el mismo documento en vez de emitir otro.
curl -X POST https://deca.digitaldocu.es/api/deca/v1/expediciones \
-H "Authorization: Bearer $DECA_KEY" \
-H "Idempotency-Key: ALB-2026-000123" \
-H "Content-Type: application/json" \
-d '{
"cargador": "INDUSTRIAS EJEMPLO, S.L.",
"cargador_nif": "B00000000",
"cargador_domicilio": "Calle Ejemplo 1, Valencia",
"transportista": "TRANSPORTES EJEMPLO, S.L.",
"transportista_nif": "B11111111",
"origen": "Valencia",
"destino": "Madrid",
"fecha": "2026-08-25",
"mercancia": "Palés de mercancía general",
"peso": "17,00 Tn",
"matricula": "1234BCD",
"conductor": "Juan Ejemplo",
"movil": "600000000"
}'
201 Created
{ "ok": true,
"documentId": 123456,
"expedicion": "DECA-20260825-A1B2C3" }
Si repites con la misma Idempotency-Key:
{ "ok": true, "repetida": true,
"documentId": 123456,
"expedicion": "DECA-20260825-A1B2C3" }
Para colgar del DeCA el documento de origen: tu albarán, tu CMR, el tique de báscula. Queda enlazado al DeCA y no se lo enseñamos al destinatario salvo que alguien lo comparta a mano desde el panel — suele llevar datos del cargador que el receptor no tiene por qué ver.
curl -X POST \
"https://deca.digitaldocu.es/api/deca/v1/expediciones/DECA-20260825-A1B2C3/adjuntos" \
-H "Authorization: Bearer $DECA_KEY" \
-F "tipo=albaran" \
-F "file=@albaran-000123.pdf"
Valores de tipo: albaran, cmr,
foto_carga, ticket_bascula, packing_list,
otros.
Manda el fichero como multipart/form-data, no en base64
dentro de un JSON. Base64 infla el fichero un tercio, y con el tope de
4 MB por adjunto eso es justo lo que decide si tu albarán entra o no. Aceptamos
JSON con fileBase64 si lo tienes más a mano, pero el multipart es
mejor.
{ "ok": true,
"expedicion": "DECA-20260825-A1B2C3",
"documentId": 123456,
"estado": "En tránsito",
"entregado": false,
"fechaFirma": null,
"matricula": "1234BCD",
"conductor": "Juan Ejemplo",
"origen": "Valencia",
"destino": "Madrid",
"adjuntos": 1,
"enlace": "https://backend.digitaldocu.com/api/Documents/Share/…" }
El enlace es el mismo al que apunta el QR del documento.
Caduca, así que no lo guardes: pídelo cuando lo necesites.
En vez de preguntar cada poco por cada expedición, dinos una dirección y te llamamos nosotros cuando el destinatario firma. Se configura en el panel, en Avisar a tu sistema.
POST https://erp.tuempresa.com/webhooks/deca
X-DeCA-Evento: entrega_firmada
X-DeCA-Firma: sha256=a1b2c3…
{ "evento": "entrega_firmada",
"documentId": 123456,
"expedicion": "DECA-20260825-A1B2C3",
"matricula": "1234BCD",
"firmado_at": "2026-08-25 14:32",
"firmante": "Ana Ejemplo",
"firmante_nif": "00000000T",
"incidencias": null,
"observaciones": null }
La cabecera X-DeCA-Firma es el HMAC-SHA256 del cuerpo, con el
secreto que verás en el panel al configurar la dirección. Compáralo antes
de fiarte del mensaje:
# Python
import hmac, hashlib
esperado = "sha256=" + hmac.new(
SECRETO.encode(), cuerpo_en_bruto, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(esperado, cabecera_firma):
return 401
2xx. Cualquier otra cosa la tomamos por fallo.https y con nombre de dominio. No
admitimos direcciones IP ni nombres de red interna.| Código | Qué pasa | Qué hacer |
|---|---|---|
401 | Clave ausente, mal escrita o revocada | Revisa la cabecera |
400 campos_incompletos | Faltan obligatorios | Mira faltan |
404 no_encontrada | Esa expedición no existe | Revisa el número |
402 volumen_agotado | Se acabó el volumen de tu suscripción | Escríbenos para ampliarlo |
409 entregada | Ya está firmada y cerrada | No admite cambios |
413 demasiado_grande | El adjunto pasa de 4 MB | Comprímelo |
503 | Servicio no disponible | Reintenta |
Cuando faltan datos te decimos exactamente cuáles, para que puedas programar contra ello:
400 Bad Request
{ "error": "faltan datos obligatorios del DeCA",
"code": "campos_incompletos",
"faltan": ["cargador_nif", "origen", "peso"],
"avisos": [
{ "campo": "cargador_nif",
"nivel": "falta",
"motivo": "obligatorio: no viene en la petición" }
] }
| Adjunto | 4 MB por fichero |
| Formatos | PDF e imágenes |
| Claves activas | 10 por suscripción |
| Peso admitido | Hasta 60 t (por encima, avisamos) |
Un DeCA entregado es registro legal y no se toca. Una vez que el destinatario ha firmado la recepción, esa expedición no admite documentos nuevos ni modificaciones. Si te equivocaste, emite otra.