Saltar al contenido
FlotaDoc

API para integraciones

Flota

Vehículos, modelos de la empresa y asignación de conductores.

En esta página

Lista los vehículos

POST/movimientos/flota/list

  • Permiso lectura

Devuelve los vehículos de la empresa, ordenados por matrícula (y por id a igual matrícula).

Con una clave API la llamada actúa como el owner que creó la clave: ve toda la flota y cada vehículo trae siempre drivers (sus conductores activos, por nombre; [] en los variables).

  • mine: true limita la lista a los vehículos que puede conducir el owner que creó la clave: los variables (pool) y los fijos (fixed) en los que figura como conductor.
  • includeInactive: true añade los vehículos dados de baja (active: false), p. ej. para cuadrar el informe de un mes antiguo. Junto con mine: true no añade nada: un vehículo de baja no lo puede conducir nadie.
  • Sin paginación: devuelve todos los vehículos en una sola respuesta.
  • El cuerpo es opcional: sin cuerpo (o {}) equivale a mine: false e includeInactive: false.

Errores propios

  • 422 invalid_input: el cuerpo no es un objeto JSON (sin fields); mine o includeInactive no son booleanos (fields.<campo>: invalid); clave no admitida (fields.<clave>: unexpected_field).

Petición

Cuerpo opcional

  • mineboolean | null

    Solo los vehículos que puede conducir el owner que creó la clave (variables y fijos en los que figura como conductor). null = false.

    Por defecto: false

  • includeInactiveboolean | null

    Añade los dados de baja (active: false). No tiene efecto junto con mine: true. null = false.

    Por defecto: false

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/list" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "includeInactive": false
  }'

Respuesta

200

Vehículos de la empresa.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • dataobject
    • vehiclesFlotaVehicle[]

      Todos los vehículos, por matrícula. Sin paginación.

Ejemplo de respuesta
{
  "data": {
    "vehicles": [
      {
        "vehicleId": 7,
        "tenantId": 42,
        "plate": "1234ABC",
        "model": "Seat León",
        "regime": "company",
        "energy": "combustion",
        "assignmentMode": "fixed",
        "fuelConsumption": 5.8,
        "electricConsumption": null,
        "active": true,
        "updatedAt": "2026-10-06T10:00:00.000Z",
        "drivers": [
          {
            "userId": 15,
            "fullName": "Bea Conductora"
          }
        ]
      },
      {
        "vehicleId": 9,
        "tenantId": 42,
        "plate": "5678DEF",
        "model": null,
        "regime": "own",
        "energy": "electric",
        "assignmentMode": "pool",
        "fuelConsumption": null,
        "electricConsumption": 17.9,
        "active": true,
        "updatedAt": "2026-10-06T10:00:00.000Z",
        "drivers": []
      }
    ]
  }
}

Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.

Obtiene un vehículo

POST/movimientos/flota/get

  • Permiso lectura

Devuelve la ficha de un vehículo de la empresa con sus conductores (drivers, siempre presente con clave API).

Un vehículo dado de baja responde 404 salvo que se pida includeInactive: true; entonces llega con active: false.

Errores propios

  • 404 vehicle_not_found: el vehículo no existe, es de otra empresa o está de baja (sin includeInactive). Es la misma respuesta en los tres casos: no confirma que exista.
  • 422 invalid_input: cuerpo que no es un objeto JSON; vehicleId ausente (required) o no válido (invalid); includeInactive no booleano (invalid); clave no admitida (unexpected_field).

Petición

Cuerpo obligatorio

  • vehicleIdinteger | stringobligatorio

    Identificador: entero positivo. También se admite como texto de dígitos ("7"), siempre que sea un entero seguro de JavaScript (≤ 9007199254740991).

    integer: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

  • includeInactiveboolean | null

    Devuelve también un vehículo dado de baja. null = false.

    Por defecto: false

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/get" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vehicleId": 7
  }'

Respuesta

200

El vehículo con sus conductores.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

Ejemplo de respuesta
{
  "data": {
    "vehicle": {
      "vehicleId": 7,
      "tenantId": 42,
      "plate": "1234ABC",
      "model": "Seat León",
      "regime": "company",
      "energy": "combustion",
      "assignmentMode": "fixed",
      "fuelConsumption": 5.8,
      "electricConsumption": null,
      "active": true,
      "updatedAt": "2026-10-06T10:00:00.000Z",
      "drivers": [
        {
          "userId": 15,
          "fullName": "Bea Conductora"
        }
      ]
    }
  }
}

Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.

