Saltar al contenido
FlotaDoc

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

  • monthstringobligatorio

    Mes YYYY-MM.

    Patrón: ^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo: 2026-09

  • vehicleIdinteger | string | null

    Informe de ese vehículo. Ausente o null, el de toda la flota.

    integer: mínimo 1integer: máximo 9007199254740991string: 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).

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 admite Idempotency-Key y cada llamada crea un trabajo nuevo. Si no sabes si una petición llegó, consulta el exportId que 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 en error). Reintenta en unos minutos.

Petición

Cuerpo obligatorio

  • typestringobligatorio

    monthly_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_pdf trips_xlsx expenses_xlsx tickets_zip trips_csv expenses_csv

  • monthstringobligatorio

    Mes YYYY-MM.

    Patrón: ^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo: 2026-09

  • vehicleIdinteger | string | null

    Solo ese vehículo (también dado de baja). Ausente o null, toda la flota.

    integer: mínimo 1integer: máximo 9007199254740991string: 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).

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 | stringobligatorio

    El exportId que devolvió export-create.

    integer: mínimo 1integer: máximo 9007199254740991string: 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).

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

  1. Haz GET a url tal cual (sin cambiar ni volver a codificar nada) antes de que pasen los 300 s.
  2. No envíes la cabecera Authorization (ni tu clave API ni ninguna otra): la firma va en la propia URL y S3 rechaza con 400 una 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.
  3. La respuesta trae el fichero con Content-Type igual a contentType y Content-Disposition: attachment con el nombre filename.
  4. Si el enlace caduca, vuelve a llamar a export-download-url: el fichero sigue disponible hasta el expiresAt de export-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á en pending o running. Espera y consulta export-status.
  • 409 export_failed: el trabajo acabó en error (también uno atascado), o el fichero no coincide con su huella guardada y no se entrega. Pide uno nuevo con export-create.
  • 410 export_expired: pasaron los 7 días. Pide uno nuevo con export-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 | stringobligatorio

    El exportId que devolvió export-create.

    integer: mínimo 1integer: máximo 9007199254740991string: 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).

  • dataobject
    • urlstring (uri)

      GET prefirmado de Amazon S3. Úsalo tal cual y sin cabecera Authorization.

    • filenamestring

      Nombre con el que se descarga (Content-Disposition: attachment).

    • contentTypestring

      Content-Type del fichero.

    • expiresIninteger

      Segundos 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

  • kindstring

    Siempre vehicle

  • monthstring

    Mes YYYY-MM.

    Patrón: ^[0-9]{4}-(0[1-9]|1[0-2])$Ejemplo: 2026-09

  • El 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.

  • hasDataboolean

    false si el mes no tiene lecturas, viajes ni gastos.

  • Viajes cerrados del mes, por fecha, matrícula y hora de inicio.

  • expensesInformesExpense[]

    Gastos activos del mes de todos los tipos, por fecha, matrícula e id.

InformesFleetReportobject

InformesExportJobobject

Un trabajo de descarga.

  • exportIdinteger
  • typestring

    monthly_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_pdf trips_xlsx expenses_xlsx tickets_zip trips_csv expenses_csv

  • monthstring | null

    Mes pedido (YYYY-MM).

    Patrón: ^[0-9]{4}-(0[1-9]|1[0-2])$

  • vehicleIdinteger | null

    Vehículo pedido; null = toda la flota.

  • statusstring

    pending/running: generándose · done: listo · error: falló o lleva más de 15 minutos sin terminar · expired: pasaron los 7 días.

    Valores: pending running done error expired

  • errorCodestring | null

    Solo con error, un fallo que puedes resolver: export_too_large = los tickets no caben en un ZIP (pídelo por vehículo). null en cualquier otro caso.

    Valores: export_too_large

  • filenamestring | null

    Nombre del fichero (cuando terminó bien).

  • contentTypestring | null

    application/pdf, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/zip o text/csv; charset=utf-8.

  • sizeBytesinteger | null
  • createdAtstring (date-time)
  • finishedAtstring (date-time) | null
  • expiresAtstring (date-time) | null

    Hasta cuándo se puede descargar (solo con done).

  • sha256string | null

    Huella 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.

  • tripIdinteger
  • tenantIdinteger
  • userIdinteger

    Conductor.

  • userNamestring | null
  • vehicleIdinteger
  • vehiclePlatestring | null
  • statusstring

    recorded: registrado a mano; finished: iniciado y finalizado con la app.

    Valores: recorded finished

  • tripDatestring (date)

    Día fiscal del viaje (España).

  • startedAtstring (date-time) | null
  • endedAtstring (date-time) | null
  • originstring | null

    Hasta 200 caracteres

  • destinationstring | null

    Hasta 200 caracteres

  • originLatnumber | null

    Coordenadas y precisión (m) de inicio y fin; dato personal.

  • originLngnumber | null
  • originAccuracyMnumber | null
  • destinationLatnumber | null
  • destinationLngnumber | null
  • destinationAccuracyMnumber | null
  • distanceKmnumber | null

    Km declarados (el dato fiscal).

  • routeKmnumber | null

    Km de la ruta estimada.

  • routeDurationMininteger | null
  • odometerKminteger | null
  • reasonstring | null

    Motivo del viaje (texto libre).

    Hasta 500 caracteres

  • reasonCategoryIdinteger | null
  • reasonCategoryNamestring | null
  • costBasisstring

    km_rate: km × tarifa (vehículo propio); fuel: parte justificada del gasto real de energía (empresa o renting).

    Valores: km_rate fuel

  • kmRatenumber | null

    Tarifa copiada al viaje (euros/km). null en fuel.

  • amountnumber | null

    Km × tarifa. null en fuel.

  • consumptionL100kmnumber | null
  • trackKmnumber | null

    Km del recorrido grabado con la app (GPS).

  • trackGapKmnumber | null
  • hasSignatureboolean

    Tiene la firma del cliente.

  • correctedAtstring (date-time) | null

    Última corrección que cambió un dato fiscal. null si nunca.

  • activeboolean
  • updatedAtstring (date-time)
  • costnumber | null

    Coste oficial en euros: km_rate = amount; fuel = parte justificada (null si está pendiente).

  • costKindstring

    justified: parte justificada · provisional: sin lectura de fin de mes, su coste de consumo · allowance: kilometraje · pending: sin cifra todavía.

    Valores: justified provisional allowance pending

  • costPendingstring | null

    Por qué un viaje fuel aún no tiene importe justificado.

    Valores: missing_odometer_reading odometer_mismatch

  • provisionalCostnumber | null

    Solo con costKind: provisional.

  • justifiedAmountnumber | null

    Solo fuel: tickets del mes × km del viaje ÷ monthShareKm.

  • monthTicketsAmountnumber | null

    Solo fuel: tickets de energía del vehículo en el mes.

  • monthOdometerKmnumber | null

    Solo fuel: km del cuentakilómetros del mes.

  • monthShareKmnumber | null

    Solo fuel: km del reparto (los del cuentakilómetros, o los de los viajes si lo pasan dentro del margen de 1 km).

  • estimatedLitersnumber | null

    Solo fuel: litros por el consumo del viaje.

  • consumptionCostnumber | null

    Solo fuel: litros estimados × euros/litro.

  • fuelPricePerLiternumber | null
  • fuelPriceSourcestring | null

    Valores: month last_ticket

  • fuelPriceTicketDatestring (date) | null
  • alertLevelstring

    Semáforo del viaje.

    Valores: ok warn bad

  • alertReasonsstring[]

    Motivos del semáforo, en orden fijo (los rojos primero).

    Valores: open_too_long odometer_mismatch route_deviation corrected manual missing_consumption

  • evidencestring

    manual: registrado a mano · track: con recorrido grabado · gps: con punto de inicio o fin con precisión · time: solo las horas del servidor.

    Valores: manual track gps time

