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
Always call
/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
POST
/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. |
Use the Google Places API to resolve a searched address into the full Address object structure. The
premiseName field should hold place.formatted_address, and latitude/longitude come from place.geometry.location.
Request — airport pickup with flight number
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
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
Store
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.