Busca marca y modelo con su consumo

POST/movimientos/flota/models-search

  • Permiso lectura

Busca marca y modelo para proponer la energía y el consumo medio al dar de alta un vehículo. Devuelve dos listas independientes:

  • companyModels: los modelos que ha guardado tu empresa (ver /movimientos/flota/company-models-save), solo los activos, por nombre. Ninguna otra empresa los ve.
  • models: variantes del catálogo público de la Agencia Europea de Medio Ambiente (turismos desde 2010 y furgonetas desde 2012), las más matriculadas primero, con su consumo homologado o, si solo se vendieron en 2010-2020, estimado a partir del CO2 (consumptionSource). consumption es null solo en un eléctrico antiguo sin dato.

Cómo busca. Cada palabra de query debe ser el principio de alguna palabra de «marca modelo» (o del nombre del modelo de la empresa), en cualquier orden. No distingue mayúsculas, tildes ni separadores: "seat leon", "SEAT-LEÓN" y "leo sea" encuentran lo mismo; "troc" encuentra T-ROC e "id3", ID.3.

Sin paginación: limit (1-50, 20 por defecto) se aplica a cada lista por separado. Sin coincidencias, las dos listas llegan vacías.

Usar una sugerencia en /movimientos/flota/save. model = make + " " + model (o name en un modelo de la empresa) y energy tal cual. Del catálogo: con unit: l_100km, consumption va a fuelConsumption (y electricConsumption, si lo trae un enchufable, a electricConsumption); con unit: kwh_100km, consumption va a electricConsumption.

Errores propios

  • 422 invalid_input: cuerpo que no es un objeto JSON; query ausente o vacío (required), que no es texto, con menos de 2 caracteres o sin letras ni cifras (invalid) o de más de 100 (too_long); limit que no es un entero de 1 a 50 (invalid); clave no admitida (unexpected_field).

Petición

Cuerpo obligatorio

  • querystringobligatorio

    Texto a buscar, de 2 a 100 caracteres una vez recortado y con los espacios repetidos juntados, con al menos una letra o cifra (las letras con tilde cuentan).

    De 2 a 100 caracteres

  • limitinteger | string | null

    Máximo de resultados de CADA lista, de 1 a 50 (20 si no se manda o es null).

    integer: mínimo 1integer: máximo 50string: patrón ^([1-9]|[1-4][0-9]|50)$Por defecto: 20

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/models-search" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "seat ibiza",
    "limit": 10
  }'

Respuesta

200

Modelos de la empresa y variantes del catálogo que coinciden.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • dataobject
    • companyModelsFlotaCompanyModel[]

      Modelos activos de la empresa que coinciden, por nombre.

    • Variantes del catálogo que coinciden, las más matriculadas primero.

Ejemplo de respuesta
{
  "data": {
    "companyModels": [
      {
        "companyModelId": 501,
        "name": "Seat Ibiza Cupra 2004",
        "energy": "combustion",
        "fuelConsumption": 8.1,
        "electricConsumption": null,
        "updatedAt": "2026-10-12T10:00:00.000Z"
      }
    ],
    "models": [
      {
        "modelId": 812,
        "category": "car",
        "make": "SEAT",
        "model": "IBIZA",
        "fuel": "petrol",
        "energy": "combustion",
        "powerKw": 70,
        "yearFrom": 2015,
        "yearTo": 2025,
        "consumption": 5.2,
        "unit": "l_100km",
        "electricConsumption": null,
        "consumptionSource": "homologated"
      },
      {
        "modelId": 30117,
        "category": "car",
        "make": "SEAT",
        "model": "IBIZA",
        "fuel": "petrol",
        "energy": "combustion",
        "powerKw": 63,
        "yearFrom": 2011,
        "yearTo": 2017,
        "consumption": 6,
        "unit": "l_100km",
        "electricConsumption": null,
        "consumptionSource": "estimated"
      }
    ]
  }
}

Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.

Lista los modelos de la empresa

POST/movimientos/flota/company-models-list

  • Permiso lectura

Devuelve los modelos de vehículo que ha guardado la empresa (los que no están en el catálogo), solo los activos, ordenados por nombre (sin distinguir mayúsculas ni tildes), después por energía y por id.

