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

# Démarrage rapide

De la vérification de la clé à l’annulation en six appels, avec `curl` et `jq`. Les réponses sont des extraits.

## Avant de commencer

* **Une clé API** (`lck_…`) du loueur, avec les scopes `offers.read`, `quotes.write` et `rentals.write` ([Authentification et scopes](https://docs.lexio.rent/authentification.md)).
* **Une organisation de test** : sans bac à sable, l’étape 4 crée une vraie location et prévient le loueur. Demandez-en une à [contact@lexio.rent](mailto:contact@lexio.rent), ou essayez avec un loueur averti.
* **Un véhicule actif**, dans une catégorie tarifaire qui a des prix.

```bash theme={null}
export LEXIO_KEY="lck_xxxxxxxxxxxxxxxxxxxxxxxx"
export LEXIO_API="https://api.lexio.rent/api/external/v1"
# Dans 30 jours, pour 5 jours (GNU date, sinon BSD/macOS).
export START=$(date -d '+30 days' +%F 2>/dev/null || date -v+30d +%F)
export END=$(date -d '+35 days' +%F 2>/dev/null || date -v+35d +%F)
```

## 1. Vérifier la clé (sans effet)

```bash theme={null}
curl -s "$LEXIO_API/organization" -H "Authorization: Bearer $LEXIO_KEY"
```

```json theme={null}
{
  "data": {
    "name": "Location Exemple",
    "currency": "EUR",
    "currencyExponent": 2,
    "timezone": "Europe/Paris",
    "vatPercent": 20,
    "businessHours": {
      "isOpen24h": false,
      "days": [{ "day": "MONDAY", "isOpen": true, "openingTime": "08:00", "closingTime": "19:00" }, "…"]
    },
    "bookingRules": { "minLeadHours": 24, "maxHorizonDays": 365, "minRentalDays": 1 },
    "apiKey": {
      "name": "Azur Voyages",
      "partnerCode": "azur-voyages",
      "scopes": ["offers.read", "quotes.write", "rentals.read", "rentals.write"],
      "expiresAt": "2027-10-27T10:00:00+01:00"
    }
  }
}
```

Clé partenaire (`partnerCode` non nul) : départ et retour tombent un jour ouvert, dans `businessHours`, et respectent `bookingRules`, sinon `422 BOOKING_RULE_VIOLATION` (`rule` nomme la règle). Ajustez `$START`, `$END` ou l’heure ci-dessous.

## 2. Chercher un véhicule (sans effet)

```bash theme={null}
curl -s "$LEXIO_API/availability?startAt=${START}T10:00&endAt=${END}T10:00&isAvailable=true&limit=5" \
  -H "Authorization: Bearer $LEXIO_KEY"
```

```json theme={null}
{
  "data": [
    {
      "vehicle": { "id": "3b1f5c2a-8d4e-4f6a-9b7c-2e5d8a1f4c63", "name": "208 Allure", "category": { "name": "Citadine" } },
      "currency": "EUR",
      "period": { "startAt": "2026-11-28T10:00:00+01:00", "endAt": "2026-12-03T10:00:00+01:00", "billedDays": 5 },
      "isAvailable": true,
      "totalHT": 237,
      "vatAmount": 47.4,
      "totalTTC": 284.4
    }
  ],
  "nextCursor": null
}
```

```bash theme={null}
export VEHICLE=$(curl -s "$LEXIO_API/availability?startAt=${START}T10:00&endAt=${END}T10:00&isAvailable=true&limit=1" \
  -H "Authorization: Bearer $LEXIO_KEY" | jq -r '.data[0].vehicle.id')
```

Dates en heure locale de l’agence, sans décalage. Prix et disponibilité ne sont pas garantis.

## 3. Obtenir un devis (ne réserve rien)

```bash theme={null}
export QUOTE=$(curl -s -X POST "$LEXIO_API/quotes" \
  -H "Authorization: Bearer $LEXIO_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "vehicleId": "'"$VEHICLE"'", "startAt": "'"$START"'T10:00", "endAt": "'"$END"'T10:00" }' \
  | jq -r '.data.id')
```

```json theme={null}
{
  "data": {
    "id": "0b8e2a6c-4d1f-4e3a-9b7c-1c2d3e4f5a6b",
    "expiresAt": "2026-10-30T09:12:44+01:00",
    "currency": "EUR",
    "totalHT": 237,
    "vatAmount": 47.4,
    "totalTTC": 284.4,
    "lines": [{ "key": "BASE", "label": "Tarif de base", "amountHT": 210, "amountTTC": 252 }, "…"]
  }
}
```

## 4. Créer la location (écrit, prévient le loueur)

`Idempotency-Key` est obligatoire : une valeur unique par opération (un UUID de `uuidgen`, par exemple). `partnerReference`, votre numéro de commande, est unique : changez-le à chaque essai. Avec une clé interne, le client reçoit l’email de confirmation si le loueur l’a activé : mettez une adresse à vous.

```bash theme={null}
export RENTAL=$(curl -s -X POST "$LEXIO_API/rentals" \
  -H "Authorization: Bearer $LEXIO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 5f0c2b9e-8d4a-4a7e-9b1c-3e2f1a0d9c8b" \
  -d '{
    "quoteId": "'"$QUOTE"'",
    "partnerReference": "essai-'"$(date +%s)"'",
    "customer": { "firstName": "Marie", "lastName": "Martin", "email": "marie.martin@example.com", "phone": "+33612345678" }
  }' | jq -r '.data.id')
```

Réponse `201`, avec l’en-tête `Location` :

```json theme={null}
{
  "data": {
    "id": "9c2d7e4a-5b1f-4d3c-8a6e-0f1b2c3d4e5f",
    "number": "LOC-2026.10-0042",
    "status": "RESERVED",
    "partnerReference": "essai-1793260800",
    "customer": { "id": "7c4e2b9a-1f3d-4a6e-8b5c-9d0e1f2a3b4c", "email": "marie.martin@example.com" },
    "deposit": { "name": "Caution citadine", "depositAmount": 800 },
    "totalTTC": 284.4,
    "balance": { "totalTTC": 284.4, "paidAmount": 0, "dueAmount": 284.4, "overpaidAmount": 0 }
  },
  "effects": { "customerResolution": "CREATED" }
}
```

`balance.dueAmount` est le reste à payer ; la caution (`deposit`) est à part, hors total ([Montants et TVA](https://docs.lexio.rent/montants-et-tva.md)).

## 5. Prévisualiser l’annulation (sans effet)

```bash theme={null}
curl -s -X POST "$LEXIO_API/rentals/$RENTAL/cancel?dryRun=true" \
  -H "Authorization: Bearer $LEXIO_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "reason": "Essai du démarrage rapide" }'
```

`?dryRun=true` rend la réponse de l’appel réel sans rien enregistrer ni exiger d’`Idempotency-Key`. Il existe sur les actions d’une location (annulation, report, changements, départ, retour, options).

## 6. Annuler

```bash theme={null}
curl -s -X POST "$LEXIO_API/rentals/$RENTAL/cancel" \
  -H "Authorization: Bearer $LEXIO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 2a7d4c1e-6b3f-4e8a-9d5c-0f1e2d3c4b5a" \
  -d '{ "reason": "Essai du démarrage rapide" }'
```

```json theme={null}
{
  "data": { "id": "9c2d7e4a-5b1f-4d3c-8a6e-0f1b2c3d4e5f", "status": "CANCELLED", "balance": { "totalTTC": 0, "dueAmount": 0 } },
  "effects": {
    "cancellation": {
      "alreadyCancelled": false,
      "reason": "Essai du démarrage rapide",
      "paidAmount": 0,
      "refundDueAmount": 0,
      "depositsHeld": { "collectedAmount": 0, "preAuthorizedAmount": 0 },
      "creditNotes": [],
      "uncreditedInvoices": []
    },
    "paymentAuthorizationRelease": "NONE"
  }
}
```

La location annulée et la fiche client créée restent visibles chez le loueur.

## À retenir

* Le devis garantit le prix 24 h (`expiresAt`), pour un seul usage, mais ne bloque pas le véhicule : à la création, la disponibilité est revérifiée (`409 VEHICLE_UNAVAILABLE`) et un prix qui s’écarte du devis donne `409 PRICE_CHANGED`, sans écriture.
* L’étape 4 renvoyée avec la même `Idempotency-Key` et le même corps rend la réponse d’origine ([Idempotence et reprise](https://docs.lexio.rent/idempotence.md)).
* Suivre les changements faits ensuite par le loueur : [Synchronisation par événements](https://docs.lexio.rent/synchronisation.md).


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