Versión 1.2. Descargar especificación OpenAPI · Power BI y Excel · Zapier, Make y n8n · Entorno de pruebas
URL base: https://app.zonnagps.es/api/public/v1. El administrador de la empresa crea sus claves en Ajustes → Integraciones del mapa, eligiendo los permisos que ZonnaGPS haya habilitado para su empresa; la clave se muestra una sola vez. Autenticación: Authorization: Bearer <clave>. Cada clave accede únicamente a su cliente. El permiso debe estar habilitado para el cliente y en los scopes de la clave. Las claves antiguas conservan solo lectura.
El límite por clave se comparte entre lectura y escritura. Las cabeceras X-RateLimit-Limit y X-RateLimit-Remaining indican el límite; un HTTP 429 incluye Retry-After. Los errores de validación devuelven HTTP 422, las referencias ajenas HTTP 404 y los permisos insuficientes HTTP 403.
| Método y ruta | Scope | Descripción |
|---|---|---|
GET /api/public/v1/drivers | drivers.list | Conductores del cliente, con búsqueda por nombre o NIF. |
POST /api/public/v1/drivers | drivers.create | Crear conductor del cliente. |
PATCH /api/public/v1/drivers/{id} | drivers.update | Editar conductor del cliente. |
DELETE /api/public/v1/drivers/{id} | drivers.deactivate | Desactivar conductor del cliente. |
POST /api/public/v1/places | places.create | Crear lugar del cliente. |
PATCH /api/public/v1/places/{id} | places.update | Editar lugar del cliente. |
DELETE /api/public/v1/places/{id} | places.delete | Desactivar lugar del cliente (no borra el historial). |
POST /api/public/v1/geofences | geofences.create | Crear geocerca del cliente. |
PATCH /api/public/v1/geofences/{id} | geofences.update | Editar geocerca del cliente. |
DELETE /api/public/v1/geofences/{id} | geofences.delete | Desactivar geocerca del cliente (no borra el historial). |
PUT /api/public/v1/assets/{id}/driver | assets.assign_driver | Asignar conductor del cliente. |
POST /api/public/v1/transport-documents | deca.drafts.create | Crear borrador DeCA del cliente. |
GET /api/public/v1/webhooks | webhooks.list | Suscripciones creadas con esta misma clave (REST Hook de Zapier, Make o n8n). |
POST /api/public/v1/webhooks | webhooks.create | Alta de una suscripción a eventos (REST Hook). Devuelve el secreto de firma una sola vez. |
DELETE /api/public/v1/webhooks/{id} | webhooks.delete | Baja de una suscripción creada con esta misma clave. |
GET /api/public/v1/reports/{dataset} | reports.read | Tablas planas paginadas en JSON o CSV: vehículos, indicadores diarios por vehículo y por conductor, alertas y DeCA emitidos. |
GET /api/public/v1/assets | assets.list | Listado paginado de los vehículos accesibles para el cliente. |
GET /api/public/v1/assets/{asset} | assets.read | Ficha y estado operativo de un vehículo concreto. |
GET /api/public/v1/assets/{asset}/position | positions.latest | Última posición y odómetro disponibles para el vehículo. |
GET /api/public/v1/assets/{asset}/positions | positions.history | Posiciones paginadas en un intervalo máximo de 31 días. |
GET /api/public/v1/alarms | alarms.list | Alarmas paginadas de los vehículos accesibles para el cliente. |
POST /api/public/v1/drivers
Authorization: Bearer <clave>
Content-Type: application/json
{"name":"Ana García","nif":"12345678Z","phone":"+34600000000"}
Las bajas de conductores son desactivaciones: conservan el historial, retiran la asignación manual y los identificadores de detección. Las geocercas de esta versión son circulares. Las altas y bajas de vehículos corresponden exclusivamente al superadministrador.
DeCA exige el módulo contratado y los campos del validador existente. Solo se crean borradores: no se emiten documentos, PDF ni firmas. Los solapamientos de conductor o vehículo devuelven HTTP 409.
Se gestionan desde Ajustes → Integraciones (o por API, ver más abajo). Desde allí puedes enviar un evento de prueba (test.ping, con "test": true; un solo intento que no cuenta para la desactivación) y ver las últimas veinte entregas. Solo se admiten endpoints HTTPS públicos en puerto 443. No se siguen redirecciones. El secreto se muestra una vez y se guarda cifrado. Los eventos son alert.triggered, geofence.enter, geofence.exit, deca.issued y vehicle.offline (cuando se dispara la regla de falta de comunicación del cliente).
{"id":"a304321c-1234-4567-8901-123456789012","event":"geofence.enter","occurred_at":"2026-10-18T10:00:00+00:00","data":{"id":12,"device_id":34,"geofence_id":56,"latitude":40.4,"longitude":-3.7}}
X-Zonna-Event-Id: a304321c-1234-4567-8901-123456789012 X-Zonna-Signature: t=1792317600,v1=<hexadecimal HMAC-SHA256>
Firma: hash_hmac('sha256', timestamp + '.' + cuerpo_original, secreto). Comprueba con comparación de tiempo constante, rechaza marcas de tiempo alejadas más de cinco minutos y deduplica por id del evento. La marca y firma se calculan de nuevo en cada intento; el cuerpo y el id se mantienen.
Cualquier respuesta 2xx confirma la entrega. Hasta seis intentos: esperas de 60, 300, 1800, 7200 y 21600 segundos. Tras doce intentos fallidos consecutivos se desactiva el endpoint («Desactivado por fallos» en Ajustes → Integraciones, con botón Reactivar); no se envía ningún correo. Un éxito reinicia el contador. Las entregas agotadas no se reenvían al reactivar. Se registran estado HTTP, intentos y fechas; no se guardan respuestas del receptor.
La recepción es al menos una vez: el consumidor debe ser idempotente.
Las plataformas de automatización dan de alta su URL al activar un flujo y la dan de baja al pararlo. Scopes webhooks.create, webhooks.list y webhooks.delete. Una clave solo ve y borra las suscripciones que creó ella misma; las reglas de URL (HTTPS público, puerto 443), firma y reintentos son las mismas que las del panel.
POST /api/public/v1/webhooks
Authorization: Bearer <clave>
Content-Type: application/json
{"url":"https://hooks.ejemplo.es/zonnagps","events":["geofence.enter","geofence.exit"]}
HTTP 201
{"data":{"id":7,"url":"https://hooks.ejemplo.es/zonnagps","events":["geofence.enter","geofence.exit"],"enabled":true,"status":"active","source":"api"},"secret":"<64 caracteres, solo ahora>"}
DELETE /api/public/v1/webhooks/7
Para buscar conductores (por ejemplo, antes de asignarlos): GET /api/public/v1/drivers?search=Ana o ?nif=12345678Z; los desactivados solo salen con include_inactive=1. Para buscar un vehículo por matrícula: GET /api/public/v1/assets?search=1234ABC.
Tablas planas de solo lectura con el scope reports.read: GET /api/public/v1/reports/{tabla}. Siempre del cliente de la clave y de los vehículos que tiene visibles.
| Tabla | Contenido | Filtro de fechas |
|---|---|---|
vehicles | Vehículos visibles para el cliente.asset_id, name, plate, identifier, device_type, provider, status, last_position_at | — |
vehicle-daily | Indicadores diarios por vehículo: km, horas, ralentí, fuera de horario, paradas, excesos, alertas, velocidad máxima, conductor principal y combustible.date, asset_id, vehicle_name, plate, km, active_hours, idle_hours, idle_source, out_of_hours_hours, stops, exceedances, alerts_total, max_speed_kph, first_move_at, last_move_at, main_driver_id, main_driver_name, fuel_used_l | Día |
driver-daily | Indicadores diarios por conductor y vehículo.date, driver_id, driver_name, asset_id, vehicle_name, plate, km, active_hours, idle_hours, out_of_hours_hours, exceedances, alerts_total, first_move_at, last_move_at | Día |
alerts | Alertas disparadas por las reglas del cliente.id, created_at, rule_name, condition_type, severity, status, asset_id, vehicle_name, plate | Fecha de la alerta |
deca | DeCA emitidos, en curso o terminados (sin el contenido legal del documento).id, reference, document_type, status, version, service_starts_at, service_ends_at, delivered_at, driver_id, driver_name, vehicle_plate | Inicio del servicio |
Parámetros: from y to (AAAA-MM-DD; por defecto los últimos 30 días; máximo 366 días por petición), page, per_page (por defecto 1000, máximo 5000 filas), format=json|csv (o cabecera Accept: text/csv) y delimiter=semicolon para Excel en español. Además del límite general de la clave, el enlace de datos admite 30 peticiones por minuto. Los indicadores diarios son de días cerrados (se calculan cada noche); el día en curso aparece al día siguiente. Las horas van en ISO 8601 y los decimales con punto.
JSON: {"data":[…],"meta":{"columns":[…],"current_page":1,"last_page":3,"total":12000,"next_page_url":"…"}}. CSV: UTF-8 con BOM, primera fila con los nombres de columna y la paginación en las cabeceras X-Total-Count, X-Page, X-Last-Page y Link: <…>; rel="next".
https://app.zonnagps.es/api/public/v1/reports/vehicle-daily?from=2026-10-01&to=2026-10-31&format=csv.Authorization = Bearer TU_CLAVE_DE_API.&delimiter=semicolon si tu Excel usa punto y coma) y la cabecera Authorization: Bearer TU_CLAVE_DE_API.La clave da acceso a los datos de tu empresa: no la compartas en libros que vayan a salir de ella. Lo más seguro es una clave dedicada solo con reports.read, que se revoca en Ajustes → Integraciones si el libro se filtra.
Las pruebas no se hacen con claves de producción: ZonnaGPS da acceso a https://pruebas.app.zonnagps.es con la empresa de demostración (datos ficticios), donde se crean claves y webhooks propios de ese entorno. Para cambiar de entorno basta con la URL base: https://pruebas.app.zonnagps.es/api/public/v1. Las claves de un entorno no valen en el otro.