Sin paginación. El cuerpo es opcional: sin cuerpo o {}; no admite ningún campo.

Errores propios

  • 422 invalid_input: cuerpo que no es un objeto JSON; cualquier clave (unexpected_field).

Petición

Cuerpo opcional

object

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/company-models-list" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Respuesta

200

Modelos activos de la empresa.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • dataobject
    • companyModelsFlotaCompanyModel[]

      Modelos activos de la empresa, por nombre y energía. Sin paginación.

Ejemplo de respuesta
{
  "data": {
    "companyModels": [
      {
        "companyModelId": 502,
        "name": "Iveco Daily 35S",
        "energy": "combustion",
        "fuelConsumption": 9.8,
        "electricConsumption": null,
        "updatedAt": "2026-10-12T10:00:00.000Z"
      }
    ]
  }
}

Además, las respuestas comunes: 401, 403, 404, 422, 429, 503.

Da de alta o edita un vehículo

POST/movimientos/flota/save

  • Permiso flota
  • Admite Idempotency-Key

Sin vehicleId (o con vehicleId: null) da de alta un vehículo; con vehicleId edita ese vehículo, que debe estar activo. Siempre responde 200 con el vehículo guardado.

Guardado completo. Cada llamada manda el vehículo entero. plate, regime, energy y assignmentMode son obligatorios siempre; en una edición, model, fuelConsumption y electricConsumption que no se mandan (o van a null) se borran. Para conservarlos, reenvía los valores actuales (los devuelve /movimientos/flota/get).

  • Matrícula: se quitan espacios y guiones y se pasa a mayúsculas ("1234 abc" → "1234ABC"); después debe quedar de 1 a 20 caracteres A-Z y 0-9. Es única entre los vehículos activos de la empresa (dar uno de baja libera su matrícula).
  • Modelo: se recortan los extremos y se juntan los espacios repetidos; "" se guarda como null.
  • Consumo medio (opcional, de 0,1 a 99,9 con un decimal como mucho): fuelConsumption (l/100 km) solo con energy combustion o hybrid; electricConsumption (kWh/100 km) solo con electric o hybrid. Mandar el que no corresponde a la energía es invalid: no lo mandes o mándalo a null.
  • Fijo o variable (assignmentMode): fixed = solo lo usan sus conductores, que se fijan después con /movimientos/flota/assign; pool = variable, lo puede usar cualquier conductor de la empresa y no tiene lista. Pasar un vehículo a pool da de baja a todos sus conductores; volver a fixed lo deja sin conductores hasta el siguiente assign.
  • Los conductores no se tocan aquí: en un alta drivers llega siempre []; en una edición, los conductores actuales.
  • Cambiar regime no recalcula los viajes ya guardados.
  • Solo el alta comprueba el límite del plan; la edición no.

Orden de las comprobaciones: cuenta que admite cambios (423) → cuerpo (422) → en el alta, plaza libre en el plan (409 vehicle_limit) → matrícula libre (409 vehicle_plate_taken) y, en la edición, vehículo existente (404).

Errores propios

  • 404 vehicle_not_found: edición de un vehículo que no existe, es de otra empresa o está de baja.

  • 409 vehicle_limit: alta con el plan lleno. Además de code y message trae resource: "vehicles", limit (máximo del plan), used (vehículos no dados de baja) y next, que dice la salida:

    • subscribe: cuenta en prueba (máximo 4 vehículos); hay que pasar a pago en la web.
    • add_extra_vehicle: cuenta de pago con menos de 10 vehículos extra; el owner puede contratar uno más en la web (hasta 14 en total).
    • contact_us: del 15.º en adelante o con un límite pactado a medida; «Habla con nosotros».

    Ejemplo: {"error": {"code": "vehicle_limit", "message": "Has llegado al limite de vehiculos de tu plan", "resource": "vehicles", "limit": 4, "used": 4, "next": "subscribe"}}. Dar de baja un vehículo libera plaza.

  • 409 vehicle_plate_taken: otro vehículo activo de la empresa ya tiene esa matrícula (normalizada).

  • 422 invalid_input: error.fields con todos los campos erróneos a la vez, cada uno con required, invalid, too_long (model de más de 100 caracteres) o unexpected_field. Ejemplo: {"plate": "required", "energy": "invalid", "fuelConsumption": "invalid", "color": "unexpected_field"}.

  • 423 account_read_only: la cuenta no admite cambios; reason: account (prueba vencida, solo lectura, cancelada…), suspended o pending_payment.

