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: truelimita 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: trueañade los vehículos dados de baja (active: false), p. ej. para cuadrar el informe de un mes antiguo. Junto conmine: trueno 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 amine: falseeincludeInactive: false.
Errores propios
422 invalid_input: el cuerpo no es un objeto JSON (sinfields);mineoincludeInactiveno son booleanos (fields.<campo>: invalid); clave no admitida (fields.<clave>: unexpected_field).
Petición
Cuerpo opcional
mineboolean | nullSolo 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:
falseincludeInactiveboolean | nullAñade los dados de baja (
active: false). No tiene efecto junto conmine: 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).
dataobjectvehiclesFlotaVehicle[]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 (sinincludeInactive). Es la misma respuesta en los tres casos: no confirma que exista.422 invalid_input: cuerpo que no es un objeto JSON;vehicleIdausente (required) o no válido (invalid);includeInactiveno booleano (invalid); clave no admitida (unexpected_field).
Petición
Cuerpo obligatorio
vehicleIdinteger | stringobligatorioIdentificador: 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áximo9007199254740991string: patrón^[1-9][0-9]{0,15}$includeInactiveboolean | nullDevuelve 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).
dataobjectvehicleFlotaVehicle
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).consumptionesnullsolo 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;queryausente 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);limitque no es un entero de 1 a 50 (invalid); clave no admitida (unexpected_field).
Petición
Cuerpo obligatorio
querystringobligatorioTexto 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 | nullMáximo de resultados de CADA lista, de 1 a 50 (20 si no se manda o es
null).integer: mínimo
1integer: máximo50string: 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).
dataobjectcompanyModelsFlotaCompanyModel[]Modelos activos de la empresa que coinciden, por nombre.
modelsFlotaCatalogModel[]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).
dataobjectcompanyModelsFlotaCompanyModel[]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 comonull. - Consumo medio (opcional, de 0,1 a 99,9 con un decimal como mucho):
fuelConsumption(l/100 km) solo conenergycombustionohybrid;electricConsumption(kWh/100 km) solo conelectricohybrid. Mandar el que no corresponde a la energía esinvalid: no lo mandes o mándalo anull. - 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 apoolda de baja a todos sus conductores; volver afixedlo deja sin conductores hasta el siguienteassign. - Los conductores no se tocan aquí: en un alta
driversllega siempre[]; en una edición, los conductores actuales. - Cambiar
regimeno 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 decodeymessagetraeresource: "vehicles",limit(máximo del plan),used(vehículos no dados de baja) ynext, 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.fieldscon todos los campos erróneos a la vez, cada uno conrequired,invalid,too_long(modelde más de 100 caracteres) ounexpected_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…),suspendedopending_payment.
Petición
Cabeceras
Idempotency-KeystringClave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma
Idempotency-Keycon la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada conIdempotent-Replayed: truesin 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 | nullAusente o
null= alta; un id = edición de ese vehículo (activo).integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$platestringobligatorioMatrí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 | nullMarca y modelo, opcional. Se recorta y se juntan los espacios repetidos; el límite de 100 caracteres se mide después.
"",nullo ausente = sin modelo.Hasta 100 caracteres
regimestringobligatorioown: 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:
owncompanyenergystringobligatorioQué energía gasta:
combustion(litros),electric(kWh) ohybrid(litros y, si es enchufable, también kWh).Valores:
combustionelectrichybridassignmentModestringobligatoriofixed: lo usan solo sus conductores (se fijan con/movimientos/flota/assign).pool: variable, lo puede usar cualquier conductor de la empresa.Valores:
fixedpoolfuelConsumptionnumber | nullConsumo medio en l/100 km. Solo con
energycombustionohybrid; conelectricesinvalid. Debe ser un número JSON (un texto esinvalid).Mínimo
0.1Máximo99.9electricConsumptionnumber | nullConsumo medio en kWh/100 km. Solo con
energyelectricohybrid; concombustionesinvalid. Debe ser un número JSON (un texto esinvalid).Mínimo
0.1Máximo99.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-Replayedstringtruesi es la respuesta guardada de una petición anterior con la mismaIdempotency-Key.Valores:
true
dataobjectvehicleFlotaVehicle
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 porIdempotency-Key(idempotency_conflict,idempotency_in_progress).422 invalid_input: cuerpo que no es un objeto JSON;vehicleIdausente (required) o no válido (invalid); clave no admitida (unexpected_field).423 account_read_only: la cuenta no admite cambios (reason:account,suspendedopending_payment).
Petición
Cabeceras
Idempotency-KeystringClave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma
Idempotency-Keycon la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada conIdempotent-Replayed: truesin 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 | stringobligatorioIdentificador: 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áximo9007199254740991string: 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-Replayedstringtruesi es la respuesta guardada de una petición anterior con la mismaIdempotency-Key.Valores:
true
dataobjectdeletedbooleanSiempre
truevehicleIdintegerMí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
ownerouserde la misma empresa que no esté desactivado (los invitados que aún no han entrado sí valen). Elgestorno 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 afixedcon/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.vehicleIdrequired/invalid;fields.userIdsrequired(falta o esnull),invalid(no es una lista o algún elemento no es un id) otoo_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ásinvalidUserIdscon 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,suspendedopending_payment).
Petición
Cabeceras
Idempotency-KeystringClave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma
Idempotency-Keycon la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada conIdempotent-Replayed: truesin 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 | stringobligatorioVehículo activo de la empresa con
assignmentModefixed.integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$userIds(integer | string)[]obligatorioLista completa de conductores (usuarios
ownerouserde la empresa, no desactivados). Los repetidos cuentan una vez.[]deja el vehículo sin conductores.Hasta 100 elementosinteger: mínimo
1integer: máximo9007199254740991string: 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-Replayedstringtruesi es la respuesta guardada de una petición anterior con la mismaIdempotency-Key.Valores:
true
dataobjectvehicleFlotaVehicle
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:
fuelConsumptionsolo concombustionohybrid,electricConsumptionsolo conelectricohybrid. - 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).
createddice 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.companyModelIdtrae el id del que ya existe (onullsi no se pudo leer). Se puede dar por guardado.422 invalid_input: cuerpo que no es un objeto JSON;error.fieldsconnamerequired/invalid/too_long,energyrequired/invalid,fuelConsumption/electricConsumptioninvalid(fuera de rango, más de un decimal o no corresponde a la energía),companyModelIdinvalidounexpected_field.423 account_read_only: la cuenta no admite cambios (reason:account,suspendedopending_payment).
Petición
Cabeceras
Idempotency-KeystringClave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma
Idempotency-Keycon la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada conIdempotent-Replayed: truesin 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 | nullAusente o
null= alta; un id = corrección de ese modelo (activo).integer: mínimo
1integer: máximo9007199254740991string: patrón^[1-9][0-9]{0,15}$namestringobligatorioMarca 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]energystringobligatorioQué energía gasta:
combustion(litros),electric(kWh) ohybrid(litros y, si es enchufable, también kWh).Valores:
combustionelectrichybridfuelConsumptionnumber | nulll/100 km. Solo con
energycombustionohybrid; debe ser un número JSON.Mínimo
0.1Máximo99.9electricConsumptionnumber | nullkWh/100 km. Solo con
energyelectricohybrid; debe ser un número JSON.Mínimo
0.1Máximo99.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-Replayedstringtruesi es la respuesta guardada de una petición anterior con la mismaIdempotency-Key.Valores:
true
dataobjectcompanyModelFlotaCompanyModelcreatedbooleantruesi fue un alta;falsesi 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 porIdempotency-Key(idempotency_conflict,idempotency_in_progress).422 invalid_input: cuerpo que no es un objeto JSON;companyModelIdausente (required) o no válido (invalid); clave no admitida (unexpected_field).423 account_read_only: la cuenta no admite cambios (reason:account,suspendedopending_payment).
Petición
Cabeceras
Idempotency-KeystringClave de idempotencia de la escritura (opcional, recomendada). Vale 24 horas por clave API: la misma
Idempotency-Keycon la misma ruta y el mismo cuerpo exacto devuelve la respuesta guardada conIdempotent-Replayed: truesin 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 | stringobligatorioIdentificador: 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áximo9007199254740991string: 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-Replayedstringtruesi es la respuesta guardada de una petición anterior con la mismaIdempotency-Key.Valores:
true
dataobjectdeletedbooleanSiempre
truecompanyModelIdintegerMí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
vehicleIdintegerMínimo
1tenantIdintegerEmpresa del vehículo (la de la clave API).
Mínimo
1platestringMatrícula normalizada (mayúsculas, sin espacios ni guiones).
Patrón:
^[A-Z0-9]{1,20}$modelstring | nullMarca y modelo;
nullsi no se indicó.Hasta 100 caracteres
regimestringown: 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:
owncompanyenergystringQué energía gasta:
combustion(litros),electric(kWh) ohybrid(litros y, si es enchufable, también kWh).Valores:
combustionelectrichybridassignmentModestringfixed: lo usan solo sus conductores (se fijan con/movimientos/flota/assign).pool: variable, lo puede usar cualquier conductor de la empresa.Valores:
fixedpoolfuelConsumptionnumber | nullConsumo medio en l/100 km (solo combustión e híbridos), o
null.Mínimo
0.1Máximo99.9electricConsumptionnumber | nullConsumo medio en kWh/100 km (solo eléctricos e híbridos enchufables), o
null.Mínimo
0.1Máximo99.9activebooleanfalsesi está dado de baja (solo aparece conincludeInactive: 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
companyModelIdintegerId del modelo de la empresa (no comparte numeración con
modelIddel catálogo).Mínimo
1namestringMarca y modelo tal como lo guardó la empresa (cabe en
modeldel vehículo).De 1 a 100 caracteresPatrón:
^\S+( \S+)*$energystringQué energía gasta:
combustion(litros),electric(kWh) ohybrid(litros y, si es enchufable, también kWh).Valores:
combustionelectrichybridfuelConsumptionnumber | nullConsumo medio en l/100 km, o
null.Mínimo
0.1Máximo99.9electricConsumptionnumber | nullConsumo medio en kWh/100 km, o
null.Mínimo
0.1Máximo99.9updatedAtstring (date-time)Última corrección (ISO 8601, UTC).
FlotaCatalogModelobject
modelIdintegerId estable de la variante en el catálogo.
Mínimo
1categorystringcar(turismo) ovan(furgoneta).Valores:
carvanmakestringMarca, en mayúsculas como en los datos de la EEA.
modelstringModelo, en mayúsculas y sin repetir la marca.
make + " " + modelcabe enmodeldel vehículo.fuelstringCombustible: gasolina, diésel, híbridos, híbridos enchufables (
*_phev), eléctrico, GLP (lpg), gas natural (cng) o bioetanol (e85).Valores:
petroldieselpetrol_hybriddiesel_hybridpetrol_phevdiesel_phevelectriclpgcnge85energystringLa
energydel vehículo que le corresponde:electric,hybrid(híbridos y enchufables) ocombustion(el resto).Qué energía gasta:
combustion(litros),electric(kWh) ohybrid(litros y, si es enchufable, también kWh).Valores:
combustionelectrichybridpowerKwinteger | nullPotencia en kW;
nullsi los datos no la traen.Mínimo
1Máximo1500yearFromintegerPrimer 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 | nullConsumo con un decimal, en
unit. En un enchufable es el ponderado.nullsolo en un eléctrico antiguo sin dato.unitstringUnidad de
consumption;kwh_100kmsolo enfuelelectric.Valores:
l_100kmkwh_100kmelectricConsumptionnumber | nullkWh/100 km de los híbridos enchufables (
*_phev);nullen el resto.consumptionSourcestring | nullOrigen de
consumption:homologated(WLTP, desde 2021, o el dato de un eléctrico),estimated(calculado desde el CO2, variantes de 2010-2020) onullsin consumo.Valores:
homologatedestimated
FlotaDriverobject
userIdintegerMínimo
1fullNamestringNombre 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.