API para integraciones
Informes
Informe mensual y descargas asíncronas (Excel, ZIP de tickets, PDF).
En esta página
Informe mensual de un vehículo o de la flota
POST/movimientos/informes/monthly-report
- Permiso
lectura
Informe mensual de un vehículo (con vehicleId) o de toda la flota (sin él): lo que se
presenta a la asesoría. Es la misma información que la pantalla Informes y que las descargas.
kind: vehicle: el mes del vehículo (period, el mismo objeto que en cierres), los viajes cerrados del mes (finalizados o registrados a mano; ni en curso ni anulados) con su coste y su evidencia, los gastos activos del mes de todos los tipos y sus totales por tipo con base, IVA y total. Un vehículo dado de baja también sale (histórico fiscal).kind: fleet: una fila por vehículo (activos y de baja con algo en el mes) con su mes y sus gastos por tipo, los gastos por tipo de la flota y los totales. No trae la lista de viajes ni de gastos: pídelos por vehículo o descarga el libro de viajes y los gastos en Excel (export-create).
Sin paginación: el mes entero en una respuesta. Importes en euros con 2 decimales; los totales se suman en céntimos, así que cada total es la suma exacta de las cifras que se enseñan. El informe no calcula deducciones: FlotaDoc no garantiza la deducción.
Con clave API recibes la versión del owner, la completa: los viajes llevan las coordenadas de
inicio y fin y su precisión (la asesoría, rol gestor, las recibe a null). Trátalas como datos
personales. Solo lectura: funciona también con la cuenta en solo lectura.
Errores propios
404 vehicle_not_found: el vehículo no existe o no es de tu empresa.422 invalid_input:month:required·invalid;vehicleId:invalid; cualquier otro campo:unexpected_field.
Petición
Cuerpo obligatorio
monthstringobligatorioMes
YYYY-MM.Patrón:
^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo:2026-09vehicleIdinteger | string | nullInforme de ese vehículo. Ausente o
null, el de toda la flota.integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$Ejemplo:7
Ejemplo: Informe de un vehículo
curl -sS -X POST "https://app.flotadoc.com/api/movimientos/informes/monthly-report" \
-H "Authorization: Bearer $FLOTADOC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"month": "2026-09",
"vehicleId": 7
}'
Otro ejemplo: Informe de toda la flota
{
"month": "2026-09"
}
Respuesta
200
El informe del mes (kind dice si es de un vehículo o de la flota).
Cabeceras
X-Request-Idstring (uuid)Id de la petición en el historial de la empresa (para soporte).
dataobjectLa opción depende del valor de
kind.
Ejemplo de respuesta: Informe de un vehículo
{
"data": {
"report": {
"kind": "vehicle",
"month": "2026-09",
"period": {
"vehicleId": 7,
"month": "2026-09",
"regime": "company",
"energy": "combustion",
"vehicleSince": "2026-01",
"periodId": 31,
"status": "open",
"odometerStartKm": null,
"odometerEndKm": 12000,
"previousEndKm": 10000,
"effectiveStartKm": 10000,
"totalKm": 2000,
"businessKm": 1500,
"personalKm": 500,
"professionalPct": 75,
"tripCount": 3,
"fuelTripCount": 3,
"fuelTripsKm": 1500,
"fuelLiters": 130,
"chargeKwh": 0,
"energyAmount": 200,
"energyExpenseCount": 3,
"expenseCount": 4,
"expensesWithoutTicket": 1,
"fuelPricePerLiter": 1.538,
"fuelPriceSource": "month",
"fuelPriceTicketDate": null,
"justifiedAmount": 150,
"allowanceAmount": 0,
"attributableCost": 150,
"provisionalAmount": 0,
"estimatedLiters": 97.5,
"litersDifference": 32.5,
"unconsumedTripCount": 0,
"issues": [],
"coherent": true,
"complete": true,
"closable": true,
"closedAt": null,
"closedByUserId": null,
"updatedByUserId": 10,
"updatedAt": "2026-10-01T08:00:00.000Z",
"openTrips": 0,
"warnTrips": 1,
"badTrips": 0,
"suggestedOdometerEndKm": 11950,
"suggestedOdometerSource": "expense",
"suggestedOdometerDate": "2026-09-27",
"today": "2026-10-13",
"plate": "1111AAA",
"model": "Seat León",
"vehicleActive": true,
"closeState": "with_warnings",
"alertLevel": "warn"
},
"hasData": true,
"trips": [
{
"tripId": 970,
"tenantId": 4,
"userId": 12,
"userName": "Ana Conductora",
"vehicleId": 7,
"vehiclePlate": "1111AAA",
"status": "finished",
"tripDate": "2026-09-03",
"startedAt": "2026-09-03T06:02:11.000Z",
"endedAt": "2026-09-03T10:48:40.000Z",
"origin": "Oficina Vigo",
"destination": "Cliente Valladolid",
"originLat": 42.2328,
"originLng": -8.7226,
"originAccuracyM": 12.5,
"destinationLat": 41.6523,
"destinationLng": -4.7245,
"destinationAccuracyM": 8,
"distanceKm": 500,
"routeKm": 489.3,
"routeDurationMin": 285,
"odometerKm": 10500,
"reason": "Visita comercial y entrega de material",
"reasonCategoryId": 3,
"reasonCategoryName": "Visita a cliente",
"costBasis": "fuel",
"kmRate": null,
"amount": null,
"consumptionL100km": 6.5,
"trackKm": null,
"trackGapKm": null,
"hasSignature": false,
"correctedAt": null,
"active": true,
"updatedAt": "2026-09-03T10:48:41.000Z",
"cost": 50,
"costKind": "justified",
"costPending": null,
"provisionalCost": null,
"justifiedAmount": 50,
"monthTicketsAmount": 200,
"monthOdometerKm": 2000,
"monthShareKm": 2000,
"estimatedLiters": 32.5,
"consumptionCost": 49.99,
"fuelPricePerLiter": 1.538,
"fuelPriceSource": "month",
"fuelPriceTicketDate": null,
"alertLevel": "ok",
"alertReasons": [],
"evidence": "gps"
}
],
"tripTotals": {
"tripCount": 3,
"distanceKm": 1500,
"cost": 150,
"pendingCostCount": 0
},
"expenses": [
{
"expenseId": 81,
"tenantId": 4,
"vehicleId": 7,
"vehiclePlate": "1111AAA",
"userId": 12,
"userName": "Ana Conductora",
"type": "fuel",
"addon": null,
"expenseDate": "2026-09-02",
"supplierName": "Estación de Servicio Ejemplo",
"supplierTaxId": "B12345678",
"baseAmount": 49.59,
"vatRate": 21,
"vatAmount": 10.41,
"totalAmount": 60,
"liters": 39.012,
"kwh": null,
"odometerKm": 10120,
"notes": null,
"attachment": {
"filename": "ticket-0902.pdf",
"contentType": "application/pdf",
"sizeBytes": 184320
},
"ocrExtractionId": 55,
"tripId": null,
"active": true,
"integration": null,
"createdAt": "2026-09-02T18:20:00.000Z",
"updatedAt": "2026-09-02T18:20:00.000Z"
}
],
"expenseTotals": {
"expenseCount": 4,
"baseAmount": 265.29,
"vatAmount": 55.71,
"totalAmount": 321,
"liters": 130,
"kwh": 0,
"withoutTicket": 1,
"withoutBreakdown": 0,
"byType": [
{
"type": "fuel",
"expenseCount": 3,
"baseAmount": 165.29,
"vatAmount": 34.71,
"totalAmount": 200,
"liters": 130,
"kwh": 0,
"withoutTicket": 0,
"withoutBreakdown": 0
},
{
"type": "maintenance",
"expenseCount": 1,
"baseAmount": 100,
"vatAmount": 21,
"totalAmount": 121,
"liters": 0,
"kwh": 0,
"withoutTicket": 1,
"withoutBreakdown": 0
}
]
}
}
}
}
Ejemplo de respuesta: Informe de la flota
{
"data": {
"report": {
"kind": "fleet",
"month": "2026-09",
"vehicles": [
{
"period": {
"vehicleId": 7,
"month": "2026-09",
"regime": "company",
"energy": "combustion",
"vehicleSince": "2026-01",
"periodId": 31,
"status": "open",
"odometerStartKm": null,
"odometerEndKm": 12000,
"previousEndKm": 10000,
"effectiveStartKm": 10000,
"totalKm": 2000,
"businessKm": 1500,
"personalKm": 500,
"professionalPct": 75,
"tripCount": 3,
"fuelTripCount": 3,
"fuelTripsKm": 1500,
"fuelLiters": 130,
"chargeKwh": 0,
"energyAmount": 200,
"energyExpenseCount": 3,
"expenseCount": 4,
"expensesWithoutTicket": 1,
"fuelPricePerLiter": 1.538,
"fuelPriceSource": "month",
"fuelPriceTicketDate": null,
"justifiedAmount": 150,
"allowanceAmount": 0,
"attributableCost": 150,
"provisionalAmount": 0,
"estimatedLiters": 97.5,
"litersDifference": 32.5,
"unconsumedTripCount": 0,
"issues": [],
"coherent": true,
"complete": true,
"closable": true,
"closedAt": null,
"closedByUserId": null,
"updatedByUserId": 10,
"updatedAt": "2026-10-01T08:00:00.000Z",
"openTrips": 0,
"warnTrips": 1,
"badTrips": 0,
"suggestedOdometerEndKm": 11950,
"suggestedOdometerSource": "expense",
"suggestedOdometerDate": "2026-09-27",
"today": "2026-10-13",
"plate": "1111AAA",
"model": "Seat León",
"vehicleActive": true,
"closeState": "with_warnings",
"alertLevel": "warn"
},
"hasData": true,
"expenseTotals": {
"expenseCount": 4,
"baseAmount": 265.29,
"vatAmount": 55.71,
"totalAmount": 321,
"liters": 130,
"kwh": 0,
"withoutTicket": 1,
"withoutBreakdown": 0,
"byType": [
{
"type": "fuel",
"expenseCount": 3,
"baseAmount": 165.29,
"vatAmount": 34.71,
"totalAmount": 200,
"liters": 130,
"kwh": 0,
"withoutTicket": 0,
"withoutBreakdown": 0
},
{
"type": "maintenance",
"expenseCount": 1,
"baseAmount": 100,
"vatAmount": 21,
"totalAmount": 121,
"liters": 0,
"kwh": 0,
"withoutTicket": 1,
"withoutBreakdown": 0
}
]
}
}
],
"expenseTotals": {
"expenseCount": 4,
"baseAmount": 265.29,
"vatAmount": 55.71,
"totalAmount": 321,
"liters": 130,
"kwh": 0,
"withoutTicket": 1,
"withoutBreakdown": 0,
"byType": [
{
"type": "fuel",
"expenseCount": 3,
"baseAmount": 165.29,
"vatAmount": 34.71,
"totalAmount": 200,
"liters": 130,
"kwh": 0,
"withoutTicket": 0,
"withoutBreakdown": 0
},
{
"type": "maintenance",
"expenseCount": 1,
"baseAmount": 100,
"vatAmount": 21,
"totalAmount": 121,
"liters": 0,
"kwh": 0,
"withoutTicket": 1,
"withoutBreakdown": 0
}
]
},
"totals": {
"vehicleCount": 1,
"tripCount": 3,
"businessKm": 1500,
"personalKm": 500,
"attributableCost": 150,
"pendingCostVehicleCount": 0
}
}
}
}
Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.
Pedir una descarga del mes (asíncrona)
POST/movimientos/informes/export-create
- Permiso
lectura
Pide una descarga del mes. El fichero se genera en el servidor de forma asíncrona: la
respuesta llega enseguida (202) con el trabajo en pending y su exportId; después consulta
export-status hasta que esté done y pide el enlace con export-download-url.
type |
Fichero | Contenido |
|---|---|---|
monthly_pdf |
informe[-MATRÍCULA]-AAAA-MM.pdf |
Informe mensual en PDF: empresa, estado del cierre, cifras, gastos por tipo, viajes y gastos (en la flota, el resumen y un capítulo por vehículo con datos). Lleva el aviso legal. |
trips_xlsx |
libro-viajes[-MATRÍCULA]-AAAA-MM.xlsx |
Libro de viajes en Excel: los viajes cerrados del mes, 33 columnas (36 y las hojas «Viajes anulados» y «Registros inalterables» si la empresa tiene los registros inalterables). |
expenses_xlsx |
gastos[-MATRÍCULA]-AAAA-MM.xlsx |
Gastos del mes en Excel: hoja «Gastos» y hoja «Resumen» con los totales por tipo. |
tickets_zip |
tickets[-MATRÍCULA]-AAAA-MM.zip |
Un fichero por gasto con ticket más indice.xlsx con todos los gastos del mes. Hasta 400 MB de tickets: si no caben, el trabajo acaba en error con errorCode: export_too_large (pídelo por vehículo). |
trips_csv, expenses_csv |
….csv |
Heredados (versiones antiguas de la app). Se retirarán: usa los Excel. |
Sin vehicleId, toda la flota; con él, ese vehículo (también si está dado de baja). La matrícula
del nombre del fichero va sin espacios ni guiones. Son las mismas cifras que monthly-report.
Con clave API
- Es una operación de
lectura: no admiteIdempotency-Keyy cada llamada crea un trabajo nuevo. Si no sabes si una petición llegó, consulta elexportIdque ya tienes en vez de repetirla. - La descarga es del owner que creó la clave: solo la consultan ese owner y sus claves. Para
cualquier otro usuario,
404 export_not_found. - Recibes la versión completa del owner: el libro de viajes lleva las coordenadas (la del gestor no).
- La generación y cada descarga quedan auditadas a nombre del owner. Funciona también con la cuenta en solo lectura.
Errores propios
404 vehicle_not_found: el vehículo no existe o no es de tu empresa.422 invalid_input:type:required·invalid;month:required·invalid;vehicleId:invalid; cualquier otro campo:unexpected_field.503 export_unavailable: no se ha podido lanzar la generación (si el trabajo llegó a crearse, queda enerror). Reintenta en unos minutos.
Petición
Cuerpo obligatorio
typestringobligatoriomonthly_pdf: informe mensual en PDF ·trips_xlsx: libro de viajes en Excel ·expenses_xlsx: gastos en Excel ·tickets_zip: ZIP de tickets con índice en Excel ·trips_csv,expenses_csv: heredados, se retirarán (usa los Excel).Valores:
monthly_pdftrips_xlsxexpenses_xlsxtickets_ziptrips_csvexpenses_csvmonthstringobligatorioMes
YYYY-MM.Patrón:
^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo:2026-09vehicleIdinteger | string | nullSolo ese vehículo (también dado de baja). Ausente o
null, toda la flota.integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$Ejemplo:7
Ejemplo: Libro de viajes de un vehículo
curl -sS -X POST "https://app.flotadoc.com/api/movimientos/informes/export-create" \
-H "Authorization: Bearer $FLOTADOC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "trips_xlsx",
"month": "2026-09",
"vehicleId": 7
}'
Otro ejemplo: Informe en PDF de toda la flota
{
"type": "monthly_pdf",
"month": "2026-09"
}
Respuesta
202
Trabajo creado en pending. Consulta export-status con su exportId.
Cabeceras
X-Request-Idstring (uuid)Id de la petición en el historial de la empresa (para soporte).
dataobjectexportInformesExportJobEl trabajo recién creado, en
pending.
Ejemplo de respuesta
{
"data": {
"export": {
"exportId": 77,
"type": "trips_xlsx",
"month": "2026-09",
"vehicleId": 7,
"status": "pending",
"errorCode": null,
"filename": null,
"contentType": null,
"sizeBytes": null,
"createdAt": "2026-10-13T09:00:00.000Z",
"finishedAt": null,
"expiresAt": null,
"sha256": null
}
}
}
Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.
Estado de una descarga
POST/movimientos/informes/export-status
- Permiso
lectura
Estado de una descarga pedida con export-create.
status |
Qué significa | Qué hacer |
|---|---|---|
pending, running |
Se está generando. | Vuelve a preguntar dentro de unos segundos (cada 2-5 s). |
done |
Listo hasta expiresAt (7 días desde finishedAt). |
Pide el enlace con export-download-url. |
error |
No se pudo generar, o lleva más de 15 minutos sin terminar. | Con errorCode: export_too_large, pide el ZIP por vehículo. Con errorCode: null, vuelve a pedirla con export-create. |
expired |
Pasaron los 7 días: el fichero ya no existe. | Vuelve a pedirla con export-create. |
filename, contentType y sizeBytes llegan cuando el trabajo terminó bien (done; se mantienen
en expired). sha256 solo llega con done, en el PDF mensual y el libro de viajes en Excel de
una empresa con registros inalterables: es la huella del fichero, para comprobar después que es el
que entregó FlotaDoc. El motivo interno de un fallo nunca sale de la API.
Cada consulta cuenta para el límite por minuto de la clave: no preguntes más de una vez cada 2 segundos.
Errores propios
404 export_not_found: el trabajo no existe, no es una descarga de informes o lo pidió otro usuario.422 invalid_input:exportId:required·invalid; cualquier otro campo:unexpected_field.
Petición
Cuerpo obligatorio
exportIdinteger | stringobligatorioEl
exportIdque devolvióexport-create.integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$Ejemplo:7
Ejemplo
curl -sS -X POST "https://app.flotadoc.com/api/movimientos/informes/export-status" \
-H "Authorization: Bearer $FLOTADOC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"exportId": 77
}'
Respuesta
200
El trabajo con su estado.
Cabeceras
X-Request-Idstring (uuid)Id de la petición en el historial de la empresa (para soporte).
dataobjectexportInformesExportJobUn trabajo de descarga.
Ejemplo de respuesta
{
"data": {
"export": {
"exportId": 77,
"type": "trips_xlsx",
"month": "2026-09",
"vehicleId": 7,
"status": "done",
"errorCode": null,
"filename": "libro-viajes-1111AAA-2026-09.xlsx",
"contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"sizeBytes": 18432,
"createdAt": "2026-10-13T09:00:00.000Z",
"finishedAt": "2026-10-13T09:00:06.000Z",
"expiresAt": "2026-10-20T09:00:06.000Z",
"sha256": "9f2c4e7a1b3d5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6e41a"
}
}
}
Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.
Enlace de descarga de un fichero listo
POST/movimientos/informes/export-download-url
- Permiso
lectura
Firma un enlace para descargar el fichero de un trabajo en done. Es un GET prefirmado de
Amazon S3 que vale 300 segundos (expiresIn).
Cómo descargar
- Haz
GETaurltal cual (sin cambiar ni volver a codificar nada) antes de que pasen los 300 s. - No envíes la cabecera
Authorization(ni tu clave API ni ninguna otra): la firma va en la propia URL y S3 rechaza con400una petición que lleve además otra autenticación. Si tu cliente HTTP añade la clave a todas las peticiones, usa otro cliente o quítala para esta. No hace falta ninguna cabecera. - La respuesta trae el fichero con
Content-Typeigual acontentTypeyContent-Disposition: attachmentcon el nombrefilename. - Si el enlace caduca, vuelve a llamar a
export-download-url: el fichero sigue disponible hasta elexpiresAtdeexport-status(7 días). Cada llamada queda auditada.
Mientras vale, la URL da acceso al fichero a quien la tenga: no la registres en logs ni la compartas.
Con registros inalterables, el PDF mensual o el libro de viajes de un mes cerrado se guarda en
el archivo inalterable en su primera descarga, antes de firmar el enlace; un fallo pasajero al
archivar responde 503 export_unavailable (reintenta).
Errores propios
404 export_not_found: el trabajo no existe, no es una descarga de informes o lo pidió otro usuario.409 export_not_ready: aún está enpendingorunning. Espera y consultaexport-status.409 export_failed: el trabajo acabó enerror(también uno atascado), o el fichero no coincide con su huella guardada y no se entrega. Pide uno nuevo conexport-create.410 export_expired: pasaron los 7 días. Pide uno nuevo conexport-create.422 invalid_input:exportId:required·invalid; cualquier otro campo:unexpected_field.503 export_unavailable: no se ha podido firmar o archivar ahora. Reintenta en unos segundos.
Petición
Cuerpo obligatorio
exportIdinteger | stringobligatorioEl
exportIdque devolvióexport-create.integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$Ejemplo:7
Ejemplo
curl -sS -X POST "https://app.flotadoc.com/api/movimientos/informes/export-download-url" \
-H "Authorization: Bearer $FLOTADOC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"exportId": 77
}'
Respuesta
200
Enlace prefirmado de descarga (300 s).
Cabeceras
X-Request-Idstring (uuid)Id de la petición en el historial de la empresa (para soporte).
dataobjecturlstring (uri)GET prefirmado de Amazon S3. Úsalo tal cual y sin cabecera
Authorization.filenamestringNombre con el que se descarga (
Content-Disposition: attachment).contentTypestringContent-Typedel fichero.expiresInintegerSegundos que vale
url.Siempre
300
Ejemplo de respuesta
{
"data": {
"url": "https://flotadoc-documentos-ejemplo.s3.eu-west-1.amazonaws.com/4/exports/77/libro-viajes-1111AAA-2026-09.xlsx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20261013T090010Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=3f1d9c0a7b2e4d6f8a1c3e5b7d9f0a2c4e6b8d0f1a3c5e7b9d1f3a5c7e9b0d2f4",
"filename": "libro-viajes-1111AAA-2026-09.xlsx",
"contentType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"expiresIn": 300
}
}
410
La descarga caducó (export_expired): pasaron los 7 días. Pide una nueva con export-create.
Cabeceras
X-Request-Idstring (uuid)Id de la petición en el historial de la empresa (para soporte).
Cuerpo con el formato de los errores.
Ejemplo de respuesta
{
"error": {
"code": "export_expired",
"message": "La descarga ha caducado: vuelve a pedirla"
}
}
Además, las respuestas comunes: 401, 403, 404, 409, 422, 429, 503.
Modelos
Objetos que devuelven o reciben las operaciones de esta área. Cada campo enlaza a su modelo.
InformesVehicleReportobject
kindstringSiempre
vehiclemonthstringMes
YYYY-MM.Patrón:
^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo:2026-09periodCierresVehiclePeriodEl mes de un vehículo: lecturas, resumen calculado al leer, estado del cierre y semáforo. Importes en euros, km con 2 decimales como mucho. Un mes cerrado trae sus cifras congeladas.
hasDatabooleanfalsesi el mes no tiene lecturas, viajes ni gastos.tripsInformesTrip[]Viajes cerrados del mes, por fecha, matrícula y hora de inicio.
tripTotalsInformesTripTotalsexpensesInformesExpense[]Gastos activos del mes de todos los tipos, por fecha, matrícula e id.
expenseTotalsInformesExpenseTotals
InformesFleetReportobject
kindstringSiempre
fleetmonthstringMes
YYYY-MM.Patrón:
^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo:2026-09vehiclesInformesFleetReportVehicle[]Vehículos activos y los de baja con algo en el mes, por matrícula.
expenseTotalsInformesExpenseTotalstotalsInformesFleetTotals
InformesExportJobobject
Un trabajo de descarga.
exportIdintegertypestringmonthly_pdf: informe mensual en PDF ·trips_xlsx: libro de viajes en Excel ·expenses_xlsx: gastos en Excel ·tickets_zip: ZIP de tickets con índice en Excel ·trips_csv,expenses_csv: heredados, se retirarán (usa los Excel).Valores:
monthly_pdftrips_xlsxexpenses_xlsxtickets_ziptrips_csvexpenses_csvmonthstring | nullMes pedido (
YYYY-MM).Patrón:
^[0-9]{4}-(0[1-9]|1[0-2])$vehicleIdinteger | nullVehículo pedido;
null= toda la flota.statusstringpending/running: generándose ·done: listo ·error: falló o lleva más de 15 minutos sin terminar ·expired: pasaron los 7 días.Valores:
pendingrunningdoneerrorexpirederrorCodestring | nullSolo con
error, un fallo que puedes resolver:export_too_large= los tickets no caben en un ZIP (pídelo por vehículo).nullen cualquier otro caso.Valores:
export_too_largefilenamestring | nullNombre del fichero (cuando terminó bien).
contentTypestring | nullapplication/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/zipotext/csv; charset=utf-8.sizeBytesinteger | nullcreatedAtstring (date-time)finishedAtstring (date-time) | nullexpiresAtstring (date-time) | nullHasta cuándo se puede descargar (solo con
done).sha256string | nullHuella SHA-256 del fichero (solo con
done, en el PDF mensual y el libro de viajes en Excel con registros inalterables).Patrón:
^[0-9a-f]{64}$
InformesTripobject
Viaje cerrado del mes con su coste, su semáforo y su evidencia.
tripIdintegertenantIdintegeruserIdintegerConductor.
userNamestring | nullvehicleIdintegervehiclePlatestring | nullstatusstringrecorded: registrado a mano;finished: iniciado y finalizado con la app.Valores:
recordedfinishedtripDatestring (date)Día fiscal del viaje (España).
startedAtstring (date-time) | nullendedAtstring (date-time) | nulloriginstring | nullHasta 200 caracteres
destinationstring | nullHasta 200 caracteres
originLatnumber | nullCoordenadas y precisión (m) de inicio y fin; dato personal.
originLngnumber | nulloriginAccuracyMnumber | nulldestinationLatnumber | nulldestinationLngnumber | nulldestinationAccuracyMnumber | nulldistanceKmnumber | nullKm declarados (el dato fiscal).
routeKmnumber | nullKm de la ruta estimada.
routeDurationMininteger | nullodometerKminteger | nullreasonstring | nullMotivo del viaje (texto libre).
Hasta 500 caracteres
reasonCategoryIdinteger | nullreasonCategoryNamestring | nullcostBasisstringkm_rate: km × tarifa (vehículo propio);fuel: parte justificada del gasto real de energía (empresa o renting).Valores:
km_ratefuelkmRatenumber | nullTarifa copiada al viaje (euros/km).
nullenfuel.amountnumber | nullKm × tarifa.
nullenfuel.consumptionL100kmnumber | nulltrackKmnumber | nullKm del recorrido grabado con la app (GPS).
trackGapKmnumber | nullhasSignaturebooleanTiene la firma del cliente.
correctedAtstring (date-time) | nullÚltima corrección que cambió un dato fiscal.
nullsi nunca.activebooleanupdatedAtstring (date-time)costnumber | nullCoste oficial en euros:
km_rate=amount;fuel= parte justificada (nullsi está pendiente).costKindstringjustified: parte justificada ·provisional: sin lectura de fin de mes, su coste de consumo ·allowance: kilometraje ·pending: sin cifra todavía.Valores:
justifiedprovisionalallowancependingcostPendingstring | nullPor qué un viaje
fuelaún no tiene importe justificado.Valores:
missing_odometer_readingodometer_mismatchprovisionalCostnumber | nullSolo con
costKind: provisional.justifiedAmountnumber | nullSolo
fuel: tickets del mes × km del viaje ÷monthShareKm.monthTicketsAmountnumber | nullSolo
fuel: tickets de energía del vehículo en el mes.monthOdometerKmnumber | nullSolo
fuel: km del cuentakilómetros del mes.monthShareKmnumber | nullSolo
fuel: km del reparto (los del cuentakilómetros, o los de los viajes si lo pasan dentro del margen de 1 km).estimatedLitersnumber | nullSolo
fuel: litros por el consumo del viaje.consumptionCostnumber | nullSolo
fuel: litros estimados × euros/litro.fuelPricePerLiternumber | nullfuelPriceSourcestring | nullValores:
monthlast_ticketfuelPriceTicketDatestring (date) | nullalertLevelstringSemáforo del viaje.
Valores:
okwarnbadalertReasonsstring[]Motivos del semáforo, en orden fijo (los rojos primero).
Valores:
open_too_longodometer_mismatchroute_deviationcorrectedmanualmissing_consumptionevidencestringmanual: registrado a mano ·track: con recorrido grabado ·gps: con punto de inicio o fin con precisión ·time: solo las horas del servidor.Valores:
manualtrackgpstime
InformesTripTotalsobject
tripCountintegerdistanceKmnumberKm declarados de los viajes.
costnumberSuma de los
costque hay (partes justificadas y kilometraje); nunca el provisional.pendingCostCountintegerViajes sin coste todavía (no suman en
cost).
InformesExpenseobject
Gasto activo del mes. La clave del ticket en el almacenamiento nunca sale.
expenseIdintegertenantIdintegervehicleIdintegervehiclePlatestring | nulluserIdintegerQuién lo registró.
userNamestring | nulltypestringCombustible, recarga, peaje, aparcamiento, mantenimiento, ITV, seguro, impuesto de circulación y renting.
Valores:
fuelev_chargetollparkingmaintenanceitvinsurancevehicle_taxrentingaddonstring | nullComplemento del plan que exige el tipo;
null= plan base.Valores:
tolls_parkingmaintenance_itvinsurance_tax_rentingexpenseDatestring (date)supplierNamestring | nullsupplierTaxIdstring | nullNIF del proveedor, normalizado (sin espacios, puntos ni guiones).
baseAmountnumber | nullvatRatenumber | nullTipo de IVA (%).
vatAmountnumber | nulltotalAmountnumberlitersnumber | nullSolo combustible.
kwhnumber | nullSolo recarga.
odometerKminteger | nullnotesstring | nullattachmentobject | nullTicket adjunto, o
nullsin ticket.filenamestringcontentTypestringsizeBytesinteger
ocrExtractionIdinteger | nulltripIdinteger | nullViaje al que va ligado (peajes y aparcamientos).
activebooleanintegrationobject | nullClave API con la que se registró, o
nullsi lo registró una persona. En el informe,nameyprefixllegan siempre anull.apiKeyIdintegernamestring | nullprefixstring | null
createdAtstring (date-time)updatedAtstring (date-time)
InformesExpenseTotalsobject
Incluye todos los campos de InformesExpenseFigures.
byTypeInformesExpenseTypeTotal[]Solo los tipos con gastos, en el orden del catálogo de tipos.
InformesFleetReportVehicleobject
periodCierresVehiclePeriodEl mes de un vehículo: lecturas, resumen calculado al leer, estado del cierre y semáforo. Importes en euros, km con 2 decimales como mucho. Un mes cerrado trae sus cifras congeladas.
hasDatabooleanfalsesi el mes del vehículo no tiene lecturas, viajes ni gastos.expenseTotalsInformesExpenseTotals
InformesFleetTotalsobject
vehicleCountintegertripCountintegerbusinessKmnumberpersonalKmnumberSuma de los km personales que se conocen (meses que cuadran).
attributableCostnumberSuma de los costes atribuibles que hay, en euros.
pendingCostVehicleCountintegerVehículos con el coste atribuible pendiente (falta una lectura o no cuadra).
InformesExpenseFiguresobject
expenseCountintegerbaseAmountnumberSuma de las bases que hay (ver
withoutBreakdown).vatAmountnumberSuma de las cuotas de IVA que hay.
totalAmountnumberlitersnumberkwhnumberwithoutTicketintegerGastos sin ticket adjunto.
withoutBreakdownintegerGastos sin base o sin cuota de IVA (su total no está desglosado).
InformesExpenseTypeTotalobject
Incluye todos los campos de InformesExpenseFigures.
typestringCombustible, recarga, peaje, aparcamiento, mantenimiento, ITV, seguro, impuesto de circulación y renting.
Valores:
fuelev_chargetollparkingmaintenanceitvinsurancevehicle_taxrenting
¿Quieres conectar tu sistema?
Cuéntanos qué quieres integrar y lo vemos en una llamada: qué datos necesitas, con qué permisos y cada cuánto.
Si tu empresa ya usa FlotaDoc, el titular puede pedir el acceso desde la web, en Mi cuenta › Integraciones.