Create a booking
Once you have a price quote and the passenger has confirmed, use this endpoint to submit the booking.
The response includes the booking reference (tagName) you use for all subsequent operations.
The booking flow
/api/v1/pricing/quotes first to get the fare. Pass the quoted accountFare back in quotedFare when creating the booking — this confirms the price shown to the customer.1. GET /api/v1/pricing/service-types → choose vehicle type
2. POST /api/v1/pricing/quotes → get live fare estimate
3. Customer reviews and confirms price
4. POST /api/v1/bookings → create booking → receive tagName
5. GET /api/v1/bookings/{tagName} → confirm booking details
Create a booking
/api/v1/bookings
Required fields
| Parameter | Type | Description |
|---|---|---|
| serviceTypeId | string (UUID) | Vehicle category. Obtain from List service types. |
| pickupDateTimeUtc | string (ISO 8601) | Requested pickup time in UTC. Example: 2026-05-01T14:00:00Z. Must be in the future. |
| pickupAddress | Address object | Full pickup address. See Address object below. |
| dropoffAddress | Address object | Full drop-off address. |
| passengerName | string | Lead passenger's full name. |
| passengerEmail | string (email) | Passenger email address for confirmation and driver contact. |
| passengerPhone | string | Passenger phone number in international format, e.g. +447911123456. |
| quotedFare | number (decimal) | The fare amount from the pricing endpoint. Locks the price shown to the customer. |
| currency | string (ISO 4217) | Currency code, e.g. GBP, EUR, USD. |
Optional fields
| Parameter | Type | Description |
|---|---|---|
| passengers | integer | Number of passengers. Default: 1. |
| luggage | integer | Pieces of luggage. Default: 0. |
| flightNumber | string | For airport pickups. Enables automatic flight monitoring — if the flight is delayed, the dispatch system adjusts the pickup time. |
| notes | string | Special instructions visible to the driver (e.g. "Meet in arrivals hall, Terminal 5"). |
| viaAddresses | array of Address | Intermediate stops, in order of visit. Each is an Address object. |
| returnJourney | boolean | Set to true if this booking includes a return leg. |
| returnDateTimeUtc | string (ISO 8601) | Return pickup time in UTC. Required when returnJourney is true. |
| accountId | string (UUID) | Customer account ID for billing and account-rate pricing. |
| externalReference | string | Your own booking reference. Stored and returned in GET responses. Max 100 characters. |
Address object
Both pickupAddress and dropoffAddress (and each entry in viaAddresses) use this structure:
| Field | Type | Description |
|---|---|---|
| premiseName | string | Full formatted address string from Google Places (e.g. "Heathrow Airport Terminal 5, Longford, Hounslow TW6 2GA, UK"). |
| addressLine1 | string | Street number and street name (e.g. "15 Baker Street"). |
| addressLine2 | string | Sub-locality or neighbourhood. May be empty. |
| town | string | Town or city. |
| county | string | County, state, or region. |
| postCode | string | Postal or ZIP code. |
| country | string | Country display name (e.g. "United Kingdom"). |
| countryCode | string (ISO 3166-1 alpha-2) | Two-letter country code (e.g. "GB", "US"). |
| latitude | number | Decimal degrees latitude. |
| longitude | number | Decimal degrees longitude. |
premiseName field should hold place.formatted_address, and latitude/longitude come from place.geometry.location.curl -X POST https://api.moovlogic.com/api/v1/bookings \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"serviceTypeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"pickupDateTimeUtc": "2026-05-01T14:00:00Z",
"pickupAddress": {
"premiseName": "Heathrow Airport Terminal 5, Longford, Hounslow TW6 2GA, UK",
"addressLine1": "Heathrow Airport Terminal 5",
"town": "Hounslow",
"postCode": "TW6 2GA",
"country": "United Kingdom",
"countryCode": "GB",
"latitude": 51.4775,
"longitude": -0.4614
},
"dropoffAddress": {
"premiseName": "10 Downing Street, Westminster, London SW1A 2AA, UK",
"addressLine1": "10 Downing Street",
"town": "London",
"postCode": "SW1A 2AA",
"country": "United Kingdom",
"countryCode": "GB",
"latitude": 51.5034,
"longitude": -0.1276
},
"passengerName": "Jane Smith",
"passengerEmail": "jane@example.com",
"passengerPhone": "+447911123456",
"quotedFare": 85.00,
"currency": "GBP",
"passengers": 1,
"flightNumber": "BA286",
"notes": "Meet in arrivals, holding name sign",
"externalReference": "HOTEL-2026-04821"
}'
import requests
booking = {
'serviceTypeId': '3fa85f64-5717-4562-b3fc-2c963f66afa6',
'pickupDateTimeUtc': '2026-05-01T14:00:00Z',
'pickupAddress': {
'premiseName': 'Heathrow Airport Terminal 5, Longford, Hounslow TW6 2GA, UK',
'addressLine1': 'Heathrow Airport Terminal 5',
'town': 'Hounslow',
'postCode': 'TW6 2GA',
'country': 'United Kingdom',
'countryCode': 'GB',
'latitude': 51.4775,
'longitude': -0.4614
},
'dropoffAddress': {
'premiseName': '10 Downing Street, Westminster, London SW1A 2AA, UK',
'addressLine1': '10 Downing Street',
'town': 'London',
'postCode': 'SW1A 2AA',
'country': 'United Kingdom',
'countryCode': 'GB',
'latitude': 51.5034,
'longitude': -0.1276
},
'passengerName': 'Jane Smith',
'passengerEmail': 'jane@example.com',
'passengerPhone': '+447911123456',
'quotedFare': 85.00,
'currency': 'GBP',
'passengers': 1,
'flightNumber': 'BA286',
'externalReference': 'HOTEL-2026-04821'
}
response = requests.post(
'https://api.moovlogic.com/api/v1/bookings',
json=booking,
headers={'Authorization': f'Bearer {token}'}
)
tag_name = response.json()['tagName']
print(f"Booking created: {tag_name}")
<?php
$booking = [
'serviceTypeId' => '3fa85f64-5717-4562-b3fc-2c963f66afa6',
'pickupDateTimeUtc' => '2026-05-01T14:00:00Z',
'pickupAddress' => [
'premiseName' => 'Heathrow Airport Terminal 5, Longford, Hounslow TW6 2GA, UK',
'addressLine1' => 'Heathrow Airport Terminal 5',
'town' => 'Hounslow',
'postCode' => 'TW6 2GA',
'country' => 'United Kingdom',
'countryCode' => 'GB',
'latitude' => 51.4775,
'longitude' => -0.4614
],
'dropoffAddress' => [
'premiseName' => '10 Downing Street, Westminster, London SW1A 2AA, UK',
'addressLine1' => '10 Downing Street',
'town' => 'London',
'postCode' => 'SW1A 2AA',
'country' => 'United Kingdom',
'countryCode' => 'GB',
'latitude' => 51.5034,
'longitude' => -0.1276
],
'passengerName' => 'Jane Smith',
'passengerEmail' => 'jane@example.com',
'passengerPhone' => '+447911123456',
'quotedFare' => 85.00,
'currency' => 'GBP',
'passengers' => 1,
'flightNumber' => 'BA286',
'externalReference' => 'HOTEL-2026-04821'
];
$ch = curl_init('https://api.moovlogic.com/api/v1/bookings');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $token",
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode($booking)
]);
$data = json_decode(curl_exec($ch), true);
$tagName = $data['tagName'];
curl_close($ch);
const response = await fetch('https://api.moovlogic.com/api/v1/bookings', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
serviceTypeId: '3fa85f64-5717-4562-b3fc-2c963f66afa6',
pickupDateTimeUtc: '2026-05-01T14:00:00Z',
pickupAddress: {
premiseName: 'Heathrow Airport Terminal 5, Longford, Hounslow TW6 2GA, UK',
addressLine1: 'Heathrow Airport Terminal 5',
town: 'Hounslow',
postCode: 'TW6 2GA',
country: 'United Kingdom',
countryCode: 'GB',
latitude: 51.4775,
longitude: -0.4614
},
dropoffAddress: {
premiseName: '10 Downing Street, Westminster, London SW1A 2AA, UK',
addressLine1: '10 Downing Street',
town: 'London',
postCode: 'SW1A 2AA',
country: 'United Kingdom',
countryCode: 'GB',
latitude: 51.5034,
longitude: -0.1276
},
passengerName: 'Jane Smith',
passengerEmail: 'jane@example.com',
passengerPhone: '+447911123456',
quotedFare: 85.00,
currency: 'GBP',
passengers: 1,
flightNumber: 'BA286',
externalReference: 'HOTEL-2026-04821'
})
});
if (!response.ok) throw new Error(`Booking failed: ${response.status}`);
const { tagName } = await response.json();
console.log(`Booking created: ${tagName}`);
Response — 201 Created
{
"tagName": "MV-20260501-4821",
"bookingId": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"status": "Pending",
"quotedFare": 85.00,
"currency": "GBP",
"pickupDateTimeUtc": "2026-05-01T14:00:00Z",
"externalReference": "HOTEL-2026-04821",
"createdAt": "2026-04-19T10:23:00Z"
}
The booking reference (tagName)
The tagName is your booking reference — store it immediately. Use it for all subsequent operations:
GET /api/v1/bookings/{tagName}— retrieve booking detailsPUT /api/v1/bookings/{tagName}— update bookingDELETE /api/v1/bookings/{tagName}— cancel bookingPOST /api/v1/bookings/{tagName}/status— update ride status
tagName immediately after creating a booking. If you lose it, retrieve it via GET /api/v1/bookings filtered by externalReference — which is why providing your own externalReference is strongly recommended.Airport bookings
If the pickup location is an airport, always include flightNumber.
This enables automatic flight monitoring — if the flight is delayed, the dispatch system
adjusts the pickup time automatically and notifies the assigned driver.