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

# Créer une option

> **Accès** : `catalog.write` · Fonctionnalité d’abonnement : `pricing.options` ([plans](https://docs.lexio.rent/authentification))

Crée une option.

**Règles**
- `price.maxAmountHT` plafonne le prix par exemplaire sur la location : interdit avec `unit: RENTAL`, jamais inférieur à `amountHT`, `null` (pas 0) pour ne pas plafonner.
- `maxQuantity` ne se fixe que sur une option `STANDARD` (sinon 400 `not_applicable`).
- `youngDriverAgeThreshold` est requis pour une option `YOUNG_DRIVER`, refusé pour les autres.
- Omis : `maxQuantity` et `stockCount` valent 1, `availableMonths` [] (toute l’année).

**Refus** : une seconde option `ADDITIONAL_DRIVER` ou `YOUNG_DRIVER` → 409 `ALREADY_EXISTS` (`field: kind`, `conflictingId`).



## OpenAPI

````yaml /openapi.json post /options
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:
  /options:
    post:
      tags:
        - Catalogue
      summary: Créer une option
      description: >-
        **Accès** : `catalog.write` · Fonctionnalité d’abonnement :
        `pricing.options` ([plans](https://docs.lexio.rent/authentification))


        Crée une option.


        **Règles**

        - `price.maxAmountHT` plafonne le prix par exemplaire sur la location :
        interdit avec `unit: RENTAL`, jamais inférieur à `amountHT`, `null` (pas
        0) pour ne pas plafonner.

        - `maxQuantity` ne se fixe que sur une option `STANDARD` (sinon 400
        `not_applicable`).

        - `youngDriverAgeThreshold` est requis pour une option `YOUNG_DRIVER`,
        refusé pour les autres.

        - Omis : `maxQuantity` et `stockCount` valent 1, `availableMonths` []
        (toute l’année).


        **Refus** : une seconde option `ADDITIONAL_DRIVER` ou `YOUNG_DRIVER` →
        409 `ALREADY_EXISTS` (`field: kind`, `conflictingId`).
      operationId: createOption
      parameters:
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            example:
              name: Siège enfant
              kind: STANDARD
              group: ACCESSORIES
              price:
                unit: DAY
                amountHT: 4
                maxAmountHT: 40
              maxQuantity: 2
              stockCount: 4
            schema:
              type: object
              properties:
                name:
                  description: Nom affiché au client.
                  type: string
                  minLength: 1
                  maxLength: 100
                kind:
                  description: >-
                    `STANDARD` : option vendue à la quantité.
                    `ADDITIONAL_DRIVER` : conducteur additionnel, réservable par
                    une clé interne seulement. `YOUNG_DRIVER` : supplément jeune
                    conducteur, appliqué par Lexio d’après l’âge des
                    conducteurs, jamais demandé directement. Une seule option de
                    chacun de ces deux derniers types par organisation.
                  type: string
                  enum:
                    - STANDARD
                    - ADDITIONAL_DRIVER
                    - YOUNG_DRIVER
                description:
                  description: Description libre ; null si absente.
                  anyOf:
                    - type: string
                      maxLength: 500
                    - type: 'null'
                group:
                  description: Rubrique d’affichage de l’option.
                  type: string
                  enum:
                    - COMFORT
                    - PROTECTION
                    - ACCESSORIES
                    - DELIVERY
                    - SERVICES
                    - OTHER
                maxQuantity:
                  description: >-
                    Exemplaires au plus par location, pour une option
                    `STANDARD`. Une option conducteur vaut toujours 1 ici et ne
                    le fixe pas (400 `not_applicable`) : le conducteur
                    additionnel se réserve jusqu’à 4 fois, borne lue dans
                    `choices.options[].maxBookableQuantity` du devis.
                  type: integer
                  minimum: 1
                  maximum: 100
                stockCount:
                  description: >-
                    Exemplaires louables en même temps, toutes locations
                    confondues ; ignoré pour une option conducteur. Le reste
                    disponible sur une période se lit dans `maxBookableQuantity`
                    du devis.
                  type: integer
                  minimum: 1
                  maximum: 1000
                availableMonths:
                  description: >-
                    Mois où l’option se vend (1 = janvier), chacun une fois :
                    elle est proposée si la location touche l’un d’eux ; [] :
                    toute l’année.
                  maxItems: 12
                  type: array
                  items:
                    type: integer
                    minimum: 1
                    maximum: 12
                youngDriverAgeThreshold:
                  description: >-
                    Âge au départ en dessous duquel le supplément s’applique à
                    un conducteur. Requis pour une option `YOUNG_DRIVER` (sinon
                    400 `required`) ; null pour les autres types, qui le
                    refusent (400 `not_applicable`).
                  anyOf:
                    - type: integer
                      minimum: 16
                      maximum: 99
                    - type: 'null'
                isActive:
                  description: 'false : option retirée de la vente.'
                  type: boolean
                displayOrder:
                  description: Rang d’affichage ; ordre de la liste.
                  type: integer
                  minimum: 0
                  maximum: 2147483647
                price:
                  description: Prix HT de l’option et son plafond.
                  type: object
                  properties:
                    unit:
                      description: >-
                        `DAY` : par jour facturé ; `HOUR` : par heure de
                        location ; `WEEK` : par semaine entamée ; `RENTAL` : une
                        fois par location.
                      type: string
                      enum:
                        - DAY
                        - HOUR
                        - WEEK
                        - RENTAL
                    amountHT:
                      description: Prix HT d’une unité de `unit`, pour un exemplaire.
                      type: number
                    maxAmountHT:
                      description: >-
                        Plafond HT par exemplaire sur toute la location ; null :
                        sans plafond. Interdit avec `RENTAL` (400
                        `not_applicable`), au moins égal à `amountHT` (400
                        `too_small`) ; pas de plafond s’envoie null, jamais 0.
                      anyOf:
                        - type: number
                        - type: 'null'
                  required:
                    - unit
                    - amountHT
                  additionalProperties: false
              required:
                - name
                - kind
                - group
                - price
              additionalProperties: false
      responses:
        '201':
          description: Créer une option
          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'
            Location:
              $ref: '#/components/headers/Location'
            Idempotent-Replayed:
              $ref: '#/components/headers/IdempotentReplayed'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Option'
                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'
        '409':
          description: '`ALREADY_EXISTS`, `IDEMPOTENCY_IN_FLIGHT`'
          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'
        '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`'
          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/IdempotencyKeyReusedProblem'
        '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
    Location:
      description: >-
        Chemin absolu de la ressource créée sur l’hôte de l’API, préfixe
        `/api/external/v1` compris.
      schema:
        type: string
    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:
    Option:
      examples:
        - id: 6a7b8c9d-0e1f-4a2b-9c3d-5e6f70819203
          currency: EUR
          name: Siège enfant
          description: Siège auto groupe 0+/1, de la naissance à 4 ans
          kind: STANDARD
          group: ACCESSORIES
          price:
            unit: DAY
            amountHT: 4
            maxAmountHT: 40
          maxQuantity: 2
          stockCount: 4
          availableMonths: []
          youngDriverAgeThreshold: null
          imageUrls: []
          isActive: true
          displayOrder: 2
          updatedAt: '2026-10-14T09:48:31+02:00'
      type: object
      properties:
        id:
          description: Identifiant de l’option.
          type: string
          format: uuid
        currency:
          description: >-
            Devise ISO 4217 : tous les montants de la ressource sont dans cette
            devise.
          examples:
            - EUR
          type: string
          enum:
            - EUR
            - XPF
            - CHF
            - CAD
            - GBP
            - USD
            - XOF
        name:
          description: Nom affiché au client.
          type: string
          minLength: 1
          maxLength: 100
        description:
          description: Description libre ; null si absente.
          anyOf:
            - type: string
              maxLength: 500
            - type: 'null'
        kind:
          description: >-
            `STANDARD` : option vendue à la quantité. `ADDITIONAL_DRIVER` :
            conducteur additionnel, réservable par une clé interne seulement.
            `YOUNG_DRIVER` : supplément jeune conducteur, appliqué par Lexio
            d’après l’âge des conducteurs, jamais demandé directement. Une seule
            option de chacun de ces deux derniers types par organisation.
          type: string
          enum:
            - STANDARD
            - ADDITIONAL_DRIVER
            - YOUNG_DRIVER
        group:
          description: Rubrique d’affichage de l’option.
          type: string
          enum:
            - COMFORT
            - PROTECTION
            - ACCESSORIES
            - DELIVERY
            - SERVICES
            - OTHER
        price:
          description: Prix HT de l’option et son plafond.
          type: object
          properties:
            unit:
              description: >-
                `DAY` : par jour facturé ; `HOUR` : par heure de location ;
                `WEEK` : par semaine entamée ; `RENTAL` : une fois par location.
              type: string
              enum:
                - DAY
                - HOUR
                - WEEK
                - RENTAL
            amountHT:
              description: Prix HT d’une unité de `unit`, pour un exemplaire.
              type: number
            maxAmountHT:
              description: >-
                Plafond HT par exemplaire sur toute la location ; null : sans
                plafond. Interdit avec `RENTAL` (400 `not_applicable`), au moins
                égal à `amountHT` (400 `too_small`) ; pas de plafond s’envoie
                null, jamais 0.
              anyOf:
                - description: >-
                    Montant en unités majeures, sur la grille de la devise de la
                    ressource.
                  type: number
                - type: 'null'
          required:
            - unit
            - amountHT
            - maxAmountHT
        maxQuantity:
          description: >-
            Exemplaires au plus par location, pour une option `STANDARD`. Une
            option conducteur vaut toujours 1 ici et ne le fixe pas (400
            `not_applicable`) : le conducteur additionnel se réserve jusqu’à 4
            fois, borne lue dans `choices.options[].maxBookableQuantity` du
            devis.
          type: integer
          minimum: 1
          maximum: 100
        stockCount:
          description: >-
            Exemplaires louables en même temps, toutes locations confondues ;
            ignoré pour une option conducteur. Le reste disponible sur une
            période se lit dans `maxBookableQuantity` du devis.
          type: integer
          minimum: 1
          maximum: 1000
        availableMonths:
          description: >-
            Mois où l’option se vend (1 = janvier), chacun une fois : elle est
            proposée si la location touche l’un d’eux ; [] : toute l’année.
          maxItems: 12
          type: array
          items:
            type: integer
            minimum: 1
            maximum: 12
        youngDriverAgeThreshold:
          description: >-
            Âge au départ en dessous duquel le supplément s’applique à un
            conducteur. Requis pour une option `YOUNG_DRIVER` (sinon 400
            `required`) ; null pour les autres types, qui le refusent (400
            `not_applicable`).
          anyOf:
            - type: integer
              minimum: 16
              maximum: 99
            - type: 'null'
        imageUrls:
          description: >-
            Image de l’option, URL signée valable une heure, à ne pas stocker ;
            [] sans image.
          maxItems: 1
          type: array
          items:
            type: string
            format: uri
        isActive:
          description: 'false : option retirée de la vente.'
          type: boolean
        displayOrder:
          description: Rang d’affichage ; ordre de la liste.
          type: integer
          minimum: 0
        updatedAt:
          examples:
            - '2026-11-10T10:00:00+01:00'
          description: Dernière modification.
          type: string
          format: date-time
      required:
        - id
        - currency
        - name
        - description
        - kind
        - group
        - price
        - maxQuantity
        - stockCount
        - availableMonths
        - youngDriverAgeThreshold
        - imageUrls
        - isActive
        - displayOrder
        - 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
    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
    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
    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.