InformesTripTotalsobject

  • tripCountinteger
  • distanceKmnumber

    Km declarados de los viajes.

  • costnumber

    Suma de los cost que hay (partes justificadas y kilometraje); nunca el provisional.

  • pendingCostCountinteger

    Viajes sin coste todavía (no suman en cost).

InformesExpenseobject

Gasto activo del mes. La clave del ticket en el almacenamiento nunca sale.

  • expenseIdinteger
  • tenantIdinteger
  • vehicleIdinteger
  • vehiclePlatestring | null
  • userIdinteger

    Quién lo registró.

  • userNamestring | null
  • typestring

    Combustible, recarga, peaje, aparcamiento, mantenimiento, ITV, seguro, impuesto de circulación y renting.

    Valores: fuel ev_charge toll parking maintenance itv insurance vehicle_tax renting

  • addonstring | null

    Complemento del plan que exige el tipo; null = plan base.

    Valores: tolls_parking maintenance_itv insurance_tax_renting

  • expenseDatestring (date)
  • supplierNamestring | null
  • supplierTaxIdstring | null

    NIF del proveedor, normalizado (sin espacios, puntos ni guiones).

  • baseAmountnumber | null
  • vatRatenumber | null

    Tipo de IVA (%).

  • vatAmountnumber | null
  • totalAmountnumber
  • litersnumber | null

    Solo combustible.

  • kwhnumber | null

    Solo recarga.

  • odometerKminteger | null
  • notesstring | null
  • attachmentobject | null

    Ticket adjunto, o null sin ticket.

    • filenamestring
    • contentTypestring
    • sizeBytesinteger
  • ocrExtractionIdinteger | null
  • tripIdinteger | null

    Viaje al que va ligado (peajes y aparcamientos).

  • activeboolean
  • integrationobject | null

    Clave API con la que se registró, o null si lo registró una persona. En el informe, name y prefix llegan siempre a null.

    • apiKeyIdinteger
    • namestring | null
    • prefixstring | null
  • createdAtstring (date-time)
  • updatedAtstring (date-time)

InformesExpenseTotalsobject

Incluye todos los campos de InformesExpenseFigures.

InformesFleetReportVehicleobject

  • El 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.

  • hasDataboolean

    false si el mes del vehículo no tiene lecturas, viajes ni gastos.

InformesFleetTotalsobject

  • vehicleCountinteger
  • tripCountinteger
  • businessKmnumber
  • personalKmnumber

    Suma de los km personales que se conocen (meses que cuadran).

  • attributableCostnumber

    Suma de los costes atribuibles que hay, en euros.

  • pendingCostVehicleCountinteger

    Vehículos con el coste atribuible pendiente (falta una lectura o no cuadra).

InformesExpenseFiguresobject

  • expenseCountinteger
  • baseAmountnumber

    Suma de las bases que hay (ver withoutBreakdown).

  • vatAmountnumber

    Suma de las cuotas de IVA que hay.

  • totalAmountnumber
  • litersnumber
  • kwhnumber
  • withoutTicketinteger

    Gastos sin ticket adjunto.

  • withoutBreakdowninteger

    Gastos sin base o sin cuota de IVA (su total no está desglosado).

InformesExpenseTypeTotalobject

Incluye todos los campos de InformesExpenseFigures.

  • typestring

    Combustible, recarga, peaje, aparcamiento, mantenimiento, ITV, seguro, impuesto de circulación y renting.

    Valores: fuel ev_charge toll parking maintenance itv insurance vehicle_tax renting

¿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.

Habla con nosotros