Integraciones · versión 1.3.0
API de DeCAred
API de integraciones de DeCAred, incluida en el plan Documentos ilimitados + carta de porte. Consulta documentos y PDF, prepara y modifica borradores y mantiene la agenda. La version 1.3 incorpora seguimiento privado y operaciones de oficina en dos pasos: propuesta con resumen y confirmacion explicita vinculada a su revision. Las claves anteriores conservan solo sus permisos anteriores. Emitir y corregir usa los servicios de DeCAred y puede planificar entregas reales al conductor.
Especificación OpenAPI 3: https://decared.com/api/v1/openapi.json. Sirve para generar clientes y para conectores de Zapier, Make, n8n o Power Automate.
Autenticación
La API está incluida en el plan Documentos ilimitados + carta de porte. Con ese plan, crea una clave en DeCAred → Más → Integraciones. Cada clave pertenece a una empresa y tiene permiso de lectura, de escritura o de ambos. Envíala en cada petición:
curl https://decared.com/api/v1/me \ -H "Authorization: Bearer dcr_xxxxxxxxxxxx_…"
Límite: 120 peticiones por minuto por clave. Al superarlo, la respuesta es 429 con la cabecera Retry-After.
Para nuevas conexiones, concede solo los permisos necesarios: documents:read, drafts:read, drafts:write, counterparties:read/write, vehicles:read/write, drivers:read/write y webhooks:manage. En los permisos de agenda, elige :read o :write por separado. Gestionar webhooks permite recibir datos de documentos. Las claves generales read y write siguen funcionando; read conserva también la gestión de webhooks.
Las respuestas autenticadas no se almacenan en cachés compartidas. Cada petición tiene una cabecera X-Request-ID para localizar incidencias; las respuestas correctas autenticadas también indican X-RateLimit-Limit y X-RateLimit-Remaining.
Operaciones
GET/api/v1/me
Empresa y permisos de la clave
GET/api/v1/documents
Documentos emitidos, del último cambio al más antiguo — Para sondear cambios, usa updated_since con la fecha de la última consulta. Permiso especifico: documents:read. Las claves generales read/write conservan sus permisos anteriores.
Filtros: reference · external_reference · status (open, closed, annulled) · type (deca, route_sheet, carriage_letter) · updated_since · page · per_page · pagination (page, cursor) · cursor
GET/api/v1/documents/{id}
Detalle de un documento con todas sus versiones — Permiso especifico: documents:read. Las claves generales read/write conservan sus permisos anteriores.
GET/api/v1/documents/{id}/versions/{number}/pdf
PDF de una versión — Se comprueba su huella SHA-256 antes de servirlo; la cabecera X-Content-SHA256 la repite. Permiso especifico: documents:read. Las claves generales read/write conservan sus permisos anteriores.
POST/api/v1/drafts
Crear un borrador de DeCA — Permiso drafts:write o write. Crea sin emitir. external_reference identifica un pedido por empresa: mismo contenido devuelve 200 e Idempotent-Replayed: true, incluso tras pasar la fecha del servicio. Contenido diferente devuelve 409; no modifica el borrador. Se normaliza el orden de campos, NIF/matriculas y peso numerico. Para evitar duplicados, enviar siempre external_reference. Las referencias previas sin huella conservan la compatibilidad.
GET/api/v1/drafts
Consultar borradores de DeCA pendientes — Permiso drafts:read o read. Solo borradores de mercancias de la empresa. Admite external_reference, updated_since y paginacion por pagina o cursor.
Filtros: external_reference · updated_since · per_page · page · pagination (page, cursor) · cursor
GET/api/v1/drafts/{id}
Estado de un borrador creado por la API — Permiso especifico: drafts:read. Las claves generales read/write conservan sus permisos anteriores.
PATCH/api/v1/drafts/{id}
Modificar un borrador sin emitir — Requiere drafts:edit y acceso vigente del creador de la clave como gestor. revision es obligatoria; un cambio concurrente devuelve 409. data usa los nombres nativos de document_data; shipments reemplaza toda la lista.
GET/api/v1/counterparties
Empresas de la agenda — Permiso especifico: counterparties:read. Las claves generales read/write conservan sus permisos anteriores.
Filtros: updated_since · per_page · pagination (page, cursor) · cursor
POST/api/v1/counterparties
Crear o actualizar por NIF — Permiso especifico: counterparties:write. Las claves generales read/write conservan sus permisos anteriores.
GET/api/v1/vehicles
Vehículos — Permiso especifico: vehicles:read. Las claves generales read/write conservan sus permisos anteriores.
Filtros: updated_since · per_page · pagination (page, cursor) · cursor
POST/api/v1/vehicles
Crear o actualizar por matrícula — Permiso especifico: vehicles:write. Las claves generales read/write conservan sus permisos anteriores.
GET/api/v1/drivers
Conductores — Permiso especifico: drivers:read. Las claves generales read/write conservan sus permisos anteriores.
Filtros: updated_since · per_page · pagination (page, cursor) · cursor
POST/api/v1/drivers
Crear o actualizar por NIF — Permiso especifico: drivers:write. Las claves generales read/write conservan sus permisos anteriores.
GET/api/v1/webhooks
Destinos de webhooks activos de la empresa — Permiso especifico: webhooks:manage. Las claves generales read/write conservan sus permisos anteriores.
POST/api/v1/webhooks
Suscribir una dirección https a uno o varios eventos — Devuelve el secreto de firma una sola vez. Actúa en nombre del usuario que creó la clave, que debe seguir pudiendo gestionar las integraciones de la empresa. Permiso especifico: webhooks:manage. Las claves generales read/write conservan sus permisos anteriores.
DELETE/api/v1/webhooks/{id}
Dar de baja una suscripción — Permiso especifico: webhooks:manage. Las claves generales read/write conservan sus permisos anteriores.
POST/api/v1/documents/{id}/actions
Preparar una operacion de oficina — Solo DeCA independientes de mercancias. No ejecuta el efecto: guarda una propuesta cifrada durante 15 minutos. Requiere el permiso especifico de action y un gestor vigente. data solo se admite para correct; issue usa el borrador guardado. reason obligatorio en correct/annul; body en message/report_issue/resolve_issue; issue_id en resolve_issue. close exige finalizacion del conductor. Los campos de permiso no se heredan de read/write. Limite adicional: 30 peticiones de preparacion por minuto por clave, con Retry-After al superarlo.
GET/api/v1/operations/{operation}
Consultar el resultado de una operacion — Solo la misma empresa, clave y creador con permisos vigentes. No devuelve el token de confirmacion.
POST/api/v1/operations/{operation}/confirm
Confirmar exactamente la propuesta preparada — Misma clave y token. confirmed declara la autorizacion expresa del resumen. Se vuelve a comprobar revision, version, incidencia y permisos. Repetir una operacion completada devuelve el resultado persistido; executing/uncertain nunca se reejecutan automaticamente. No se aceptan nuevos datos para alterar la propuesta.
GET/api/v1/documents/{id}/tracking
Consultar el estado de seguimiento — Incluye datos internos. Requiere tracking:read y acceso vigente del creador de la clave. Aceptacion por el proveedor no acredita entrega ni lectura; finalizacion no es firma ni cierre.
GET/api/v1/documents/{id}/tracking/deliveries
Consultar deliveries del seguimiento — Datos de esta empresa y documento, ordenados por id descendente y paginados (50, maximo 100). Incluye notas internas. No devuelve cuerpos tecnicos, chat_id ni contenido binario. Los cambios de incidencias/mensajes no tienen nuevos webhooks en esta version.
Filtros: page · per_page
GET/api/v1/documents/{id}/tracking/interactions
Consultar interactions del seguimiento — Datos de esta empresa y documento, ordenados por id descendente y paginados (50, maximo 100). Incluye notas internas. No devuelve cuerpos tecnicos, chat_id ni contenido binario. Los cambios de incidencias/mensajes no tienen nuevos webhooks en esta version.
Filtros: page · per_page
GET/api/v1/documents/{id}/tracking/issues
Consultar issues del seguimiento — Datos de esta empresa y documento, ordenados por id descendente y paginados (50, maximo 100). Incluye notas internas. No devuelve cuerpos tecnicos, chat_id ni contenido binario. Los cambios de incidencias/mensajes no tienen nuevos webhooks en esta version.
Filtros: page · per_page
GET/api/v1/documents/{id}/tracking/issue_events
Consultar issue_events del seguimiento — Datos de esta empresa y documento, ordenados por id descendente y paginados (50, maximo 100). Incluye notas internas. No devuelve cuerpos tecnicos, chat_id ni contenido binario. Los cambios de incidencias/mensajes no tienen nuevos webhooks en esta version.
Filtros: page · per_page
GET/api/v1/documents/{id}/tracking/messages
Consultar messages del seguimiento — Datos de esta empresa y documento, ordenados por id descendente y paginados (50, maximo 100). Incluye notas internas. No devuelve cuerpos tecnicos, chat_id ni contenido binario. Los cambios de incidencias/mensajes no tienen nuevos webhooks en esta version.
Filtros: page · per_page
GET/api/v1/documents/{id}/tracking/attachments
Consultar attachments del seguimiento — Datos de esta empresa y documento, ordenados por id descendente y paginados (50, maximo 100). Incluye notas internas. No devuelve cuerpos tecnicos, chat_id ni contenido binario. Los cambios de incidencias/mensajes no tienen nuevos webhooks en esta version.
Filtros: page · per_page
GET/api/v1/documents/{id}/attachments/{attachment}
Descargar un adjunto privado — Requiere attachments:read y acceso vigente. Comprueba empresa, documento y SHA-256, con descarga sin cache.
Crear un borrador desde tu sistema
POST /drafts crea el borrador sin emitirlo. Una persona puede revisarlo y emitirlo en DeCAred, habilitarlo para el conductor o utilizar las operaciones confirmadas de la API 1.3 con los permisos específicos. Indica el pedido de tu sistema en external_reference: si repites la misma petición, recibes el mismo registro.
curl -X POST https://decared.com/api/v1/drafts \
-H "Authorization: Bearer dcr_…" -H "Content-Type: application/json" \
-d '{
"external_reference": "PED-2026-0457",
"shipper_nif": "B23456783",
"vehicle_plate": "2456KLM",
"driver_nif": "12345678Z",
"service_date": "2026-11-02",
"shipments": [{"origin": "Madrid", "destination": "Zaragoza", "goods": "Fruta", "weight": 12000}]
}'
Si repites el mismo pedido con los mismos datos, recibes 200 y Idempotent-Replayed: true, incluso después de pasar la fecha del servicio. Si utilizas esa referencia con otros datos, recibes 409 con código external_reference_conflict: consulta el registro existente antes de continuar. Se normalizan el orden de campos, los NIF, las matrículas y el peso numérico; conserva los mismos campos del pedido original. Los borradores antiguos sin huella de creación mantienen el comportamiento anterior. Sin referencia externa no se garantiza evitar duplicados.
Puedes buscar borradores pendientes con GET /api/v1/drafts?external_reference=PED-2026-0457. Un reintento no sobrescribe cambios hechos después por la oficina.
Sincronización por cursor
Para documentos, borradores y agenda, empieza con ?pagination=cursor&per_page=100. La respuesta incluye meta.next_cursor, meta.has_more y meta.sync_until. Repite la consulta con el cursor, codificado como parámetro de URL, y los mismos filtros hasta que has_more sea falso. Cada cursor pertenece a una empresa, un recurso y unos filtros, y caduca a las 24 horas. No lo combines con page.
Solo al completar todas las páginas, guarda sync_until. En el siguiente ciclo úsalo como updated_since y empieza sin cursor. El límite superior es exclusivo y los registros se ordenan por fecha de cambio e identificador: los cambios durante el recorrido se recuperan en el siguiente ciclo. No es una fotografía inmutable ni un historial de eliminaciones. Reconcilia por id y updated_at; un registro puede aparecer de nuevo si cambia. Los cambios del segundo actual se difieren al ciclo siguiente. La paginación anterior por páginas sigue disponible.
GET /api/v1/documents?pagination=cursor&per_page=100 GET /api/v1/documents?pagination=cursor&per_page=100&cursor=TOKEN_CODIFICADO // Tras completar el recorrido, empieza otro ciclo: GET /api/v1/documents?pagination=cursor&updated_since=SYNC_UNTIL_CODIFICADO
Errores y reintentos
Los errores conservan message y, en validación, errors. Añaden code y request_id. Usa el código para automatizar la respuesta y facilita el identificador al soporte; nunca envíes la clave ni el secreto del webhook.
| HTTP / código | Acción |
|---|---|
401 / invalid_api_key | Revisar la clave o crear otra si está revocada. |
403 / insufficient_scope o integrations_inactive | Revisar permisos o acceso al plan. |
404 / not_found | Comprobar el identificador y la empresa de la conexión. |
409 / external_reference_conflict | Revisar el pedido existente; no repetir a ciegas ni cambiar la referencia para forzar otro borrador. |
422 / validation_failed | Corregir los campos indicados. Si el cursor caducó, reiniciar desde el último ciclo completado. |
429 / rate_limit_exceeded | Esperar los segundos de Retry-After. |
| 5xx | Reintentar con espera creciente y variación aleatoria. Al crear borradores, conservar siempre la referencia y el contenido original. |
Operaciones confirmadas · API 1.3
Preparar propuestas tiene un límite adicional de treinta peticiones por minuto y clave, con 429 y Retry-After. El resto conserva el límite general de 120 peticiones por minuto y clave.
Las claves generales read y write mantienen su alcance anterior. Para editar borradores existentes se necesita drafts:edit; para seguimiento privado, tracking:read; para descargar sus adjuntos, attachments:read. Este seguimiento incluye mensajes y notas internas: concede el permiso solo a programas de confianza.
Las acciones de oficina necesitan su permiso específico: documents:issue, documents:correct, documents:close, documents:annul, documents:resend, issues:report, issues:manage o messages:send. El creador de la clave debe seguir activo, con acceso a la empresa y con un rol de gestión; no basta con poseer el token.
- Consulta el documento o borrador y su
revision. Si editas el borrador, usaPATCH /drafts/{id}conrevisionydata. Los nombres nativos se encuentran endocument_data; no son los nombres de creación inicial. Solo se combinan los campos enviados;shipmentssustituye la lista completa. - Prepara la acción con
POST /documents/{id}/actions. No ejecuta la acción. Devuelve un resumen, el identificador y unconfirmation_tokende un solo procedimiento, válido durante quince minutos. - Muestra el resumen y solicita autorización expresa. Confirma con la misma clave mediante
POST /operations/{operation}/confirm. La integración declara esa autorización conconfirmed: true; el servidor no verifica por sí mismo quién pulsó un botón externo. - Guarda el identificador. Si pierdes la respuesta, consulta
GET /operations/{operation}o repite la misma confirmación: si terminó, devuelve su resultado sin repetir el efecto. Un estadoexecutingouncertainexige conciliación; no prepares otra emisión o reenvío a ciegas.
// 1. Propuesta; utiliza la revisión que acabas de consultar.
POST /api/v1/documents/123/actions
{"action":"issue","revision":4}
// 2. Después de revisar el resumen y autorizarlo expresamente:
POST /api/v1/operations/UUID_DEVUELTO/confirm
{"confirmed":true,"confirmation_token":"TOKEN_DEVUELTO"}
Una corrección usa action: correct, reason y los cambios nativos en data; conserva las versiones anteriores. Cerrar exige que el conductor ya haya comunicado la finalización. Anular requiere motivo, no cancela firmas ni devuelve créditos. Emitir o corregir puede consumir cupo y planificar entregas reales al conductor. Reenviar puede duplicar una entrega; la aceptación de ese riesgo se declara en la propuesta con accept_duplicate.
Para una incidencia de oficina prepara report_issue con body, categoría, prioridad y motivo si es urgente; se registra como nota interna, sin atribuirla al conductor. Para resolverla usa resolve_issue con issue_id y la resolución en body. Para escribir usa message, body y visibility: shared (conductor) o internal (solo oficina). Los adjuntos se envían al preparar mediante multipart/form-data, en attachments[]: máximo tres JPEG, PNG o PDF de 1 MiB cada uno, comprobados por contenido.
El estado se consulta en /documents/{id}/tracking. Sus colecciones deliveries, interactions, issues, issue_events, messages y attachments usan paginación por páginas, con hasta cien registros. No son un cursor de sincronización. Los adjuntos tienen descarga protegida y comprobación de integridad.
Alcance: las acciones de esta versión gestionan DeCA independientes de mercancías; no crean cartas de porte, hojas de ruta, anexos contractuales ni firmas. Tampoco confirman recepción o finalización en nombre del conductor. Cerrar no resuelve incidencias: se pueden seguir gestionando y anotando internamente después del cierre. Los eventos de mercancía y sus evidencias específicas mantienen sus pantallas actuales. Los webhooks existentes no incorporan todavía eventos de incidencias o mensajes.
Webhooks
Añade una dirección https:// en Integraciones y elige los eventos. DeCAred envía un POST con este cuerpo y reintenta los fallos durante unas horas. Entrega al menos una vez: usa el id para no procesar dos veces el mismo evento, y responde 2xx en menos de 10 segundos.
| Evento | Cuándo |
|---|---|
document.issued | Documento emitido |
document.corrected | Documento corregido (nueva versión) |
document.closed | Documento cerrado |
document.annulled | Documento anulado |
document.receipt_confirmed | El conductor confirma la recepción |
document.service_finished | El conductor comunica que ha terminado el servicio |
ping | Prueba enviada desde Integraciones |
{
"id": "6f1c…-uuid",
"event": "document.issued",
"created_at": "2026-10-21T08:15:02+02:00",
"company_id": 12,
"data": { "id": 1095, "reference": "DECA-2026-001095", "status": "open", "current_version": { "number": 1, "pdf_url": "…" }, … }
}
Verificar la firma. La cabecera DeCAred-Signature tiene la forma t=1792490894,v1=…: calcula HMAC-SHA256 de t + "." + cuerpo con el secreto del destino y compáralo con v1. Rechaza las firmas de más de cinco minutos.
// PHP
$body = file_get_contents('php://input');
$valid = preg_match('/\At=(\d{1,12}),v1=([a-f0-9]{64})\z/', $_SERVER['HTTP_DECARED_SIGNATURE'] ?? '', $parts) === 1;
$ok = $valid && abs(time() - (int) $parts[1]) < 300 &&
hash_equals(hash_hmac('sha256', $parts[1].'.'.$body, $secret), $parts[2]);
// Node.js
const parts = typeof header === 'string' ? /^t=(\d{1,12}),v1=([a-f0-9]{64})$/.exec(header) : null;
const ok = parts !== null && Math.abs(Date.now() / 1000 - Number(parts[1])) < 300 &&
crypto.timingSafeEqual(crypto.createHmac('sha256', secret).update(`${parts[1]}.${rawBody}`).digest(), Buffer.from(parts[2], 'hex'));
n8n
Conecta DeCAred con n8n con una clave de API. Para recibir avisos, tu n8n debe ser accesible desde Internet con https://, como n8n Cloud o un servidor propio con certificado.
Permisos. Las claves generales conservan las operaciones anteriores. Las acciones de API 1.3, la edición y el seguimiento requieren permisos nuevos explícitos; no se heredan de read/write. Cada flujo necesita los suyos: documents:read para documentos y PDF, drafts:write para crear borradores, drafts:edit para editarlos y tracking:read para seguimiento.
Plantillas. Con los nodos estándar de n8n (Webhook, HTTP Request y Code). Descarga el archivo e impórtalo en n8n con Import from File; cada plantilla explica en una nota qué debes rellenar y qué permiso necesita la clave.
| Plantilla | Qué hace |
|---|---|
| DeCA emitido → PDF por correo | Recibe el aviso document.issued, comprueba la firma, descarga el PDF y lo envía por correo. |
| Sondeo de documentos | Cada 15 minutos pide los documentos cambiados. Sirve para un n8n sin dirección pública. |
| Pedidos → borradores de DeCA | Lee pedidos de una hoja de Google y crea un borrador por pedido. Si se repite, no duplica. Los pedidos rechazados, también los repetidos con otros datos, quedan en «Pedidos para revisar» con el motivo. |
| Sincronizar vehículos | Crea o actualiza los vehículos de la agenda desde una hoja de Google. Las filas rechazadas quedan en «Vehículos para revisar». |
| Preparar operación para revisión | Consulta la revisión vigente y prepara una de las ocho acciones de API 1.3. Devuelve el resumen para revisarlo; no ejecuta la acción. |
| Confirmar propuesta aprobada | Flujo manual separado, bloqueado por defecto. Exige aprobación expresa, ID y token de esa propuesta; comprueba estado y caducidad antes de confirmar. |
En las plantillas, la clave va en una credencial Header Auth con nombre Authorization y valor Bearer dcr_…. La plantilla de avisos comprueba la firma con el nodo estándar Crypto: guarda el secreto del destino en una credencial Crypto, en el campo Hmac Secret.
Las dos plantillas de operaciones usan nodos estándar y no necesitan instalar el nodo de la comunidad. Revisa la propuesta exacta antes de confirmar, con la misma clave y dentro de quince minutos. No conectes automáticamente preparación y confirmación. Protege y elimina el token de la configuración y de las ejecuciones tras usarlo; no exportes el flujo con él. Ante timeout consulta la misma operación; los estados executing o uncertain requieren conciliación manual.
Power Automate
Descargar conector personalizado API 1.3 y guía. Incluye Swagger 2.0, configuración de conexión y recetas para aprobación humana, confirmación y recuperación. Ofrece las 28 operaciones del contrato de la API, incluidos edición, seguimiento y descarga de adjuntos. Para subir archivos al preparar, configura una acción HTTP multipart según la guía.
Importa apiDefinition.swagger.json en Conectores personalizados. La conexión usa API key en la cabecera Authorization: introduce Bearer dcr_… completo. Necesitas una cuenta y licencia que permitan conectores personalizados. Leer la guía de configuración y pruebas.
Estado de validación: archivos comprobados localmente; pendientes la importación y las pruebas en una cuenta Microsoft. No es un conector certificado del catálogo. El nodo de comunidad de n8n sigue pendiente de publicación en npm; las plantillas de nodos estándar ya se pueden descargar.
Buenas prácticas
- Para sondear cambios sin webhooks, consulta
/documents?updated_since=con la fecha de tu última consulta. - Los datos de un documento emitido proceden de su versión: no cambian aunque después se edite la agenda. Una corrección crea otra versión y el evento
document.corrected. - Comprueba la huella
sha256del PDF descargado. Guarda las claves y secretos como contraseñas: si se filtran, revócalos en Integraciones.
¿Dudas o un conector que necesites? info@decared.com