Petición

Cabeceras

  • Idempotency-Keystring

    Clave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma Idempotency-Key con la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada con Idempotent-Replayed: true sin volver a ejecutar la operación. Con otro cuerpo u otra ruta: 409 idempotency_conflict; si la primera aún está en curso: 409 idempotency_in_progress. Una respuesta 5xx no se guarda (se puede reintentar). Mal formada: 422 invalid_idempotency_key.

    Patrón: ^[A-Za-z0-9_-]{1,100}$

Cuerpo obligatorio

Guardado completo: en una edición, model y los consumos que no se mandan (o van a null) se borran.

  • vehicleIdinteger | string | null

    Ausente o null = alta; un id = edición de ese vehículo (activo).

    integer: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

  • platestringobligatorio

    Matrícula. Se quitan espacios y guiones y se pasa a mayúsculas ("1234 abc" → "1234ABC"); tras eso, de 1 a 20 caracteres A-Z y 0-9. Única entre los vehículos activos de la empresa.

    Patrón: ^[\s-]*(?:[A-Za-z0-9][\s-]*){1,20}$

  • modelstring | null

    Marca y modelo, opcional. Se recorta y se juntan los espacios repetidos; el límite de 100 caracteres se mide después. "", null o ausente = sin modelo.

    Hasta 100 caracteres

  • regimestringobligatorio

    own: vehículo propio del conductor (el viaje se valora con km × tarifa). company: de empresa o de renting (coste real). Cada viaje guarda el régimen con el que se registró.

    Valores: own company

  • energystringobligatorio

    Qué energía gasta: combustion (litros), electric (kWh) o hybrid (litros y, si es enchufable, también kWh).

    Valores: combustion electric hybrid

  • assignmentModestringobligatorio

    fixed: lo usan solo sus conductores (se fijan con /movimientos/flota/assign). pool: variable, lo puede usar cualquier conductor de la empresa.

    Valores: fixed pool

  • fuelConsumptionnumber | null

    Consumo medio en l/100 km. Solo con energy combustion o hybrid; con electric es invalid. Debe ser un número JSON (un texto es invalid).

    Mínimo 0.1Máximo 99.9

  • electricConsumptionnumber | null

    Consumo medio en kWh/100 km. Solo con energy electric o hybrid; con combustion es invalid. Debe ser un número JSON (un texto es invalid).

    Mínimo 0.1Máximo 99.9

Ejemplo: Alta de un vehículo fijo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/save" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
    "plate": "1234 abc",
    "model": "Seat León",
    "regime": "company",
    "energy": "combustion",
    "assignmentMode": "fixed",
    "fuelConsumption": 5.8
  }'
Otro ejemplo: Edición (guardado completo) de un híbrido enchufable
{
  "vehicleId": 7,
  "plate": "1234ABC",
  "model": "Seat León e-Hybrid",
  "regime": "company",
  "energy": "hybrid",
  "assignmentMode": "fixed",
  "fuelConsumption": 1.4,
  "electricConsumption": 15.5
}

Respuesta

200

El vehículo guardado, con sus conductores ([] en un alta).

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • Idempotent-Replayedstring

    true si es la respuesta guardada de una petición anterior con la misma Idempotency-Key.

    Valores: true

Ejemplo de respuesta
{
  "data": {
    "vehicle": {
      "vehicleId": 7,
      "tenantId": 42,
      "plate": "1234ABC",
      "model": "Seat León",
      "regime": "company",
      "energy": "combustion",
      "assignmentMode": "fixed",
      "fuelConsumption": 5.8,
      "electricConsumption": null,
      "active": true,
      "updatedAt": "2026-10-13T09:30:00.000Z",
      "drivers": []
    }
  }
}

Además, las respuestas comunes: 401, 403, 404, 409, 422, 423, 429, 503.

Da de baja un vehículo

POST/movimientos/flota/delete

  • Permiso flota
  • Admite Idempotency-Key

Da de baja un vehículo activo (baja lógica). El vehículo se conserva: sus viajes, gastos y cierres lo siguen apuntando, y list / get con includeInactive: true lo devuelven con active: false. Deja de salir en las listas y entre los vehículos que pueden usar los conductores, libera su matrícula y deja de ocupar plaza del plan. No se puede reactivar: para volver a usarlo, da de alta otro con la misma matrícula.

