Para desarrolladores
API de PorteListo
Conecta tu programa de gestión (ERP, facturación, gestión de flota) con PorteListo para crear y emitir DeCA, consultarlos, anularlos o enviar albaranes sin pasar por el panel. Incluida en los planes Completo y Empresa.
REST + JSON
Base: https://app.portelisto.com/api/v1
Clave por empresa
Solo ve y toca los datos de esa empresa (o de ese cargador).
OpenAPI 3.1
1. Consigue tu clave
El responsable de la empresa la crea en el panel: Ajustes → API para tu programa de gestión. Elige si puede solo leer o también crear y anular. La clave (pl_live_…) se muestra una sola vez: guárdala como una contraseña. Si se filtra, revócala y crea otra.
¿Eres el cargador? Tu clave es gratis: créala en cargador.portelisto.com/programa (tu empresa tiene que estar verificada) y pide la conexión a cada transportista. En cada POST indica el transportista con carrier_nif: solo se acepta si ese transportista tiene la conexión activa (va incluida en su plan Completo). Con tu clave emites y consultas tus DeCA y envías albaranes; no ves conductores ni vehículos: el conductor es el habitual de ese camión en PorteListo.
Envíala en cada petición:
Authorization: Bearer pl_live_TU_CLAVE2. Operaciones
| Método | Ruta | Qué hace | Permiso |
|---|---|---|---|
| GET | /decas | Lista de DeCA por fechas, estado o nº de albarán | read |
| POST | /decas | Crea y emite un DeCA (PDF con QR) y lo envía al conductor por WhatsApp | write |
| GET | /decas/{id o número} | Un DeCA, con su enlace al PDF y el estado del WhatsApp | read |
| POST | /decas/{id o número}/cancel | Anula un DeCA emitido | write |
| POST | /delivery-notes | Envía un albarán (PDF o fotos): se lee solo y queda en «Pendientes» | write |
| GET | /drivers | Conductores activos (para indicar el conductor). No disponible con clave de cargador | read |
| GET | /vehicles | Camiones y remolques activos. No disponible con clave de cargador | read |
| POST | /cmrs | Crea un CMR (porte internacional) listo para imprimir y firmar. Plan Completo del transportista | write |
| GET | /cmrs · /cmrs/{id o número} | Lista de CMR o uno concreto, con su PDF | read |
| POST | /cmrs/{id o número}/cancel | Anula un CMR | write |
| GET | /worksites | Obras con su cliente y ubicación. No disponible con clave de cargador | read |
| PATCH | /worksites/{id o código} | Guarda la ubicación de una obra (p. ej. desde tu telemática). No disponible con clave de cargador | write |
| GET | /load-sites | Lugares de carga con su ubicación. No disponible con clave de cargador | read |
| GET | /carriers | (Cargador) Tus transportistas y si están conectados | read |
| POST | /connections | (Cargador) Pedir la conexión a un transportista, o invitarle si no está en PorteListo | write |
3. Crear y emitir un DeCA
Con los datos del porte, PorteListo crea el DeCA, genera el PDF con su QR y lo envía por WhatsApp al conductor. El conductor se indica con driver_id (de GET /drivers) o con driver_phone. Al emitir por API, tu programa es el que revisa los datos: lo que envíes es lo que se emite.
curl -X POST https://app.portelisto.com/api/v1/decas \
-H "Authorization: Bearer pl_live_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ALB-10231" \
-d '{
"service_date": "2026-10-07",
"shipper": { "name": "Cargador Ejemplo, S.L.", "nif": "B12345678", "address": "Pol. Ind. Ejemplo, calle A, 1, 00000 Ejemplo" },
"tractor_plate": "1234BCD",
"trailer_plate": "R5678BCD",
"driver_phone": "600000000",
"shipments": [{
"origin": "Planta de Ejemplo, Pol. Ind. Ejemplo, 00000 Ejemplo",
"destination": "Obra calle Mayor 10, Ejemplo",
"goods": "Viguetas de hormigón",
"weight_kg": 18450,
"delivery_note_ref": "ALB-10231"
}]
}'Respuesta 201:
{
"data": {
"id": "7b0c…",
"number": "TEJ-2026-000128",
"status": "emitido",
"pdf_url": "https://d.portelisto.com/Xk3p9QvT2mLr8sWz4bNc7a",
"shipper": { "name": "Cargador Ejemplo, S.L.", "nif": "B12345678", "address": "…" },
"tractor_plate": "1234BCD",
"driver": { "id": "…", "name": "Conductor de ejemplo" },
"shipments": [{ "origin": "…", "destination": "…", "goods": "…", "weight_kg": 18450, "delivery_note_ref": "ALB-10231" }],
"whatsapp": { "status": "enviado", "at": "2026-10-07T07:42:10Z" }
},
"whatsapp": "enviado"
}Si el porte va fuera de España no lleva DeCA sino CMR: POST /decas responde 422 y tienes que crear el CMR (apartado siguiente).
CMR para portes internacionales
Con POST /cmrs PorteListo genera la carta de porte CMR rellena, con sus 24 casillas, en PDF listo para imprimir los 3 ejemplares y firmarlos. Con clave de cargador indica carrier_nif: el remitente eres tú. El transportista necesita el plan Completo.
curl -X POST https://app.portelisto.com/api/v1/cmrs \
-H "Authorization: Bearer pl_live_TU_CLAVE" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ALB-10240" \
-d '{
"sender": { "name": "Cargador Ejemplo, S.L.", "nif": "B12345678", "address": "Pol. Ind. Ejemplo, calle A, 1, 00000 Ejemplo" },
"consignee": { "name": "Client Exemple SARL", "nif": "FR57382743391", "address": "Zone Industrielle, 64100 Bayonne", "country": "FR" },
"pickup": { "place": "Planta de Ejemplo, 00000 Ejemplo", "date": "2026-10-07" },
"delivery": { "place": "Chantier Les Jardins, 64310 Ascain", "country": "FR" },
"goods": "Viguetas pretensadas de hormigón",
"packages": "18 paquetes",
"weight_kg": 21400,
"delivery_note_ref": "ALB-10240",
"tractor_plate": "1234BCD",
"trailer_plate": "R5678BCD"
}'La respuesta 201 trae el número y pdf_url. Consulta con GET /cmrs (por fecha de carga) y anula con POST /cmrs/{id o número}/cancel.
4. Enviar un albarán para que lo revise la oficina
Si prefieres que la oficina revise antes de emitir, envía el albarán (PDF o fotos, hasta 8 archivos y 10 MB). Se lee solo y aparece en Pendientes del panel, como un albarán recibido por email. Sirve también para el programa de tu cargador.
curl -X POST https://app.portelisto.com/api/v1/delivery-notes \
-H "Authorization: Bearer pl_live_TU_CLAVE" \
-F "reference=ALB-10231" \
-F "file=@albaran-10231.pdf"También admite JSON: { "files": [{ "filename": "alb.pdf", "content_base64": "…" }], "reference": "ALB-10231" }.
5. Consultar y anular
curl "https://app.portelisto.com/api/v1/decas?from=2026-10-01&to=2026-10-07&status=emitido" \
-H "Authorization: Bearer pl_live_TU_CLAVE"Parámetros de la lista: from, to (fecha del servicio, YYYY-MM-DD; por defecto los últimos 30 días), status, delivery_note_ref, limit (máx. 200) y offset. También plate (matrícula de la tractora o del remolque, con o sin espacios ni guiones), worksite (código o id de la obra) y los de sincronización del apartado siguiente.
curl -X POST https://app.portelisto.com/api/v1/decas/TEJ-2026-000128/cancel \
-H "Authorization: Bearer pl_live_TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{ "reason": "Porte cancelado por el cliente" }'Sincronizar con tu programa o tu telemática
Para tener una copia al día sin descargarlo todo cada vez, pide los DeCA cambiados en orden y guarda el cursor. Con changed_since (fecha ISO 8601) recibes los creados, emitidos, modificados o anulados después de esa fecha, sin el límite de 30 días. Con order=changed_asc la respuesta trae next_cursor: guárdalo y úsalo en la siguiente petición (cada 60 s, por ejemplo). Si viene null, ya estás al día: repite con el último cursor que tengas. Así no se salta ni se repite ningún DeCA.
# 1ª vez: todo lo cambiado desde una fecha
curl "https://app.portelisto.com/api/v1/decas?changed_since=2026-10-01T00:00:00Z&order=changed_asc&limit=200" \
-H "Authorization: Bearer pl_live_TU_CLAVE"
# Cada 60 s: sigue desde el último next_cursor guardado
curl "https://app.portelisto.com/api/v1/decas?order=changed_asc&limit=200&cursor=MjAyNi0xMC0wN1Qw…" \
-H "Authorization: Bearer pl_live_TU_CLAVE"{
"data": [{
"number": "TEJ-2026-000128", "status": "emitido", "changed_at": "2026-10-07T07:42:10.123456+00:00",
"tractor_plate": "1234BCD", "trailer_plate": "R5678BCD",
"service_start_at": null, "service_end_at": null,
"worksite": { "id": "…", "code": "202115", "name": "Obra de ejemplo", "address": "…",
"client": { "name": "Cliente Ejemplo, S.L.", "nif": "B87654321" },
"location": { "lat": 43.1, "lon": -1.6, "source": "telematica", "updated_at": "…" } }
}],
"total": 1, "limit": 200, "offset": 0, "next_cursor": null
}Cada DeCA trae changed_at, la worksite (obra, con su cliente y ubicación si la tiene) y service_start_at/service_end_at. Para cruzarlo con tu telemática, usa la matrícula (plate) y la ubicación de la obra. Los envíos por WhatsApp o la regeneración del PDF no cuentan como cambio.
Si tu telemática sabe dónde está cada obra, guárdalo con PATCH /worksites/{id o código}. Una ubicación puesta a mano en el panel no se sobrescribe salvo que envíes "force": true (si no, 409).
curl -X PATCH https://app.portelisto.com/api/v1/worksites/202115 \
-H "Authorization: Bearer pl_live_TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{ "location": { "lat": 43.1, "lon": -1.6, "source": "telematica", "radius_m": 150 } }'6. Reintentos sin duplicados
Añade la cabecera Idempotency-Key (por ejemplo, tu nº de albarán) en POST. Si la petición se repite —por un corte de red o un reintento—, recibes la misma respuesta y no se crea un segundo DeCA.
7. Errores y límites
Los errores devuelven un código HTTP y un mensaje en español:
{ "error": { "code": "validation", "message": "Falta: NIF del cargador." } }401clave no válida o revocada ·403sin permiso o plan sin API404no existe en tu empresa ·409estado que no lo permite422datos incompletos o incorrectos (el mensaje dice qué falta)429más de 120 peticiones por minuto por clave, o más de 20 claves no válidas por minuto desde la misma dirección IP (se bloquea 10 minutos)
8. Datos personales
Los DeCA contienen datos de conductores. Usa la clave solo en tu servidor (nunca en una web o app pública), con HTTPS, y guarda solo lo que necesites. PorteListo actúa como encargado del tratamiento según el contrato de servicio.
9. Plugin para FacturaScripts
Si usas FacturaScripts (2025 o posterior), no hace falta programar: instala el plugin PorteListo, pega tu clave en Administrador → Conexiones PorteListo y en cada albarán de cliente tendrás una pestaña PorteListo. Como cargador eliges el transportista y emites el DeCA (y si no está conectado, se lo pides desde ahí); como transportista eliges además el conductor. Si el destino está fuera de España, la misma pestaña crea el CMR listo para imprimir y firmar. También puedes enviar el albarán a revisar, ver si el conductor lo ha recibido y anular. Descárgalo gratis en la tienda de plugins de FacturaScripts.
¿Vas a integrar otro programa (Dolibarr, Odoo u otro)? Escríbenos a info@portelisto.com y te ayudamos. Si eres cargador, mira también cómo emitir el DeCA desde tu programa de albaranes.