> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lexio.rent/llms.txt
> Use this file to discover all available pages before exploring further.

# Modifier un véhicule

> **Accès** : `vehicles.write`

Modifie un véhicule en Merge Patch : champ omis inchangé, `null` efface un champ facultatif.

- `null` sur un champ exigé par le profil (ex. `doors` d’une voiture) → 400 `required` ; sur `brand`, `model`, `vehicleType`, `fuelType`, `seats`, `odometerKm`, `isActive`, `status` ou `equipment` → 400 `null_not_allowed`.
- Changer `vehicleType` ou `fuelType` juge le profil obtenu : dans la même requête, envoyez à `null` les champs devenus non applicables et fournissez les nouveaux requis.
- `maintenanceTrackingMode` démarre le suivi, avec les mêmes exigences qu’à la création ; une fois démarré, le changer ou l’effacer → 409 `MAINTENANCE_TRACKING_ALREADY_STARTED`.

**Refus** : véhicule archivé → 409 `VEHICLE_ARCHIVED` ; doublons et `categoryId` : comme à la [création](https://docs.lexio.rent/api-reference/flotte/create-vehicle).

**Effet** : changer `isActive` recalcule la tranche d’abonnement Lexio de l’agence.



## OpenAPI

````yaml /openapi.json patch /vehicles/{vehicleId}
openapi: 3.1.0
info:
  title: API Lexio
  version: 1.0.1
  description: >-
    # API Lexio v1


    L’API Lexio permet à un loueur de véhicules, ou à une plateforme partenaire
    autorisée par lui, de chiffrer, réserver, suivre et administrer ses
    locations depuis un serveur. Chaque appel agit sur l’organisation Lexio d’un
    seul loueur.


    - **Adresse de base** : `https://api.lexio.rent/api/external/v1`

    - **Authentification** : `Authorization: Bearer lck_…`, une clé créée par le
    loueur dans Lexio.

    - **Format** : JSON en UTF-8 ; erreurs RFC 9457 avec un `code` stable.

    - **Spécification OpenAPI 3.1** :
    [https://docs.lexio.rent/openapi.json](https://docs.lexio.rent/openapi.json),
    à importer dans votre client HTTP ou à utiliser pour générer un client.

    - **Contact** (support technique, demande d’accès, organisation de test) :
    contact@lexio.rent.


    Vocabulaire : une **location** (`/rentals`) est un contrat de location d’un
    véhicule ; un **lieu** (`/locations`) est une adresse de départ ou de
    retour.


    ## Guides


    1. [Démarrage rapide](https://docs.lexio.rent/demarrage-rapide) : de la
    recherche d’un véhicule à l’annulation.

    2. [Authentification et scopes](https://docs.lexio.rent/authentification) :
    clés du loueur et clés partenaires, scopes, plans.

    3. [Montants et TVA](https://docs.lexio.rent/montants-et-tva) : HT, TTC,
    devises, caution et franchise.

    4. [Cycle de vie d’une location](https://docs.lexio.rent/cycle-de-vie) :
    statuts et actions possibles.

    5. [Limites de débit](https://docs.lexio.rent/limites),
    [Pagination](https://docs.lexio.rent/pagination), [Idempotence et
    reprise](https://docs.lexio.rent/idempotence).

    6. [Synchronisation par événements](https://docs.lexio.rent/synchronisation)
    : suivre les changements sans webhook.

    7. [Versions et évolutions](https://docs.lexio.rent/versions),
    [Erreurs](https://docs.lexio.rent/erreurs).

    8. [Intégration d’une plateforme de
    réservation](https://docs.lexio.rent/integration-broker) : parcours
    partenaire, paiement.

    9. [Ce qui se gère dans
    Lexio](https://docs.lexio.rent/ce-qui-se-gere-dans-lexio) et [Historique des
    versions](https://docs.lexio.rent/historique).
  contact:
    name: Support Lexio
    email: contact@lexio.rent
    url: https://docs.lexio.rent
servers:
  - url: https://api.lexio.rent/api/external/v1
    description: Production
security:
  - ApiKey: []
tags:
  - name: Organisation
    description: >-
      Réglages de l’organisation liée à la clé : devise, fuseau, TVA, horaires,
      règles de réservation.
  - name: Offre
    description: >-
      Disponibilités et devis : ce qui est réservable, à quel prix, avant de
      créer une location.
  - name: Locations
    description: >-
      Les contrats de location : création, lecture, modification de notes,
      suppression.
  - name: Modifications
    description: >-
      Changer les dates, le véhicule, la protection, le titulaire ou les options
      d’une location, ou l’annuler.
  - name: Départ et retour
    description: >-
      Remise des clés et retour du véhicule : kilométrage, carburant, photos,
      état des lieux.
  - name: Paiements
    description: Encaissements, cautions et remboursements enregistrés sur une location.
  - name: Événements
    description: >-
      Flux des changements à relire pour synchroniser votre système, sans
      webhook.
  - name: Clients
    description: Fiches des clients particuliers et entreprises.
  - name: Flotte
    description: Véhicules, leur archivage et leurs indisponibilités.
  - name: Catalogue
    description: >-
      Catégories, lieux, options, franchises, cautions et forfaits kilométriques
      proposés à la location.
  - name: Tarification
    description: Saisons, remises de durée, paliers de délai et réglages de prix.
  - name: Entretien
    description: Alertes et historique d’entretien des véhicules.
paths:
  /vehicles/{vehicleId}:
    patch:
      tags:
        - Flotte
      summary: Modifier un véhicule
      description: >-
        **Accès** : `vehicles.write`


        Modifie un véhicule en Merge Patch : champ omis inchangé, `null` efface
        un champ facultatif.


        - `null` sur un champ exigé par le profil (ex. `doors` d’une voiture) →
        400 `required` ; sur `brand`, `model`, `vehicleType`, `fuelType`,
        `seats`, `odometerKm`, `isActive`, `status` ou `equipment` → 400
        `null_not_allowed`.

        - Changer `vehicleType` ou `fuelType` juge le profil obtenu : dans la
        même requête, envoyez à `null` les champs devenus non applicables et
        fournissez les nouveaux requis.

        - `maintenanceTrackingMode` démarre le suivi, avec les mêmes exigences
        qu’à la création ; une fois démarré, le changer ou l’effacer → 409
        `MAINTENANCE_TRACKING_ALREADY_STARTED`.


        **Refus** : véhicule archivé → 409 `VEHICLE_ARCHIVED` ; doublons et
        `categoryId` : comme à la
        [création](https://docs.lexio.rent/api-reference/flotte/create-vehicle).


        **Effet** : changer `isActive` recalcule la tranche d’abonnement Lexio
        de l’agence.
      operationId: updateVehicle
      parameters:
        - in: path
          name: vehicleId
          schema:
            examples:
              - 7c9e6679-7425-40de-944b-e07fc1f90ae7
            type: string
            format: uuid
          required: true
          description: Identifiant du véhicule.
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            example:
              status: BREAKDOWN
              odometerKm: 18620
            schema:
              type: object
              properties:
                plate:
                  description: >-
                    Immatriculation, en majuscules ; null si le véhicule n’en a
                    pas. Une plaque ou un numéro de série est toujours présent.
                  anyOf:
                    - type: string
                      pattern: ^[A-Za-z0-9][A-Za-z0-9 -]{1,14}$
                    - type: 'null'
                serialNumber:
                  description: >-
                    Numéro de série (deux-roues non immatriculé, par exemple) ;
                    null si absent.
                  anyOf:
                    - type: string
                      pattern: ^[A-Za-z0-9][A-Za-z0-9 ._/-]{1,39}$
                    - type: 'null'
                vin:
                  description: >-
                    Numéro d’identification du véhicule (VIN, 17 caractères au
                    plus) ; null si absent.
                  anyOf:
                    - type: string
                      pattern: ^[A-HJ-NPR-Za-hj-npr-z0-9]{1,17}$
                    - type: 'null'
                name:
                  description: >-
                    Nom d’usage donné par l’agence (ex. « 208 blanche ») ; null
                    si absent.
                  anyOf:
                    - type: string
                      maxLength: 100
                    - type: 'null'
                brand:
                  description: Marque (ex. Peugeot).
                  type: string
                  minLength: 1
                  maxLength: 50
                model:
                  description: Modèle (ex. 208).
                  type: string
                  minLength: 1
                  maxLength: 50
                description:
                  description: Description libre ; null si absente.
                  anyOf:
                    - type: string
                      maxLength: 1000
                    - type: 'null'
                color:
                  description: Couleur, en texte libre ; null si absente.
                  anyOf:
                    - type: string
                      maxLength: 30
                    - type: 'null'
                vehicleType:
                  description: >-
                    Type de véhicule : il fixe la famille et les champs
                    applicables.
                  type: string
                  enum:
                    - CITY
                    - COMPACT
                    - CROSSOVER
                    - SEDAN
                    - BREAK
                    - SUV
                    - OFF_ROAD
                    - PICKUP
                    - MINIVAN
                    - VAN
                    - UTILITY
                    - COUPE
                    - CONVERTIBLE
                    - SPORT
                    - LUXURY
                    - MOTORCYCLE
                    - SCOOTER
                fuelType:
                  description: >-
                    Carburant ou motorisation : il fixe l’énergie et les champs
                    applicables.
                  type: string
                  enum:
                    - PETROL
                    - DIESEL
                    - LPG
                    - HYBRID
                    - PLUGIN_HYBRID
                    - ELECTRIC
                transmission:
                  description: >-
                    Boîte de vitesses ; null si non applicable au profil
                    (deux-roues électrique).
                  anyOf:
                    - type: string
                      enum:
                        - MANUAL
                        - AUTOMATIC
                    - type: 'null'
                seats:
                  description: >-
                    Nombre de places : 1 à 50 pour une voiture, 1 à 3 pour un
                    deux-roues.
                  type: integer
                  minimum: 1
                  maximum: 50
                doors:
                  description: Nombre de portes ; null pour un deux-roues.
                  anyOf:
                    - type: integer
                      minimum: 2
                      maximum: 10
                    - type: 'null'
                modelYear:
                  description: Année modèle ; null si inconnue.
                  anyOf:
                    - minimum: 1900
                      maximum: 2100
                      type: integer
                    - type: 'null'
                registrationDate:
                  description: >-
                    Date de première immatriculation (`YYYY-MM-DD`), jamais dans
                    le futur ; null si inconnue.
                  anyOf:
                    - type: string
                      format: date
                    - type: 'null'
                odometerKm:
                  minimum: 0
                  maximum: 10000000
                  description: Kilométrage au compteur, en km.
                  type: integer
                powerKw:
                  description: >-
                    Puissance en kW ; null si inconnue. Un thermique va jusqu’à
                    1471 kW (2000 ch), un électrique jusqu’à 2000 kW.
                  anyOf:
                    - minimum: 0
                      maximum: 2000
                      type: integer
                    - type: 'null'
                fuelCapacityLiters:
                  description: >-
                    Capacité du réservoir, en litres ; null pour un électrique
                    ou si inconnue.
                  anyOf:
                    - type: number
                      minimum: 0
                      maximum: 500
                      description: Au plus 1 décimale.
                    - type: 'null'
                batteryCapacityKwh:
                  description: >-
                    Capacité de la batterie de traction, en kWh ; null si non
                    applicable ou inconnue.
                  anyOf:
                    - type: number
                      exclusiveMinimum: 0
                      maximum: 300
                      description: Au plus 2 décimales.
                    - type: 'null'
                rangeKm:
                  description: >-
                    Autonomie électrique, en km ; null si non applicable ou
                    inconnue.
                  anyOf:
                    - minimum: 0
                      maximum: 2000
                      type: integer
                    - type: 'null'
                chargePortType:
                  description: Prise de recharge ; null si non applicable ou inconnue.
                  anyOf:
                    - type: string
                      enum:
                        - TYPE_1
                        - TYPE_2
                        - CCS
                        - CHADEMO
                        - DC
                        - DOMESTIC
                    - type: 'null'
                equipment:
                  description: >-
                    Équipements présents, parmi ceux de la famille et de
                    l’énergie du véhicule. Remplace la liste entière ; chaque
                    code une seule fois.
                  maxItems: 40
                  type: array
                  items:
                    type: string
                    enum:
                      - AIR_CONDITIONING
                      - HEATED_SEATS
                      - LEATHER_SEATS
                      - KEYLESS_START
                      - ELECTRIC_TRUNK
                      - CONVERTIBLE_ROOF
                      - SUNROOF
                      - PANORAMIC_ROOF
                      - GPS
                      - BLUETOOTH
                      - CARPLAY
                      - ANDROID_AUTO
                      - WIRELESS_CHARGING
                      - ABS
                      - ESP
                      - CRUISE_CONTROL
                      - ADAPTIVE_CRUISE_CONTROL
                      - BLIND_SPOT_MONITOR
                      - PARKING_SENSORS
                      - REAR_CAMERA
                      - PARKING_ASSIST
                      - DASHCAM
                      - TURBO
                      - POWER_STEERING
                      - START_STOP
                      - ADBLUE
                      - TOW_BAR
                      - TOP_CASE
                      - WINDSHIELD
                      - HEATED_GRIPS
                      - USB_PORT
                      - TRACTION_CONTROL
                      - ANTI_THEFT_ALARM
                      - REMOVABLE_BATTERY
                      - SPARE_BATTERY
                categoryId:
                  description: >-
                    Catégorie tarifaire (`GET /categories/{categoryId}`) ; null
                    : véhicule sans prix, non réservable
                    (`NO_PRICING_CATEGORY`).
                  anyOf:
                    - examples:
                        - 7c9e6679-7425-40de-944b-e07fc1f90ae7
                      type: string
                      format: uuid
                    - type: 'null'
                isActive:
                  description: >-
                    false : véhicule mis hors service par l’agence, non
                    réservable (`INACTIVE`).
                  type: boolean
                status:
                  description: >-
                    `BREAKDOWN` : véhicule en panne, non réservable.
                    `OPERATIONAL` sinon, location en cours comprise.
                  type: string
                  enum:
                    - OPERATIONAL
                    - BREAKDOWN
                maintenanceTrackingMode:
                  description: >-
                    Mode de démarrage du suivi d’entretien, définitif une fois
                    posé ; null : suivi non démarré. `FROM_ZERO` (véhicule neuf
                    ou sans historique fiable) et `MANUAL_HISTORY` (historique
                    saisi par `POST /maintenance-records`) comptent les
                    échéances depuis 0 km et la première immatriculation ;
                    `ASSUME_UP_TO_DATE` tient le véhicule pour à jour à son
                    entrée en flotte (kilométrage et date de ce jour).
                  anyOf:
                    - type: string
                      enum:
                        - FROM_ZERO
                        - ASSUME_UP_TO_DATE
                        - MANUAL_HISTORY
                    - type: 'null'
              additionalProperties: false
          application/merge-patch+json:
            example:
              status: BREAKDOWN
              odometerKm: 18620
            schema:
              type: object
              properties:
                plate:
                  description: >-
                    Immatriculation, en majuscules ; null si le véhicule n’en a
                    pas. Une plaque ou un numéro de série est toujours présent.
                  anyOf:
                    - type: string
                      pattern: ^[A-Za-z0-9][A-Za-z0-9 -]{1,14}$
                    - type: 'null'
                serialNumber:
                  description: >-
                    Numéro de série (deux-roues non immatriculé, par exemple) ;
                    null si absent.
                  anyOf:
                    - type: string
                      pattern: ^[A-Za-z0-9][A-Za-z0-9 ._/-]{1,39}$
                    - type: 'null'
                vin:
                  description: >-
                    Numéro d’identification du véhicule (VIN, 17 caractères au
                    plus) ; null si absent.
                  anyOf:
                    - type: string
                      pattern: ^[A-HJ-NPR-Za-hj-npr-z0-9]{1,17}$
                    - type: 'null'
                name:
                  description: >-
                    Nom d’usage donné par l’agence (ex. « 208 blanche ») ; null
                    si absent.
                  anyOf:
                    - type: string
                      maxLength: 100
                    - type: 'null'
                brand:
                  description: Marque (ex. Peugeot).
                  type: string
                  minLength: 1
                  maxLength: 50
                model:
                  description: Modèle (ex. 208).
                  type: string
                  minLength: 1
                  maxLength: 50
                description:
                  description: Description libre ; null si absente.
                  anyOf:
                    - type: string
                      maxLength: 1000
                    - type: 'null'
                color:
                  description: Couleur, en texte libre ; null si absente.
                  anyOf:
                    - type: string
                      maxLength: 30
                    - type: 'null'
                vehicleType:
                  description: >-
                    Type de véhicule : il fixe la famille et les champs
                    applicables.
                  type: string
                  enum:
                    - CITY
                    - COMPACT
                    - CROSSOVER
                    - SEDAN
                    - BREAK
                    - SUV
                    - OFF_ROAD
                    - PICKUP
                    - MINIVAN
                    - VAN
                    - UTILITY
                    - COUPE
                    - CONVERTIBLE
                    - SPORT
                    - LUXURY
                    - MOTORCYCLE
                    - SCOOTER
                fuelType:
                  description: >-
                    Carburant ou motorisation : il fixe l’énergie et les champs
                    applicables.
                  type: string
                  enum:
                    - PETROL
                    - DIESEL
                    - LPG
                    - HYBRID
                    - PLUGIN_HYBRID
                    - ELECTRIC
                transmission:
                  description: >-
                    Boîte de vitesses ; null si non applicable au profil
                    (deux-roues électrique).
                  anyOf:
                    - type: string
                      enum:
                        - MANUAL
                        - AUTOMATIC
                    - type: 'null'
                seats:
                  description: >-
                    Nombre de places : 1 à 50 pour une voiture, 1 à 3 pour un
                    deux-roues.
                  type: integer
                  minimum: 1
                  maximum: 50
                doors:
                  description: Nombre de portes ; null pour un deux-roues.
                  anyOf:
                    - type: integer
                      minimum: 2
                      maximum: 10
                    - type: 'null'
                modelYear:
                  description: Année modèle ; null si inconnue.
                  anyOf:
                    - minimum: 1900
                      maximum: 2100
                      type: integer
                    - type: 'null'
                registrationDate:
                  description: >-
                    Date de première immatriculation (`YYYY-MM-DD`), jamais dans
                    le futur ; null si inconnue.
                  anyOf:
                    - type: string
                      format: date
                    - type: 'null'
                odometerKm:
                  minimum: 0
                  maximum: 10000000
                  description: Kilométrage au compteur, en km.
                  type: integer
                powerKw:
                  description: >-
                    Puissance en kW ; null si inconnue. Un thermique va jusqu’à
                    1471 kW (2000 ch), un électrique jusqu’à 2000 kW.
                  anyOf:
                    - minimum: 0
                      maximum: 2000
                      type: integer
                    - type: 'null'
                fuelCapacityLiters:
                  description: >-
                    Capacité du réservoir, en litres ; null pour un électrique
                    ou si inconnue.
                  anyOf:
                    - type: number
                      minimum: 0
                      maximum: 500
                      description: Au plus 1 décimale.
                    - type: 'null'
                batteryCapacityKwh:
                  description: >-
                    Capacité de la batterie de traction, en kWh ; null si non
                    applicable ou inconnue.
                  anyOf:
                    - type: number
                      exclusiveMinimum: 0
                      maximum: 300
                      description: Au plus 2 décimales.
                    - type: 'null'
                rangeKm:
                  description: >-
                    Autonomie électrique, en km ; null si non applicable ou
                    inconnue.
                  anyOf:
                    - minimum: 0
                      maximum: 2000
                      type: integer
                    - type: 'null'
                chargePortType:
                  description: Prise de recharge ; null si non applicable ou inconnue.
                  anyOf:
                    - type: string
                      enum:
                        - TYPE_1
                        - TYPE_2
                        - CCS
                        - CHADEMO
                        - DC
                        - DOMESTIC
                    - type: 'null'
                equipment:
                  description: >-
                    Équipements présents, parmi ceux de la famille et de
                    l’énergie du véhicule. Remplace la liste entière ; chaque
                    code une seule fois.
                  maxItems: 40
                  type: array
                  items:
                    type: string
                    enum:
                      - AIR_CONDITIONING
                      - HEATED_SEATS
                      - LEATHER_SEATS
                      - KEYLESS_START
                      - ELECTRIC_TRUNK
                      - CONVERTIBLE_ROOF
                      - SUNROOF
                      - PANORAMIC_ROOF
                      - GPS
                      - BLUETOOTH
                      - CARPLAY
                      - ANDROID_AUTO
                      - WIRELESS_CHARGING
                      - ABS
                      - ESP
                      - CRUISE_CONTROL
                      - ADAPTIVE_CRUISE_CONTROL
                      - BLIND_SPOT_MONITOR
                      - PARKING_SENSORS
                      - REAR_CAMERA
                      - PARKING_ASSIST
                      - DASHCAM
                      - TURBO
                      - POWER_STEERING
                      - START_STOP
                      - ADBLUE
                      - TOW_BAR
                      - TOP_CASE
                      - WINDSHIELD
                      - HEATED_GRIPS
                      - USB_PORT
                      - TRACTION_CONTROL
                      - ANTI_THEFT_ALARM
                      - REMOVABLE_BATTERY
                      - SPARE_BATTERY
                categoryId:
                  description: >-
                    Catégorie tarifaire (`GET /categories/{categoryId}`) ; null
                    : véhicule sans prix, non réservable
                    (`NO_PRICING_CATEGORY`).
                  anyOf:
                    - examples:
                        - 7c9e6679-7425-40de-944b-e07fc1f90ae7
                      type: string
                      format: uuid
                    - type: 'null'
                isActive:
                  description: >-
                    false : véhicule mis hors service par l’agence, non
                    réservable (`INACTIVE`).
                  type: boolean
                status:
                  description: >-
                    `BREAKDOWN` : véhicule en panne, non réservable.
                    `OPERATIONAL` sinon, location en cours comprise.
                  type: string
                  enum:
                    - OPERATIONAL
                    - BREAKDOWN
                maintenanceTrackingMode:
                  description: >-
                    Mode de démarrage du suivi d’entretien, définitif une fois
                    posé ; null : suivi non démarré. `FROM_ZERO` (véhicule neuf
                    ou sans historique fiable) et `MANUAL_HISTORY` (historique
                    saisi par `POST /maintenance-records`) comptent les
                    échéances depuis 0 km et la première immatriculation ;
                    `ASSUME_UP_TO_DATE` tient le véhicule pour à jour à son
                    entrée en flotte (kilométrage et date de ce jour).
                  anyOf:
                    - type: string
                      enum:
                        - FROM_ZERO
                        - ASSUME_UP_TO_DATE
                        - MANUAL_HISTORY
                    - type: 'null'
              additionalProperties: false
      responses:
        '200':
          description: Modifier un véhicule
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Idempotent-Replayed:
              $ref: '#/components/headers/IdempotentReplayed'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Vehicle'
                required:
                  - data
        '400':
          description: '`MALFORMED_REQUEST`, `VALIDATION_FAILED`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/MalformedRequestProblem'
                  - $ref: '#/components/schemas/ValidationFailedProblem'
        '401':
          description: >-
            `API_KEY_DISABLED`, `API_KEY_EXPIRED`, `API_KEY_INVALID`,
            `API_KEY_MISSING`, `API_KEY_REVOKED`
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            WWW-Authenticate:
              $ref: '#/components/headers/WwwAuthenticate'
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ApiKeyDisabledProblem'
                  - $ref: '#/components/schemas/ApiKeyExpiredProblem'
                  - $ref: '#/components/schemas/ApiKeyInvalidProblem'
                  - $ref: '#/components/schemas/ApiKeyMissingProblem'
                  - $ref: '#/components/schemas/ApiKeyRevokedProblem'
        '403':
          description: >-
            `FEATURE_NOT_AVAILABLE`, `INSUFFICIENT_SCOPE`,
            `ORGANIZATION_SUSPENDED`
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/FeatureNotAvailableProblem'
                  - $ref: '#/components/schemas/InsufficientScopeProblem'
                  - $ref: '#/components/schemas/OrganizationSuspendedProblem'
        '404':
          description: '`NOT_FOUND`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/NotFoundProblem'
        '409':
          description: >-
            `ALREADY_EXISTS`, `IDEMPOTENCY_IN_FLIGHT`,
            `MAINTENANCE_TRACKING_ALREADY_STARTED`, `VEHICLE_ARCHIVED`
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/AlreadyExistsProblem'
                  - $ref: '#/components/schemas/IdempotencyInFlightProblem'
                  - $ref: >-
                      #/components/schemas/MaintenanceTrackingAlreadyStartedProblem
                  - $ref: '#/components/schemas/VehicleArchivedProblem'
        '413':
          description: '`PAYLOAD_TOO_LARGE`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/PayloadTooLargeProblem'
        '415':
          description: '`UNSUPPORTED_MEDIA_TYPE`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/UnsupportedMediaTypeProblem'
        '422':
          description: '`IDEMPOTENCY_KEY_REUSED`, `REFERENCE_NOT_FOUND`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/IdempotencyKeyReusedProblem'
                  - $ref: '#/components/schemas/ReferenceNotFoundProblem'
        '429':
          description: '`RATE_LIMITED`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/RateLimitedProblem'
        '500':
          description: '`INTERNAL_ERROR`'
          headers:
            X-Request-Id:
              $ref: '#/components/headers/XRequestId'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/InternalErrorProblem'
      security:
        - ApiKey: []
components:
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: false
      example: 8b3e1d2c-4a5f-4c6b-9e7d-1f2a3b4c5d6e
      description: >-
        Clé unique de l’opération, réutilisée à chaque nouvel essai : un rejeu
        avec la même clé et le même corps renvoie la réponse initiale sans rien
        réécrire. Voir [Idempotence](https://docs.lexio.rent/idempotence).
      schema:
        type: string
        minLength: 1
        maxLength: 255
        pattern: ^[\x20-\x7E]+$
        examples:
          - 8b3e1d2c-4a5f-4c6b-9e7d-1f2a3b4c5d6e
  headers:
    XRequestId:
      description: Identifiant de la requête, à communiquer au support.
      schema:
        type: string
    RateLimitLimit:
      description: Plafond du seau de débit qui s’applique à la requête.
      schema:
        type: integer
        minimum: 0
    RateLimitRemaining:
      description: Requêtes encore permises dans la fenêtre en cours.
      schema:
        type: integer
        minimum: 0
    RateLimitReset:
      description: Secondes avant la remise à zéro de la fenêtre.
      schema:
        type: integer
        minimum: 0
    IdempotentReplayed:
      description: >-
        `true` quand la réponse est le rejeu d’une requête déjà traitée avec la
        même `Idempotency-Key`.
      schema:
        type: string
        enum:
          - 'true'
    WwwAuthenticate:
      description: >-
        Schéma d’authentification attendu (`Bearer`), avec
        `error="invalid_token"` pour une clé refusée.
      schema:
        type: string
    RetryAfter:
      description: Secondes à attendre avant de rejouer la requête.
      schema:
        type: integer
        minimum: 0
  schemas:
    Vehicle:
      examples:
        - id: 8d2f4c1e-6a3b-4f7d-9e2c-1b5a7c9d3e4f
          plate: AB-123-CD
          serialNumber: null
          vin: VF3UPHNS8NS012345
          name: null
          brand: Peugeot
          model: '208'
          description: null
          color: Blanc nacré
          vehicleType: CITY
          family: CAR
          energy: FUEL
          fuelType: PETROL
          transmission: MANUAL
          seats: 5
          doors: 5
          modelYear: 2024
          registrationDate: '2024-03-15'
          odometerKm: 18450
          powerKw: 74
          fuelCapacityLiters: 44
          batteryCapacityKwh: null
          rangeKm: null
          chargePortType: null
          equipment:
            - AIR_CONDITIONING
            - BLUETOOTH
            - GPS
            - CARPLAY
          categoryId: 1f6b2d3c-7a8e-4c2b-9d1e-5a4f3b2c1d0e
          status: OPERATIONAL
          isActive: true
          isArchived: false
          isBookable: true
          notBookableReasons: []
          isMaintenanceTracked: true
          maintenanceTrackingMode: FROM_ZERO
          displayOrder: 1
          imageUrls:
            - https://cdn.lexio.rent/vehicles/8d2f4c1e/front.webp
          createdAt: '2026-03-02T09:14:27+01:00'
          updatedAt: '2026-11-04T18:02:51+01:00'
      type: object
      properties:
        id:
          examples:
            - 7c9e6679-7425-40de-944b-e07fc1f90ae7
          description: Identifiant du véhicule.
          type: string
          format: uuid
        plate:
          description: >-
            Immatriculation, en majuscules ; null si le véhicule n’en a pas. Une
            plaque ou un numéro de série est toujours présent.
          anyOf:
            - type: string
            - type: 'null'
        serialNumber:
          description: >-
            Numéro de série (deux-roues non immatriculé, par exemple) ; null si
            absent.
          anyOf:
            - type: string
            - type: 'null'
        vin:
          description: >-
            Numéro d’identification du véhicule (VIN, 17 caractères au plus) ;
            null si absent.
          anyOf:
            - type: string
              maxLength: 17
            - type: 'null'
        name:
          description: >-
            Nom d’usage donné par l’agence (ex. « 208 blanche ») ; null si
            absent.
          anyOf:
            - type: string
              maxLength: 100
            - type: 'null'
        brand:
          description: Marque (ex. Peugeot).
          type: string
          maxLength: 50
        model:
          description: Modèle (ex. 208).
          type: string
          maxLength: 50
        description:
          description: Description libre ; null si absente.
          anyOf:
            - type: string
              maxLength: 1000
            - type: 'null'
        color:
          description: Couleur, en texte libre ; null si absente.
          anyOf:
            - type: string
              maxLength: 30
            - type: 'null'
        vehicleType:
          description: 'Type de véhicule : il fixe la famille et les champs applicables.'
          type: string
          enum:
            - CITY
            - COMPACT
            - CROSSOVER
            - SEDAN
            - BREAK
            - SUV
            - OFF_ROAD
            - PICKUP
            - MINIVAN
            - VAN
            - UTILITY
            - COUPE
            - CONVERTIBLE
            - SPORT
            - LUXURY
            - MOTORCYCLE
            - SCOOTER
        family:
          description: Famille, déduite de `vehicleType`.
          type: string
          enum:
            - CAR
            - TWO_WHEELER
        energy:
          description: Énergie, déduite de `fuelType`.
          type: string
          enum:
            - FUEL
            - ELECTRIC
        fuelType:
          description: >-
            Carburant ou motorisation : il fixe l’énergie et les champs
            applicables.
          type: string
          enum:
            - PETROL
            - DIESEL
            - LPG
            - HYBRID
            - PLUGIN_HYBRID
            - ELECTRIC
        transmission:
          description: >-
            Boîte de vitesses ; null si non applicable au profil (deux-roues
            électrique).
          anyOf:
            - type: string
              enum:
                - MANUAL
                - AUTOMATIC
            - type: 'null'
        seats:
          description: >-
            Nombre de places : 1 à 50 pour une voiture, 1 à 3 pour un
            deux-roues.
          type: integer
          minimum: 1
          maximum: 50
        doors:
          description: Nombre de portes ; null pour un deux-roues.
          anyOf:
            - type: integer
              minimum: 2
              maximum: 10
            - type: 'null'
        modelYear:
          description: Année modèle ; null si inconnue.
          anyOf:
            - minimum: 1900
              maximum: 2100
              type: integer
            - type: 'null'
        registrationDate:
          description: >-
            Date de première immatriculation (`YYYY-MM-DD`), jamais dans le
            futur ; null si inconnue.
          anyOf:
            - examples:
                - '2026-11-10'
              type: string
              format: date
            - type: 'null'
        odometerKm:
          minimum: 0
          maximum: 10000000
          description: Kilométrage au compteur, en km.
          type: integer
        powerKw:
          description: >-
            Puissance en kW ; null si inconnue. Un thermique va jusqu’à 1471 kW
            (2000 ch), un électrique jusqu’à 2000 kW.
          anyOf:
            - minimum: 0
              maximum: 2000
              type: integer
            - type: 'null'
        fuelCapacityLiters:
          description: >-
            Capacité du réservoir, en litres ; null pour un électrique ou si
            inconnue.
          anyOf:
            - type: number
              minimum: 0
              maximum: 500
              description: Au plus 1 décimale.
            - type: 'null'
        batteryCapacityKwh:
          description: >-
            Capacité de la batterie de traction, en kWh ; null si non applicable
            ou inconnue.
          anyOf:
            - type: number
              exclusiveMinimum: 0
              maximum: 300
              description: Au plus 2 décimales.
            - type: 'null'
        rangeKm:
          description: Autonomie électrique, en km ; null si non applicable ou inconnue.
          anyOf:
            - minimum: 0
              maximum: 2000
              type: integer
            - type: 'null'
        chargePortType:
          description: Prise de recharge ; null si non applicable ou inconnue.
          anyOf:
            - type: string
              enum:
                - TYPE_1
                - TYPE_2
                - CCS
                - CHADEMO
                - DC
                - DOMESTIC
            - type: 'null'
        equipment:
          description: >-
            Équipements présents, parmi ceux de la famille et de l’énergie du
            véhicule.
          maxItems: 40
          type: array
          items:
            type: string
            enum:
              - AIR_CONDITIONING
              - HEATED_SEATS
              - LEATHER_SEATS
              - KEYLESS_START
              - ELECTRIC_TRUNK
              - CONVERTIBLE_ROOF
              - SUNROOF
              - PANORAMIC_ROOF
              - GPS
              - BLUETOOTH
              - CARPLAY
              - ANDROID_AUTO
              - WIRELESS_CHARGING
              - ABS
              - ESP
              - CRUISE_CONTROL
              - ADAPTIVE_CRUISE_CONTROL
              - BLIND_SPOT_MONITOR
              - PARKING_SENSORS
              - REAR_CAMERA
              - PARKING_ASSIST
              - DASHCAM
              - TURBO
              - POWER_STEERING
              - START_STOP
              - ADBLUE
              - TOW_BAR
              - TOP_CASE
              - WINDSHIELD
              - HEATED_GRIPS
              - USB_PORT
              - TRACTION_CONTROL
              - ANTI_THEFT_ALARM
              - REMOVABLE_BATTERY
              - SPARE_BATTERY
        categoryId:
          description: >-
            Catégorie tarifaire (`GET /categories/{categoryId}`) ; null :
            véhicule sans prix, non réservable (`NO_PRICING_CATEGORY`).
          anyOf:
            - examples:
                - 7c9e6679-7425-40de-944b-e07fc1f90ae7
              type: string
              format: uuid
            - type: 'null'
        status:
          description: >-
            `BREAKDOWN` : véhicule en panne, non réservable. `OPERATIONAL`
            sinon, location en cours comprise.
          type: string
          enum:
            - OPERATIONAL
            - BREAKDOWN
        isActive:
          description: >-
            false : véhicule mis hors service par l’agence, non réservable
            (`INACTIVE`).
          type: boolean
        isArchived:
          description: 'true : véhicule archivé, sorti de la flotte et non modifiable.'
          type: boolean
        isBookable:
          description: >-
            true si `notBookableReasons` est vide. Ne dit rien de l’occupation
            sur une période : voir `GET /availability`.
          type: boolean
        notBookableReasons:
          description: >-
            Raisons durables qui empêchent toute réservation ;
            `MAINTENANCE_OVERDUE` : entretien ou contrôle technique en retard,
            quand l’agence bloque les réservations sur ce retard.
          maxItems: 5
          type: array
          items:
            type: string
            enum:
              - INACTIVE
              - ARCHIVED
              - BREAKDOWN
              - MAINTENANCE_OVERDUE
              - NO_PRICING_CATEGORY
        isMaintenanceTracked:
          description: >-
            true une fois le suivi d’entretien démarré
            (`maintenanceTrackingMode`) ; il ne s’arrête plus.
          type: boolean
        maintenanceTrackingMode:
          description: >-
            Mode de démarrage du suivi d’entretien, définitif une fois posé ;
            null : suivi non démarré. `FROM_ZERO` (véhicule neuf ou sans
            historique fiable) et `MANUAL_HISTORY` (historique saisi par `POST
            /maintenance-records`) comptent les échéances depuis 0 km et la
            première immatriculation ; `ASSUME_UP_TO_DATE` tient le véhicule
            pour à jour à son entrée en flotte (kilométrage et date de ce jour).
          anyOf:
            - type: string
              enum:
                - FROM_ZERO
                - ASSUME_UP_TO_DATE
                - MANUAL_HISTORY
            - type: 'null'
        displayOrder:
          description: Rang d’affichage choisi dans Lexio ; ordre de la liste.
          type: integer
        imageUrls:
          description: >-
            Photos de présentation, URL publiques stables, dans l’ordre choisi
            dans Lexio.
          maxItems: 30
          type: array
          items:
            type: string
            format: uri
        createdAt:
          examples:
            - '2026-11-10T10:00:00+01:00'
          description: Création, heure de l’agence avec décalage.
          type: string
          format: date-time
        updatedAt:
          examples:
            - '2026-11-10T10:00:00+01:00'
          description: Dernière modification.
          type: string
          format: date-time
      required:
        - id
        - plate
        - serialNumber
        - vin
        - name
        - brand
        - model
        - description
        - color
        - vehicleType
        - family
        - energy
        - fuelType
        - transmission
        - seats
        - doors
        - modelYear
        - registrationDate
        - odometerKm
        - powerKw
        - fuelCapacityLiters
        - batteryCapacityKwh
        - rangeKm
        - chargePortType
        - equipment
        - categoryId
        - status
        - isActive
        - isArchived
        - isBookable
        - notBookableReasons
        - isMaintenanceTracked
        - maintenanceTrackingMode
        - displayOrder
        - imageUrls
        - createdAt
        - updatedAt
    MalformedRequestProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/malformed-request
        title:
          type: string
          const: Corps de requête illisible
        status:
          type: number
          const: 400
        code:
          type: string
          const: MALFORMED_REQUEST
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    ValidationFailedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/validation-failed
        title:
          type: string
          const: Requête invalide
        status:
          type: number
          const: 400
        code:
          type: string
          const: VALIDATION_FAILED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        errors:
          minItems: 1
          maxItems: 100
          type: array
          items:
            type: object
            properties:
              pointer:
                type: string
              code:
                type: string
                enum:
                  - required
                  - invalid_type
                  - invalid_format
                  - invalid_value
                  - too_small
                  - too_big
                  - too_many_decimals
                  - out_of_range
                  - unknown_field
                  - null_not_allowed
                  - empty_string
                  - empty_patch
                  - mutually_exclusive
                  - not_applicable
                  - duplicate
                  - end_before_start
                  - date_in_past
                  - nonexistent_local_time
                  - offset_not_allowed
                  - offset_required
                  - upload_expired
                  - upload_incomplete
                  - upload_conflict
              detail:
                type: string
            required:
              - pointer
              - code
              - detail
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - errors
    ApiKeyDisabledProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/api-key-disabled
        title:
          type: string
          const: Clé API désactivée
        status:
          type: number
          const: 401
        code:
          type: string
          const: API_KEY_DISABLED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    ApiKeyExpiredProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/api-key-expired
        title:
          type: string
          const: Clé API expirée
        status:
          type: number
          const: 401
        code:
          type: string
          const: API_KEY_EXPIRED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    ApiKeyInvalidProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/api-key-invalid
        title:
          type: string
          const: Clé API invalide
        status:
          type: number
          const: 401
        code:
          type: string
          const: API_KEY_INVALID
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    ApiKeyMissingProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/api-key-missing
        title:
          type: string
          const: Clé API absente
        status:
          type: number
          const: 401
        code:
          type: string
          const: API_KEY_MISSING
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    ApiKeyRevokedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/api-key-revoked
        title:
          type: string
          const: Clé API révoquée
        status:
          type: number
          const: 401
        code:
          type: string
          const: API_KEY_REVOKED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    FeatureNotAvailableProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/feature-not-available
        title:
          type: string
          const: Fonctionnalité non incluse
        status:
          type: number
          const: 403
        code:
          type: string
          const: FEATURE_NOT_AVAILABLE
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        feature:
          type: string
          minLength: 1
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - feature
    InsufficientScopeProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/insufficient-scope
        title:
          type: string
          const: Scope insuffisant
        status:
          type: number
          const: 403
        code:
          type: string
          const: INSUFFICIENT_SCOPE
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        requiredScopes:
          minItems: 1
          maxItems: 20
          type: array
          items:
            type: string
            enum:
              - offers.read
              - quotes.write
              - rentals.read
              - rentals.write
              - rentals.operate
              - rentals.delete
              - payments.write
              - payments.refund
              - customers.read
              - customers.write
              - customers.delete
              - vehicles.read
              - vehicles.write
              - vehicles.delete
              - catalog.read
              - catalog.write
              - pricing.read
              - pricing.write
              - maintenance.read
              - maintenance.write
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - requiredScopes
    OrganizationSuspendedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/organization-suspended
        title:
          type: string
          const: Organisation suspendue
        status:
          type: number
          const: 403
        code:
          type: string
          const: ORGANIZATION_SUSPENDED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    NotFoundProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/not-found
        title:
          type: string
          const: Ressource introuvable
        status:
          type: number
          const: 404
        code:
          type: string
          const: NOT_FOUND
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        resource:
          type: string
          enum:
            - RENTAL
            - RENTAL_OPTION
            - QUOTE
            - PAYMENT
            - INVOICE
            - PHOTO
            - AMENDMENT
            - INSPECTION
            - CUSTOMER
            - VEHICLE
            - VEHICLE_BLOCK
            - CATEGORY
            - OPTION
            - DEDUCTIBLE
            - DEPOSIT
            - MILEAGE_PACKAGE
            - LOCATION
            - SEASON
            - SEASON_CALENDAR_MONTH
            - DURATION_DISCOUNT
            - LEAD_TIME_TIER
            - MAINTENANCE_RECORD
            - MAINTENANCE_OPERATION
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - resource
    AlreadyExistsProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/already-exists
        title:
          type: string
          const: Doublon
        status:
          type: number
          const: 409
        code:
          type: string
          const: ALREADY_EXISTS
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        field:
          type: string
          minLength: 1
        conflictingId:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - field
        - conflictingId
    IdempotencyInFlightProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/idempotency-in-flight
        title:
          type: string
          const: Requête identique en cours
        status:
          type: number
          const: 409
        code:
          type: string
          const: IDEMPOTENCY_IN_FLIGHT
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    MaintenanceTrackingAlreadyStartedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/maintenance-tracking-already-started
        title:
          type: string
          const: Suivi d’entretien déjà démarré
        status:
          type: number
          const: 409
        code:
          type: string
          const: MAINTENANCE_TRACKING_ALREADY_STARTED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        maintenanceTrackingMode:
          anyOf:
            - type: string
              enum:
                - FROM_ZERO
                - ASSUME_UP_TO_DATE
                - MANUAL_HISTORY
            - type: 'null'
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - maintenanceTrackingMode
    VehicleArchivedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/vehicle-archived
        title:
          type: string
          const: Véhicule archivé
        status:
          type: number
          const: 409
        code:
          type: string
          const: VEHICLE_ARCHIVED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    PayloadTooLargeProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/payload-too-large
        title:
          type: string
          const: Corps trop volumineux
        status:
          type: number
          const: 413
        code:
          type: string
          const: PAYLOAD_TOO_LARGE
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        maxBytes:
          type: integer
          minimum: 1
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - maxBytes
    UnsupportedMediaTypeProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/unsupported-media-type
        title:
          type: string
          const: Type de contenu non pris en charge
        status:
          type: number
          const: 415
        code:
          type: string
          const: UNSUPPORTED_MEDIA_TYPE
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        accepted:
          minItems: 1
          maxItems: 10
          type: array
          items:
            type: string
            minLength: 1
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - accepted
    IdempotencyKeyReusedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/idempotency-key-reused
        title:
          type: string
          const: Clé d’idempotence réutilisée
        status:
          type: number
          const: 422
        code:
          type: string
          const: IDEMPOTENCY_KEY_REUSED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
    ReferenceNotFoundProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/reference-not-found
        title:
          type: string
          const: Référence introuvable
        status:
          type: number
          const: 422
        code:
          type: string
          const: REFERENCE_NOT_FOUND
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        errors:
          minItems: 1
          maxItems: 100
          type: array
          items:
            type: object
            properties:
              pointer:
                type: string
              code:
                type: string
                enum:
                  - required
                  - invalid_type
                  - invalid_format
                  - invalid_value
                  - too_small
                  - too_big
                  - too_many_decimals
                  - out_of_range
                  - unknown_field
                  - null_not_allowed
                  - empty_string
                  - empty_patch
                  - mutually_exclusive
                  - not_applicable
                  - duplicate
                  - end_before_start
                  - date_in_past
                  - nonexistent_local_time
                  - offset_not_allowed
                  - offset_required
                  - upload_expired
                  - upload_incomplete
                  - upload_conflict
              detail:
                type: string
            required:
              - pointer
              - code
              - detail
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - errors
    RateLimitedProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/rate-limited
        title:
          type: string
          const: Trop de requêtes
        status:
          type: number
          const: 429
        code:
          type: string
          const: RATE_LIMITED
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
        limit:
          type: string
          enum:
            - PRE_AUTH
            - PER_KEY
            - WRITE
            - QUOTE
        windowSeconds:
          type: integer
          minimum: 1
        retryAfter:
          type: integer
          minimum: 0
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
        - limit
        - windowSeconds
        - retryAfter
    InternalErrorProblem:
      type: object
      properties:
        type:
          type: string
          const: https://api.lexio.rent/errors/internal-error
        title:
          type: string
          const: Erreur interne
        status:
          type: number
          const: 500
        code:
          type: string
          const: INTERNAL_ERROR
        detail:
          type: string
        instance:
          type: string
        requestId:
          type: string
      required:
        - type
        - title
        - status
        - code
        - detail
        - instance
        - requestId
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer
      bearerFormat: lck_…
      description: >-
        Clé API `lck_…` créée dans Lexio (Paramètres → Développeur), envoyée en
        `Authorization: Bearer`. Voir
        [Authentification](https://docs.lexio.rent/authentification).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.