Errores propios

  • 404 vehicle_not_found: el vehículo no existe, es de otra empresa o ya está de baja.
  • 409: solo por Idempotency-Key (idempotency_conflict, idempotency_in_progress).
  • 422 invalid_input: cuerpo que no es un objeto JSON; vehicleId ausente (required) o no válido (invalid); clave no admitida (unexpected_field).
  • 423 account_read_only: la cuenta no admite cambios (reason: account, suspended o pending_payment).

Petición

Cabeceras

  • Idempotency-Keystring

    Clave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma Idempotency-Key con la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada con Idempotent-Replayed: true sin volver a ejecutar la operación. Con otro cuerpo u otra ruta: 409 idempotency_conflict; si la primera aún está en curso: 409 idempotency_in_progress. Una respuesta 5xx no se guarda (se puede reintentar). Mal formada: 422 invalid_idempotency_key.

    Patrón: ^[A-Za-z0-9_-]{1,100}$

Cuerpo obligatorio

  • vehicleIdinteger | stringobligatorio

    Identificador: entero positivo. También se admite como texto de dígitos ("7"), siempre que sea un entero seguro de JavaScript (≤ 9007199254740991).

    integer: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/delete" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
    "vehicleId": 7
  }'

Respuesta

200

Vehículo dado de baja.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • Idempotent-Replayedstring

    true si es la respuesta guardada de una petición anterior con la misma Idempotency-Key.

    Valores: true

  • dataobject
    • deletedboolean

      Siempre true

    • vehicleIdinteger

      Mínimo 1

Ejemplo de respuesta
{
  "data": {
    "deleted": true,
    "vehicleId": 7
  }
}

Además, las respuestas comunes: 401, 403, 404, 409, 422, 423, 429, 503.

Fija los conductores de un vehículo fijo

POST/movimientos/flota/assign

  • Permiso flota
  • Admite Idempotency-Key

Fija la lista completa de conductores de un vehículo fijo (assignmentMode: fixed). Los que entran se dan de alta, los que ya no están se dan de baja y los que siguen no se tocan (queda el histórico de quién tuvo el vehículo). userIds: [] lo deja sin conductores: ningún usuario con rol user podrá usarlo.

  • Conductor válido: usuario con rol owner o user de la misma empresa que no esté desactivado (los invitados que aún no han entrado sí valen). El gestor no conduce. Los ids salen de /auth/usuarios/list.
  • Los ids repetidos cuentan una vez; como mucho 100 elementos.
  • Si algún id no es un conductor válido no se escribe nada.
  • Repetir la misma lista no cambia nada.
  • Un vehículo variable (pool) no tiene lista: pásalo antes a fixed con /movimientos/flota/save.

Responde con el vehículo y sus conductores actuales, por nombre.

Errores propios

  • 404 vehicle_not_found: el vehículo no existe, es de otra empresa o está de baja (también si lo dan de baja o lo pasan a variable mientras se guarda la asignación).
  • 409 vehicle_not_fixed: el vehículo es variable (pool).
  • 422 invalid_input: cuerpo que no es un objeto JSON; fields.vehicleId required / invalid; fields.userIds required (falta o es null), invalid (no es una lista o algún elemento no es un id) o too_many (más de 100); clave no admitida (unexpected_field). Si algún id no es un conductor válido de la empresa (inexistente, de otra empresa, gestor o desactivado): fields: {"userIds": "invalid"} y además invalidUserIds con esos ids, p. ej. {"error": {"code": "invalid_input", "message": "Datos no validos", "fields": {"userIds": "invalid"}, "invalidUserIds": [99]}}.
  • 423 account_read_only: la cuenta no admite cambios (reason: account, suspended o pending_payment).

Petición

Cabeceras

  • Idempotency-Keystring

    Clave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma Idempotency-Key con la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada con Idempotent-Replayed: true sin volver a ejecutar la operación. Con otro cuerpo u otra ruta: 409 idempotency_conflict; si la primera aún está en curso: 409 idempotency_in_progress. Una respuesta 5xx no se guarda (se puede reintentar). Mal formada: 422 invalid_idempotency_key.

    Patrón: ^[A-Za-z0-9_-]{1,100}$

