Rivelys API
Book Rivelys private chauffeurs from your website, booking software or platform: the price is fixed and known before you book, and the Rivelys dispatch follows every ride to the end. The API is open free of charge to all verified partners.
Getting started
- Create a partner account on rivelys.com and have your file approved.
- In your account, API tab, create a test key (
rv_test_…): bookings are simulated and never sent to chauffeurs. - Once your integration works, create a live key (
rv_live_…): bookings become real rides.
API base URL: https://api.rivelys.com/v1. Send the key in the Authorization: Bearer rv_… header. Requests and responses are JSON (UTF-8), dates are ISO 8601. Keep the key on your server: never put it in a page your customers can see.
curl https://api.rivelys.com/v1 -H "Authorization: Bearer rv_test_••••••••"Rules
- Fixed price. Rivelys calculates the price of each ride: the average of the prices of available, compatible chauffeurs (each with their own rates), without the highest and the lowest; with too few chauffeurs, the reference grid of the vehicle type. Ask for it with
POST /v1/quotes, then book with this price inexpected_price: if it changed in the meantime, the booking is refused with the new price (codeprice_changed). Once booked, the ride keeps its price. - Minimum notice. Pick-up must be at least 48 hours after the request (current value returned in
min_notice_hours). - Payment, chosen by the partner:
agency_card(the card saved in your account, charged ride by ride),monthly_invoice(monthly invoice of completed rides, paid by SEPA direct debit or bank transfer; enabled by Rivelys for your account, with a limit) orclient_link(a link is sent to the passenger, who confirms and pays the chauffeur by card or in cash). - Confirmation. The first vetted, compatible chauffeur who takes the ride gets it. When the partner pays, the ride is then confirmed; with
client_link, the passenger confirms it on their link. - Never cancelled automatically. If no chauffeur takes the ride, it is not cancelled: the Rivelys dispatch is alerted and finds a solution.
- Cancellation by the partner. Free until the ride is confirmed (
POST /v1/bookings/{id}/cancel). After that, contact the Rivelys dispatch. - Rate limit. 60 requests per minute per IP address.
Get a price
POST /v1/quotes: same fields as a booking (passenger and payment are optional). Nothing is booked.
curl https://api.rivelys.com/v1/quotes \
-H "Authorization: Bearer rv_test_••••••••" \
-H "Content-Type: application/json" \
-d '{
"service": "transfer",
"pickup_at": "2026-12-20T14:30:00+01:00",
"pickup_address": "Aéroport Nice Côte d'Azur, Terminal 2",
"dropoff_address": "Hôtel de Paris, Monaco",
"passengers": 2,
"vehicle_type": "Business"
}'Response:
{
"price": 92,
"currency": "EUR",
"price_basis": "average",
"distance_km": 28,
"duration_min": 40,
"vehicle_type": "Business",
"min_notice_hours": 48
}
price_basis: average (average of available chauffeurs) or reference_grid (reference grid).
Book
POST /v1/bookings: creates the booking (201). With an external_ref you already sent, the existing booking is returned (200): you can safely retry after a network error.
curl https://api.rivelys.com/v1/bookings \
-H "Authorization: Bearer rv_test_••••••••" \
-H "Content-Type: application/json" \
-d '{
"external_ref": "AG-2026-00042",
"service": "transfer",
"pickup_at": "2026-12-20T14:30:00+01:00",
"pickup_address": "Aéroport Nice Côte d'Azur, Terminal 2",
"dropoff_address": "Hôtel de Paris, Monaco",
"flight_number": "AF7300",
"passengers": 2,
"luggage_hold": 2,
"vehicle_type": "Business",
"passenger": { "name": "John Smith", "phone": "+44 7700 900123", "language": "en" },
"notes": "Name sign at arrivals",
"payment": "agency_card",
"expected_price": 92
}'Response:
{
"id": "RV-4F2A9C",
"external_ref": "AG-2026-00042",
"environment": "live",
"status": "searching",
"service": "transfer",
"pickup_at": "2026-12-20T13:30:00.000Z",
"pickup_address": "Aéroport Nice Côte d'Azur, Terminal 2",
"dropoff_address": "Hôtel de Paris, Monaco",
"passengers": 2,
"vehicle_type": "Business",
"price": 92,
"currency": "EUR",
"payment": "agency_card",
"passenger": { "name": "John Smith", "phone": "+44 7700 900123", "language": "en" },
"client_link": "https://rivelys.com/suivi?t=…",
"chauffeur": null,
"created_at": "2026-12-01T09:12:44.000Z"
}Track a booking
GET /v1/bookings/{id} (for example RV-4F2A9C) returns the up-to-date booking. GET /v1/bookings returns the latest ones (status and limit parameters, 100 at most). Poll a booking every few minutes, no more than once a minute.
As soon as a chauffeur takes the ride, chauffeur gives their name and car; once the ride is confirmed, their phone number and plate:
"status": "confirmed",
"chauffeur": {
"name": "Karim B.",
"vehicle": "Mercedes-Benz Classe E",
"color": "Noir",
"phone": "+33 6 12 34 56 78",
"plate": "AB-123-CD"
}Cancel
POST /v1/bookings/{id}/cancel: free while the status is searching or awaiting_client. For a confirmed ride, the response is 409 (cannot_cancel): contact the Rivelys dispatch.
Booking fields
| Field | Type | Description |
|---|---|---|
service | string | transfer or hourly (chauffeur by the hour). Default: transfer. |
pickup_at | ISO 8601 date | Pick-up date and time, with time zone. |
pickup_address | string | Pick-up address (airport: give the terminal). |
dropoff_address | string | Drop-off address (required for transfer). |
stops | array of strings | Stops on the way (5 at most). |
hours | number | Duration in hours for hourly (1 to 24, by half hour). |
flight_number | string | Arrival flight number (e.g. AF7300): the chauffeur follows the landing. |
passengers | integer | Passengers (1 to 8). |
luggage_hold, luggage_cabin | integers | Hold and cabin luggage. |
baby_seats, booster_seats | integers | Baby seats and booster seats. |
pet | boolean | The passenger travels with a pet. |
vehicle_type | string | Optional: Business, Prestige or Van. Without a type, the ride is offered to all compatible chauffeurs. |
passenger | object | name, phone (international format), language (fr, en, it, es, de, pt, ru, ar, zh; default fr): messages to the passenger are sent in their language. |
notes | string | Note for the chauffeur (1,000 characters at most). |
payment | string | agency_card, monthly_invoice or client_link. |
client_payment | string | With client_link: card or cash. |
commission_percent | number | Optional: your commission on the ride (default: the one set in your account), shown to the chauffeur before they take it. |
expected_price | number | The price you showed: if the price changed, the booking is refused with the new price. |
external_ref | string | Your own reference (80 characters at most): prevents duplicates. |
Statuses
| Status | Meaning |
|---|---|
searching | Published: Rivelys is looking for a chauffeur. |
awaiting_client | A chauffeur took it; the passenger must confirm on their link. |
confirmed | Confirmed. |
en_route | The chauffeur is on the way. |
on_site | The chauffeur is at the pick-up point. |
on_board | Passenger on board. |
completed | Completed. |
no_show_review | No-show reported by the chauffeur: being checked by the dispatch. |
cancelled | Cancelled. |
Errors
An error returns an HTTP status and an error object, with a message in English and in French:
{
"error": {
"code": "price_changed",
"message": "The price is now 95 EUR. Check it and send the booking again with this expected_price.",
"message_fr": "Le prix vient d’être recalculé : 95 €.",
"price": 95,
"currency": "EUR"
}
}| HTTP | Code | When |
|---|---|---|
| 401 | missing_key, invalid_key, revoked_key | Missing, unknown or revoked key. |
| 403 | account_not_active | Account not approved or blocked. |
| 403 | live_not_open | Live bookings not open yet: use a test key. |
| 403 | monthly_invoice_not_enabled | Monthly invoicing not enabled for your account. |
| 402 | card_required | No card saved to pay with agency_card. |
| 402 | credit_limit | Monthly invoicing limit reached. |
| 404 | not_found, unknown_endpoint | Unknown booking or endpoint. |
| 409 | price_changed | The price changed: new price in the response. |
| 409 | cannot_cancel | Confirmed ride: cancel it with the dispatch. |
| 422 | invalid_fields | Missing or invalid fields (listed in fields). |
| 422 | too_soon | Pick-up too soon (minimum notice). |
| 422 | route_not_found | Route cannot be calculated: check the addresses. |
| 429 | — | Too many requests: retry in a minute. |
| 503 | api_closed | API temporarily closed. |
Test keys
With an rv_test_… key, everything is checked as in live (fields, notice, real price), but nothing is sent to chauffeurs or charged. Bookings get a TEST-… reference and change status by themselves: searching for 1 minute, then a test chauffeur takes them (confirmed when the partner pays; awaiting_client then confirmed one minute later with client_link).
Help
A question about the API: contact@rivelys.com. For a ride in progress, contact the Rivelys dispatch from your account (“Contact the dispatch” button).