Cuerpo obligatorio

  • vehicleIdinteger | stringobligatorio

    Vehículo activo de la empresa con assignmentMode fixed.

    integer: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

  • userIds(integer | string)[]obligatorio

    Lista completa de conductores (usuarios owner o user de la empresa, no desactivados). Los repetidos cuentan una vez. [] deja el vehículo sin conductores.

    Hasta 100 elementosinteger: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/assign" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
    "vehicleId": 7,
    "userIds": [
      15,
      16
    ]
  }'

Respuesta

200

El vehículo con su lista de conductores actualizada.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • Idempotent-Replayedstring

    true si es la respuesta guardada de una petición anterior con la misma Idempotency-Key.

    Valores: true

Ejemplo de respuesta
{
  "data": {
    "vehicle": {
      "vehicleId": 7,
      "tenantId": 42,
      "plate": "1234ABC",
      "model": "Seat León",
      "regime": "company",
      "energy": "combustion",
      "assignmentMode": "fixed",
      "fuelConsumption": 5.8,
      "electricConsumption": null,
      "active": true,
      "updatedAt": "2026-10-06T10:00:00.000Z",
      "drivers": [
        {
          "userId": 15,
          "fullName": "Bea Conductora"
        },
        {
          "userId": 16,
          "fullName": "Carlos Conductor"
        }
      ]
    }
  }
}

Además, las respuestas comunes: 401, 403, 404, 409, 422, 423, 429, 503.

Guarda o corrige un modelo de la empresa

POST/movimientos/flota/company-models-save

  • Permiso flota
  • Admite Idempotency-Key

Sin companyModelId (o con null) guarda un modelo nuevo de la empresa; con companyModelId corrige ese modelo, que debe estar activo. Un modelo de la empresa es una marca y modelo que no está en el catálogo y que se quiere volver a elegir: sale primero en /movimientos/flota/models-search y solo para esta empresa.

Guardado completo, como el del vehículo: los consumos que no se mandan (o van a null) se guardan vacíos.

  • name: se recortan los extremos y se juntan los espacios repetidos; de 1 a 100 caracteres con al menos una letra (A-Z, sin tilde) o cifra.
  • Consumo medio con las mismas reglas que el vehículo: fuelConsumption solo con combustion o hybrid, electricConsumption solo con electric o hybrid.
  • Sin duplicados: no puede haber dos modelos activos de la empresa con el mismo nombre (sin distinguir mayúsculas ni tildes) y la misma energía. El mismo nombre con otra energía sí se admite.
  • Corregir un modelo no cambia los vehículos que ya lo usan (copiaron sus datos).
  • created dice si fue un alta (true) o una corrección (false).

Errores propios

  • 404 company_model_not_found: corrección de un modelo que no existe, es de otra empresa o está retirado.
  • 409 company_model_exists: ya hay otro modelo activo con ese nombre y esa energía; error.companyModelId trae el id del que ya existe (o null si no se pudo leer). Se puede dar por guardado.
  • 422 invalid_input: cuerpo que no es un objeto JSON; error.fields con name required / invalid / too_long, energy required / invalid, fuelConsumption / electricConsumption invalid (fuera de rango, más de un decimal o no corresponde a la energía), companyModelId invalid o unexpected_field.
  • 423 account_read_only: la cuenta no admite cambios (reason: account, suspended o pending_payment).

Petición

Cabeceras

  • Idempotency-Keystring

    Clave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma Idempotency-Key con la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada con Idempotent-Replayed: true sin volver a ejecutar la operación. Con otro cuerpo u otra ruta: 409 idempotency_conflict; si la primera aún está en curso: 409 idempotency_in_progress. Una respuesta 5xx no se guarda (se puede reintentar). Mal formada: 422 invalid_idempotency_key.

    Patrón: ^[A-Za-z0-9_-]{1,100}$

Cuerpo obligatorio

Guardado completo: los consumos que no se mandan (o van a null) se guardan vacíos.

  • companyModelIdinteger | string | null

    Ausente o null = alta; un id = corrección de ese modelo (activo).

    integer: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

  • namestringobligatorio

    Marca y modelo. Se recorta y se juntan los espacios repetidos (" Iveco Daily " → "Iveco Daily"); después, de 1 a 100 caracteres con al menos una letra A-Z (sin tilde) o cifra.

    Hasta 100 caracteresPatrón: [A-Za-z0-9]

  • energystringobligatorio

    Qué energía gasta: combustion (litros), electric (kWh) o hybrid (litros y, si es enchufable, también kWh).

    Valores: combustion electric hybrid

  • fuelConsumptionnumber | null

    l/100 km. Solo con energy combustion o hybrid; debe ser un número JSON.

    Mínimo 0.1Máximo 99.9

  • electricConsumptionnumber | null

    kWh/100 km. Solo con energy electric o hybrid; debe ser un número JSON.

    Mínimo 0.1Máximo 99.9

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/company-models-save" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
    "name": "Renault Kangoo Z.E. 2012",
    "energy": "electric",
    "electricConsumption": 15.5
  }'

Respuesta

200

El modelo guardado.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • Idempotent-Replayedstring

    true si es la respuesta guardada de una petición anterior con la misma Idempotency-Key.

    Valores: true

  • dataobject
    • companyModelFlotaCompanyModel
    • createdboolean

      true si fue un alta; false si fue una corrección.

Ejemplo de respuesta
{
  "data": {
    "companyModel": {
      "companyModelId": 503,
      "name": "Renault Kangoo Z.E. 2012",
      "energy": "electric",
      "fuelConsumption": null,
      "electricConsumption": 15.5,
      "updatedAt": "2026-10-13T09:30:00.000Z"
    },
    "created": true
  }
}

Además, las respuestas comunes: 401, 403, 404, 409, 422, 423, 429, 503.

Retira un modelo de la empresa

POST/movimientos/flota/company-models-delete

  • Permiso flota
  • Admite Idempotency-Key

Retira un modelo de la empresa (baja lógica): deja de salir en la búsqueda y en la lista, y su nombre queda libre para volver a guardarlo. Los vehículos que lo usan conservan sus datos.

Errores propios

  • 404 company_model_not_found: el modelo no existe, es de otra empresa o ya está retirado.
  • 409: solo por Idempotency-Key (idempotency_conflict, idempotency_in_progress).
  • 422 invalid_input: cuerpo que no es un objeto JSON; companyModelId ausente (required) o no válido (invalid); clave no admitida (unexpected_field).
  • 423 account_read_only: la cuenta no admite cambios (reason: account, suspended o pending_payment).

Petición

Cabeceras

  • Idempotency-Keystring

    Clave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma Idempotency-Key con la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada con Idempotent-Replayed: true sin volver a ejecutar la operación. Con otro cuerpo u otra ruta: 409 idempotency_conflict; si la primera aún está en curso: 409 idempotency_in_progress. Una respuesta 5xx no se guarda (se puede reintentar). Mal formada: 422 invalid_idempotency_key.

    Patrón: ^[A-Za-z0-9_-]{1,100}$

Cuerpo obligatorio

  • companyModelIdinteger | stringobligatorio

    Identificador: entero positivo. También se admite como texto de dígitos ("7"), siempre que sea un entero seguro de JavaScript (≤ 9007199254740991).

    integer: mínimo 1integer: máximo 9007199254740991string: patrón ^[1-9][0-9]{0,15}$

Ejemplo

curl -sS -X POST "https://app.flotadoc.com/api/movimientos/flota/company-models-delete" \
  -H "Authorization: Bearer $FLOTADOC_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
    "companyModelId": 501
  }'

Respuesta

200

Modelo retirado.

Cabeceras

  • X-Request-Idstring (uuid)

    Id de la petición en el historial de la empresa (para soporte).

  • Idempotent-Replayedstring

    true si es la respuesta guardada de una petición anterior con la misma Idempotency-Key.

    Valores: true

  • dataobject
    • deletedboolean

      Siempre true

    • companyModelIdinteger

      Mínimo 1

Ejemplo de respuesta
{
  "data": {
    "deleted": true,
    "companyModelId": 501
  }
}

Además, las respuestas comunes: 401, 403, 404, 409, 422, 423, 429, 503.

Modelos

Objetos que devuelven o reciben las operaciones de esta área. Cada campo enlaza a su modelo.

FlotaVehicleobject

  • vehicleIdinteger

    Mínimo 1

  • tenantIdinteger

    Empresa del vehículo (la de la clave API).

    Mínimo 1

  • platestring

    Matrícula normalizada (mayúsculas, sin espacios ni guiones).

    Patrón: ^[A-Z0-9]{1,20}$

  • modelstring | null

    Marca y modelo; null si no se indicó.

    Hasta 100 caracteres

  • regimestring

    own: vehículo propio del conductor (el viaje se valora con km × tarifa). company: de empresa o de renting (coste real). Cada viaje guarda el régimen con el que se registró.

    Valores: own company

  • energystring

    Qué energía gasta: combustion (litros), electric (kWh) o hybrid (litros y, si es enchufable, también kWh).

    Valores: combustion electric hybrid

  • assignmentModestring

    fixed: lo usan solo sus conductores (se fijan con /movimientos/flota/assign). pool: variable, lo puede usar cualquier conductor de la empresa.

    Valores: fixed pool

  • fuelConsumptionnumber | null

    Consumo medio en l/100 km (solo combustión e híbridos), o null.

    Mínimo 0.1Máximo 99.9

  • electricConsumptionnumber | null

    Consumo medio en kWh/100 km (solo eléctricos e híbridos enchufables), o null.

    Mínimo 0.1Máximo 99.9

  • activeboolean

    false si está dado de baja (solo aparece con includeInactive: true).

  • updatedAtstring (date-time)

    Última modificación del vehículo (ISO 8601, UTC).

  • driversFlotaDriver[]

    Conductores activos de un vehículo fijo, por nombre; [] en uno variable o sin conductores. Con clave API (actúa como owner) siempre viene.

FlotaCompanyModelobject

  • companyModelIdinteger

    Id del modelo de la empresa (no comparte numeración con modelId del catálogo).

    Mínimo 1

  • namestring

    Marca y modelo tal como lo guardó la empresa (cabe en model del vehículo).

    De 1 a 100 caracteresPatrón: ^\S+( \S+)*$

  • energystring

    Qué energía gasta: combustion (litros), electric (kWh) o hybrid (litros y, si es enchufable, también kWh).

    Valores: combustion electric hybrid

  • fuelConsumptionnumber | null

    Consumo medio en l/100 km, o null.

    Mínimo 0.1Máximo 99.9

  • electricConsumptionnumber | null

    Consumo medio en kWh/100 km, o null.

    Mínimo 0.1Máximo 99.9

  • updatedAtstring (date-time)

    Última corrección (ISO 8601, UTC).

FlotaCatalogModelobject

  • modelIdinteger

    Id estable de la variante en el catálogo.

    Mínimo 1

  • categorystring

    car (turismo) o van (furgoneta).

    Valores: car van

  • makestring

    Marca, en mayúsculas como en los datos de la EEA.

  • modelstring

    Modelo, en mayúsculas y sin repetir la marca. make + " " + model cabe en model del vehículo.

  • fuelstring

    Combustible: gasolina, diésel, híbridos, híbridos enchufables (*_phev), eléctrico, GLP (lpg), gas natural (cng) o bioetanol (e85).

    Valores: petrol diesel petrol_hybrid diesel_hybrid petrol_phev diesel_phev electric lpg cng e85

  • energystring

    La energy del vehículo que le corresponde: electric, hybrid (híbridos y enchufables) o combustion (el resto).

    Qué energía gasta: combustion (litros), electric (kWh) o hybrid (litros y, si es enchufable, también kWh).

    Valores: combustion electric hybrid

  • powerKwinteger | null

    Potencia en kW; null si los datos no la traen.

    Mínimo 1Máximo 1500

  • yearFrominteger

    Primer año de matriculación de la variante en los datos.

  • yearTointeger

    Último año de matriculación de la variante en los datos.

  • consumptionnumber | null

    Consumo con un decimal, en unit. En un enchufable es el ponderado. null solo en un eléctrico antiguo sin dato.

  • unitstring

    Unidad de consumption; kwh_100km solo en fuel electric.

    Valores: l_100km kwh_100km

  • electricConsumptionnumber | null

    kWh/100 km de los híbridos enchufables (*_phev); null en el resto.

  • consumptionSourcestring | null

    Origen de consumption: homologated (WLTP, desde 2021, o el dato de un eléctrico), estimated (calculado desde el CO2, variantes de 2010-2020) o null sin consumo.

    Valores: homologated estimated

FlotaDriverobject

  • userIdinteger

    Mínimo 1

  • fullNamestring

    Nombre completo del conductor.

    Hasta 200 caracteres

¿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