https://www.localrydes.com/api/v2/external
| Environment | Base URL | Status |
|---|---|---|
| DEV / STAGING | https://www.dev.localrydes.com/api/v2/external |
Testing |
| PRODUCTION Current | https://www.localrydes.com/api/v2/external |
Live |
To access LocalRydes B2B API, you need to register for an agency account. Agencies can create their own account directly through our website. Follow these steps to get started:
Visit the registration page and select "Travel Agent" as your account type.
Registration URL: https://localrydes.com/user/registration?user_role=agent
Fill in the registration form with your personal details and company information.
Our team will review and verify your agency account. This typically takes 1-2 business days.
Once approved, log in to your agency portal and generate your API keys to start integrating.
You can register your agency account instantly at https://localrydes.com/user/registration?user_role=agent. Simply choose "Travel Agent" during account creation, complete the form with your details, and our team will review your application within 1-2 business days.
To complete your agency registration, please prepare the following information:
Earn attractive commissions on every booking processed through the API
Complete access to all booking and management endpoints
Priority technical support and account management
Access to premium vehicles worldwide
Comprehensive reporting and booking analytics
Secure payment processing and settlement system
Our partnership team is here to assist you throughout the registration process.
Email: api-support@localrydes.com
Phone: +43 1 3463301
Business Hours: Monday - Friday, 9:00 AM - 6:00 PM (CET)
Once your agency account is activated, you can generate and manage API keys from your agency portal.
Production Portal: https://www.localrydes.com/login
Staging Portal: https://www.dev.localrydes.com/login
Follow these steps to generate a new API key from your agency portal:
| Component | Example | Description |
|---|---|---|
| Prefix | lr_live_ |
Indicates a production API key |
| Key ID | CMTtuurVl78jbccLs6c4Bmn69xeO... |
Unique identifier (48 characters) |
| Full Format | lr_live_[48_characters] |
Total length: 56 characters |
lr_live_...
lr_test_...
Track your API usage and performance from your agency portal dashboard:
X-RateLimit-Remaining response header to track your usage in real-time and avoid hitting rate limits.
For security reasons, only one API key can be active at any time per agency account. When you generate a new key, all previous keys are automatically deactivated with zero grace period.
Note: Plan your key rotation during low-traffic periods to minimize potential disruption.
| Issue | Possible Cause | Solution |
|---|---|---|
401 Unauthorized |
Invalid or missing API key | Verify the key is correct and included in x-api-key header |
403 Forbidden |
API key has been deactivated | Generate a new key from your portal |
429 Too Many Requests |
Rate limit exceeded | Implement rate limiting in your code or contact us for higher limits |
| Key not working after generation | Incorrect key format or extra characters | Ensure no extra spaces, quotes, or line breaks in the key |
Include your API key in the request header for all API calls using the x-api-key header:
curl -X GET "https://www.localrydes.com/api/v2/external/auth/validate-key" \
-H "x-api-key: lr_live_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json"
$headers = [
'x-api-key: lr_live_YOUR_API_KEY_HERE',
'Content-Type: application/json'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.localrydes.com/api/v2/external/auth/validate-key');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
const response = await fetch('https://www.localrydes.com/api/v2/external/auth/validate-key', {
method: 'GET',
headers: {
'x-api-key': 'lr_live_YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
import requests
headers = {
'x-api-key': 'lr_live_YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
}
response = requests.get('https://www.localrydes.com/api/v2/external/auth/validate-key', headers=headers)
data = response.json()
print(data)
When your API key is valid, you'll receive a successful response like this:
{
"status": "success",
"statusCode": 200,
"message": "API key validated successfully",
"data": {
"agency_id": 38,
"company_name": "Your Agency Name",
"status": "active",
"api_key_name": "Your API Key Name",
"commission_rate": 15,
"rate_limit": {
"per_minute": 60,
"per_day": 10000,
"remaining_today": 10000
},
"key_info": {
"created_at": "2026-02-05T06:33:01+00:00",
"last_used_at": "2026-02-10T05:08:32+00:00",
"is_active": true
}
}
}
| Environment | Base URL | Portal URL | Usage |
|---|---|---|---|
| DEV | https://www.dev.localrydes.com/api/v2/external |
https://www.dev.localrydes.com/login |
Testing and staging environment |
| PRODUCTION | https://www.localrydes.com/api/v2/external |
https://www.localrydes.com/login |
Live production environment |
Header Name: x-api-key
Format: lr_live_XXXXXXXXXXXXXXXX
x-api-key: lr_live_YOUR_API_KEY_HERE
Content-Type: application/json
Endpoint: /auth/validate-key
Validates your API key and returns agency information, commission rates, and usage statistics.
curl --location 'https://www.localrydes.com/api/v2/external/auth/validate-key' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE'
{
"status": "success",
"statusCode": 200,
"message": "API key validated successfully",
"data": {
"agency_id": 123,
"company_name": "Your Agency Name",
"status": "active",
"api_key_name": "Your API Key Name",
"commission_rate": 15.00,
"rate_limit": {
"per_minute": 60,
"per_day": 10000,
"remaining_today": 10000
},
"key_info": {
"created_at": "2026-02-05T06:33:01+00:00",
"last_used_at": "2026-02-10T05:08:32+00:00",
"is_active": true
}
}
}
Endpoint: /search-available-vehicles
Search for available vehicles based on trip details including pickup/dropoff locations, date, time, and passenger count. Supports both transfer and hourly bookings with optional waypoints.
| Parameter | Type | Required | Description |
|---|---|---|---|
trip_booking_type |
string | Required | transfer or hourly |
pickup_date |
string | Required | Format: YYYY/MM/DD (e.g., 2026/02/09) |
pickup_time |
string | Required | Format: HH:MM 24-hour (e.g., 10:00) |
passengers |
string|int | Required | Number of passengers (1-50) |
bags |
string|int | Required | Number of bags (0-50) |
pick_up_location |
object | Required | Pickup location details (see Location Object below) |
drop_off_location |
object | Optional | Required for transfer bookings |
booking_hour |
string|int | Optional | Required for hourly bookings (2-24 hours) |
itineraries |
array | Optional | Waypoints/stops between pickup and dropoff |
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Required | Google Place ID |
google_place_id |
string | Required | Google Place ID (same as id) |
name |
string | Required | Location name |
lat |
string | Required | Latitude |
lng |
string | Required | Longitude |
address |
string | Required | Full address |
isFavorite |
string | Optional | "0" or "1" |
type |
string | Optional | Location type identifier |
note |
string|null | Optional | Additional notes |
types |
array | Optional | Google place types (e.g., ["airport", "establishment"]) |
curl --location 'https://www.localrydes.com/api/v2/external/search-available-vehicles' \
--header 'Content-Type: application/json' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE' \
--data '{
"trip_booking_type": "transfer",
"pickup_date": "2026/02/09",
"pickup_time": "14:30",
"passengers": "2",
"bags": "1",
"pick_up_location": {
"id": "ChIJvY9HupHGVTcR7BXrcRP3s9E",
"google_place_id": "ChIJvY9HupHGVTcR7BXrcRP3s9E",
"name": "Hazrat Shahjalal International Airport",
"lat": "23.8434344",
"lng": "90.4029252",
"address": "Airport - Dakshinkhan Rd, Dhaka 1229, Bangladesh",
"isFavorite": "0",
"type": "1",
"note": null,
"types": ["airport", "establishment", "point_of_interest"]
},
"itineraries": [
{
"id": "ChIJ2RX3J2FW_jkRdqT0utNmIgQ",
"google_place_id": "ChIJ2RX3J2FW_jkRdqT0utNmIgQ",
"name": "Magura Bus Terminal",
"lat": "23.4973995",
"lng": "89.4322942",
"address": "Magura, Bangladesh",
"isFavorite": "0",
"type": "2",
"note": null,
"types": ["establishment", "point_of_interest"]
},
{
"id": "ChIJ0xHt6_-W_jkRVrZAv-werWY",
"google_place_id": "ChIJ0xHt6_-W_jkRVrZAv-werWY",
"name": "Kushtia Polytechnic Institute",
"lat": "23.9015918",
"lng": "89.1340649",
"address": "Mir Mosharaf Hossain Rd, Kushtia, Bangladesh",
"isFavorite": "0",
"type": "2",
"note": null,
"types": ["establishment", "point_of_interest"]
}
],
"drop_off_location": {
"id": "ChIJKZ-5WkUX_zkR29gWNCGKmZI",
"google_place_id": "ChIJKZ-5WkUX_zkR29gWNCGKmZI",
"name": "Jessore Airport",
"lat": "23.1771288",
"lng": "89.16071740000001",
"address": "Airport Bypass Rd, Jessore 7400, Bangladesh",
"isFavorite": "0",
"type": "3",
"note": null,
"types": ["airport", "establishment", "point_of_interest"]
}
}'
curl --location 'https://www.localrydes.com/api/v2/external/search-available-vehicles' \
--header 'Content-Type: application/json' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE' \
--data '{
"trip_booking_type": "hourly",
"pickup_date": "2026/02/09",
"pickup_time": "10:00",
"booking_hour": "6",
"passengers": "2",
"bags": "1",
"pick_up_location": {
"id": "ChIJz4dBR-a4VTcRIpVlVTd407M",
"google_place_id": "ChIJz4dBR-a4VTcRIpVlVTd407M",
"name": "Dhaka Medical College Hospital",
"lat": "23.72564",
"lng": "90.3973998",
"address": "Secretariat Rd, Dhaka 1000, Bangladesh",
"isFavorite": "0",
"type": "1",
"note": null,
"types": ["establishment", "health", "hospital", "point_of_interest"]
},
"itineraries": [
{
"id": "ChIJ2RX3J2FW_jkRdqT0utNmIgQ",
"google_place_id": "ChIJ2RX3J2FW_jkRdqT0utNmIgQ",
"name": "Magura Bus Terminal",
"lat": "23.4973995",
"lng": "89.4322942",
"address": "Magura, Bangladesh",
"isFavorite": "0",
"type": "2",
"note": null,
"types": ["establishment", "point_of_interest"]
},
{
"id": "ChIJ0xHt6_-W_jkRVrZAv-werWY",
"google_place_id": "ChIJ0xHt6_-W_jkRVrZAv-werWY",
"name": "Kushtia Polytechnic Institute",
"lat": "23.9015918",
"lng": "89.1340649",
"address": "Mir Mosharaf Hossain Rd, Kushtia, Bangladesh",
"isFavorite": "0",
"type": "2",
"note": null,
"types": ["establishment", "point_of_interest"]
}
],
"drop_off_location": {
"id": "ChIJKZ-5WkUX_zkR29gWNCGKmZI",
"google_place_id": "ChIJKZ-5WkUX_zkR29gWNCGKmZI",
"name": "Jessore Airport",
"lat": "23.1771288",
"lng": "89.16071740000001",
"address": "Airport Bypass Rd, Jessore 7400, Bangladesh",
"isFavorite": "0",
"type": "3",
"note": null,
"types": ["airport", "establishment", "point_of_interest"]
}
}'
<?php
$apiKey = 'lr_live_YOUR_API_KEY_HERE';
$baseUrl = 'https://www.localrydes.com/api/v2/external';
$data = [
'trip_booking_type' => 'transfer',
'pickup_date' => '2026/02/09',
'pickup_time' => '14:30',
'passengers' => '2',
'bags' => '1',
'pick_up_location' => [
'id' => 'ChIJvY9HupHGVTcR7BXrcRP3s9E',
'google_place_id' => 'ChIJvY9HupHGVTcR7BXrcRP3s9E',
'name' => 'Hazrat Shahjalal International Airport',
'lat' => '23.8434344',
'lng' => '90.4029252',
'address' => 'Airport - Dakshinkhan Rd, Dhaka 1229, Bangladesh',
'isFavorite' => '0',
'type' => '1',
'note' => null,
'types' => ['airport', 'establishment', 'point_of_interest']
],
'itineraries' => [
[
'id' => 'ChIJ2RX3J2FW_jkRdqT0utNmIgQ',
'google_place_id' => 'ChIJ2RX3J2FW_jkRdqT0utNmIgQ',
'name' => 'Magura Bus Terminal',
'lat' => '23.4973995',
'lng' => '89.4322942',
'address' => 'Magura, Bangladesh',
'isFavorite' => '0',
'type' => '2',
'note' => null,
'types' => ['establishment', 'point_of_interest']
],
[
'id' => 'ChIJ0xHt6_-W_jkRVrZAv-werWY',
'google_place_id' => 'ChIJ0xHt6_-W_jkRVrZAv-werWY',
'name' => 'Kushtia Polytechnic Institute',
'lat' => '23.9015918',
'lng' => '89.1340649',
'address' => 'Mir Mosharaf Hossain Rd, Kushtia, Bangladesh',
'isFavorite' => '0',
'type' => '2',
'note' => null,
'types' => ['establishment', 'point_of_interest']
]
],
'drop_off_location' => [
'id' => 'ChIJKZ-5WkUX_zkR29gWNCGKmZI',
'google_place_id' => 'ChIJKZ-5WkUX_zkR29gWNCGKmZI',
'name' => 'Jessore Airport',
'lat' => '23.1771288',
'lng' => '89.16071740000001',
'address' => 'Airport Bypass Rd, Jessore 7400, Bangladesh',
'isFavorite' => '0',
'type' => '3',
'note' => null,
'types' => ['airport', 'establishment', 'point_of_interest']
]
];
$ch = curl_init($baseUrl . '/search-available-vehicles');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'x-api-key: ' . $apiKey
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
curl_close($ch);
if ($result['success']) {
echo "Booking ID: " . $result['data']['bookingId'] . "\n";
echo "Available Vehicles: " . count($result['data']['availableVehicles']) . "\n";
}
?>
const API_KEY = 'lr_live_YOUR_API_KEY_HERE';
const BASE_URL = 'https://www.localrydes.com/api/v2/external';
async function searchVehicles() {
const data = {
trip_booking_type: 'hourly',
pickup_date: '2026/02/09',
pickup_time: '10:00',
booking_hour: '6',
passengers: '2',
bags: '1',
pick_up_location: {
id: 'ChIJz4dBR-a4VTcRIpVlVTd407M',
google_place_id: 'ChIJz4dBR-a4VTcRIpVlVTd407M',
name: 'Dhaka Medical College Hospital',
lat: '23.72564',
lng: '90.3973998',
address: 'Secretariat Rd, Dhaka 1000, Bangladesh',
isFavorite: '0',
type: '1',
note: null,
types: ['establishment', 'health', 'hospital', 'point_of_interest']
},
itineraries: [
{
id: 'ChIJ2RX3J2FW_jkRdqT0utNmIgQ',
google_place_id: 'ChIJ2RX3J2FW_jkRdqT0utNmIgQ',
name: 'Magura Bus Terminal',
lat: '23.4973995',
lng: '89.4322942',
address: 'Magura, Bangladesh',
isFavorite: '0',
type: '2',
note: null,
types: ['establishment', 'point_of_interest']
}
],
drop_off_location: {
id: 'ChIJKZ-5WkUX_zkR29gWNCGKmZI',
google_place_id: 'ChIJKZ-5WkUX_zkR29gWNCGKmZI',
name: 'Jessore Airport',
lat: '23.1771288',
lng: '89.16071740000001',
address: 'Airport Bypass Rd, Jessore 7400, Bangladesh',
isFavorite: '0',
type: '3',
note: null,
types: ['airport', 'establishment', 'point_of_interest']
}
};
const response = await fetch(`${BASE_URL}/search-available-vehicles`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': API_KEY
},
body: JSON.stringify(data)
});
const result = await response.json();
if (result.success) {
console.log('Booking ID:', result.data.bookingId);
console.log('Available Vehicles:', result.data.availableVehicles.length);
}
}
searchVehicles();
{
"success": true,
"statusCode": 200,
"message": "Search request processed successfully",
"data": {
"bookingId": "9b8ce075-c48d-4162-acec-4275cfdd686b",
"availableVehicles": [
{
"id": 842,
"vehicle": {
"id": 842,
"title": "Mercedes-Benz M008 2022",
"vehicleNumberPlate": "M008",
"partnerId": 487,
"partnerName": "BD Cars (Brand)",
"thumbnail": "https://localrydes-media.fra1.digitaloceanspaces.com/vehicle/RangeRover_1728135908.jpg",
"vehicleClass": {
"id": 3,
"title": "Luxury",
"slug": "luxury",
"tagName": "Luxury",
"thumbnail": "https://localrydes-media.fra1.digitaloceanspaces.com/vehicle-class/Luxury3x_1764404961.png"
},
"seatingCapacity": 10,
"luggageCapacity": 15
},
"sourcePriceCurrency": {
"id": 1,
"name": "Euro",
"isoCode": "EUR",
"symbol": "€"
},
"price": 1145.643,
"priceBeforeDiscount": 1145.643,
"partnerDiscountPercentage": 0,
"convertedPrice": 1145.643,
"convertedPriceBeforeDiscount": 1145.643,
"isDiscount": 0,
"customerCanBook": 1,
"b2bBookingLink": "https://www.dev.localrydes.com/external/select-vehcile/9b8ce075-c48d-4162-acec-4275cfdd686b/842"
},
{
"id": 840,
"vehicle": {
"id": 840,
"title": "Mercedes-Benz 246 2022",
"vehicleNumberPlate": "L0007 - Copy",
"partnerId": 487,
"partnerName": "BD Cars (Brand)",
"thumbnail": "https://localrydes-media.fra1.digitaloceanspaces.com/vehicle/RangeRover_1728135908.jpg",
"vehicleClass": {
"id": 3,
"title": "Luxury",
"slug": "luxury",
"tagName": "Luxury",
"thumbnail": "https://localrydes-media.fra1.digitaloceanspaces.com/vehicle-class/Luxury3x_1764404961.png"
},
"seatingCapacity": 10,
"luggageCapacity": 15
},
"sourcePriceCurrency": {
"id": 1,
"name": "Euro",
"isoCode": "EUR",
"symbol": "€"
},
"price": 1145.643,
"priceBeforeDiscount": 1145.643,
"partnerDiscountPercentage": 0,
"convertedPrice": 1145.643,
"convertedPriceBeforeDiscount": 1145.643,
"isDiscount": 0,
"customerCanBook": 1,
"b2bBookingLink": "https://www.dev.localrydes.com/external/select-vehcile/9b8ce075-c48d-4162-acec-4275cfdd686b/840"
}
]
}
}
Each vehicle includes a b2bBookingLink that provides a quick integration option:
"b2bBookingLink": "https://www.dev.localrydes.com/external/select-vehcile/9b8ce075-c48d-4162-acec-4275cfdd686b/842"
How it works:
bookingId from the response - you'll need it for subsequent API requests if using the full API integrationavailableVehicles includes complete details: vehicle info, pricing, partner details, and capacityb2bBookingLink for quick integration OR continue with Select Vehicle + Store Reservation API endpoints for full controltransfer bookings: drop_off_location is requiredhourly bookings: booking_hour is required (2-24 hours)itineraries array to add waypoints/stops during the journeyprice) and converted currency (convertedPrice)customerCanBook indicates if the vehicle is available for immediate bookingEndpoint: /booking/vehisles/{bookingId}
Retrieve available vehicles for a specific booking. Use the bookingId received from the vehicle search response.
| Parameter | Type | Description |
|---|---|---|
bookingId |
string | The booking ID from the search-available-vehicles response (UUID format) |
curl --location 'https://www.localrydes.com/api/v2/external/booking/vehisles/9b8ce075-c48d-4162-acec-4275cfdd686b' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE'
bookingId in the URL is the same value as cart_item_uuid returned from the search-available-vehicles endpoint.
Endpoint: /booking/select-vehicle
Select a specific vehicle from the available options for your booking.
| Parameter | Type | Required | Description |
|---|---|---|---|
booking_id |
string | Required | The bookingId from the search-available-vehicles response (UUID format) |
vehicle_id |
string | Required | The id of the selected vehicle from the availableVehicles array |
curl --location 'https://www.localrydes.com/api/v2/external/booking/select-vehicle' \
--header 'Content-Type: application/json' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE' \
--data '{
"booking_id": "9b8ce075-c48d-4162-acec-4275cfdd686b",
"vehicle_id": "842"
}'
booking_id must be the bookingId value from the search-available-vehicles responsevehicle_id must be the id of one of the vehicles in the availableVehicles arrayvehicle_id should be passed as a string (e.g., "842")Endpoint: /booking/store-reservation
Complete the booking by providing passenger information and confirming the reservation.
| Parameter | Type | Required | Description |
|---|---|---|---|
booking_id |
string | Required | The bookingId from the search-available-vehicles response (UUID format) |
flight_number |
string | Optional | Flight number if applicable (e.g., "FF001") |
passenger |
object | Required | Passenger information object (see Passenger Object below) |
| Field | Type | Required | Description |
|---|---|---|---|
full_name |
string | Required | Passenger's full name (e.g., "John Doe") |
email |
string | Required | Passenger's email address |
mobile |
string | Required | Passenger's mobile phone number |
curl --location 'https://www.localrydes.com/api/v2/external/booking/store-reservation' \
--header 'Content-Type: application/json' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE' \
--data '{
"booking_id": "9b8ce075-c48d-4162-acec-4275cfdd686b",
"flight_number": "FF001",
"passenger": {
"full_name": "John Doe",
"email": "john.doe@example.com",
"mobile": "1234567890"
}
}'
{
"success": true,
"statusCode": 200,
"message": "Successfully stored reservation",
"data": {
"reservation": {
"id": 909,
"uuid": "9e98886a-4a21-408d-87f1-5121773c4ad0",
"reservationId": "LR100909",
"serviceType": {
"id": 1,
"service": "Transfer",
"slug": "transfer"
},
"status": 4,
"passenger": {
"id": 5446,
"fullName": "John Doe Test",
"email": "john.doe@example.com",
"phoneNo": "1234567890",
"otherPassengerDetails": {
"full_name": "John Doe Test",
"email": "john.doe@example.com",
"mobile": "1234567890"
}
},
"items": [
{
"id": 2312,
"uuid": "8d310cd4-de2b-43a0-bdad-d0ebd83a9989",
"reservationId": "LR100909",
"title": "Mercedes-Benz 246 2022",
"pickUpDate": "2026-02-27",
"pickUpTime": "06:07 AM",
"pickUpAddress": "Airport - Dakshinkhan Rd, Dhaka 1229, Bangladesh",
"dropOffAddress": "55G6+V74, Airport Bypass Rd, Jashore 7400, Bangladesh",
"priceDetails": {
"currency": {
"id": 1,
"name": "Euro",
"isoCode": "EUR",
"symbol": "€"
},
"grandTotal": 323,
"partnerAmountOwnCurrency": 274.55
},
"vehicle": {
"id": 845,
"title": "Mercedes-Benz 246 2022",
"vehicleNumberPlate": "M007",
"partnerId": 487,
"partnerName": "BD Cars (Brand)",
"thumbnail": "https://localrydes-media.fra1.digitaloceanspaces.com/vehicle/RangeRover_1728135908.jpg",
"vehicleClass": {
"id": 3,
"title": "Luxury",
"slug": "luxury"
},
"seatingCapacity": 10,
"luggageCapacity": 15
},
"flightNumber": "FF001",
"status": 4
}
],
"chatRoom": {
"uuid": "9e98886a-4a21-408d-87f1-5121773c4ad0",
"reservationId": "LR100909",
"isEnded": false
}
}
}
}
Key fields in the response:
reservation.reservationId - Unique reservation identifier (e.g., "LR100909")reservation.uuid - Reservation UUID for trackingitems[].uuid - Individual trip item UUIDitems[].priceDetails - Complete pricing breakdown with currency informationitems[].vehicle - Full vehicle details including class, capacity, and imagesitems[].pickUpDate/Time - Formatted pickup date and timeitems[].addresses - Complete pickup and dropoff location detailschatRoom - Chat room information for customer-partner communicationpassenger - Complete passenger information and contact detailsbooking_id must be the bookingId from the search-available-vehicles responsefull_name, email, mobile) are required for successful booking completionflight_number is optional but recommended for airport transfersreservationId (e.g., "LR100909") for future reference and customer supportSpecial Offers provide curated travel packages, tours, and special deals with predefined itineraries. These endpoints allow you to browse, view details, and book special offers for your customers.
Endpoint: /special-offers
Retrieve a list of available special offers with optional filtering by search keyword, city, vehicle, or partner. Perfect for showcasing curated travel packages, tours, and special deals to your customers.
| Parameter | Type | Required | Description |
|---|---|---|---|
search_key |
string | Optional | Search keyword to filter offers by title or description |
city |
string | Optional | Filter offers by specific city |
limit |
integer | Optional | Number of offers to return per page (default: 10) |
skip |
integer | Optional | Number of offers to skip for pagination (default: 0) |
curl --location 'https://www.localrydes.com/api/v2/external/special-offers?city=Vienna&limit=5' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE'
curl --location 'https://www.localrydes.com/api/v2/external/special-offers?search_key=tour&limit=10&skip=0' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE'
<?php
$apiKey = 'lr_live_YOUR_API_KEY_HERE';
$baseUrl = 'https://www.localrydes.com/api/v2/external';
$queryParams = http_build_query([
'city' => 'Vienna',
'limit' => 5,
'skip' => 0
]);
$ch = curl_init($baseUrl . '/special-offers?' . $queryParams);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'x-api-key: ' . $apiKey
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
curl_close($ch);
if ($result['success']) {
echo "Found " . count($result['data']['specialOffers']) . " special offers\n";
foreach ($result['data']['specialOffers'] as $offer) {
echo "- " . $offer['title'] . " (" . $offer['sourceCurrency']['symbol'] . $offer['price'] . ")\n";
}
}
?>
const API_KEY = 'lr_live_YOUR_API_KEY_HERE';
const BASE_URL = 'https://www.localrydes.com/api/v2/external';
async function getSpecialOffers() {
const params = new URLSearchParams({
city: 'Vienna',
limit: '5',
skip: '0'
});
const response = await fetch(`${BASE_URL}/special-offers?${params}`, {
method: 'GET',
headers: {
'x-api-key': API_KEY
}
});
const result = await response.json();
if (result.success) {
console.log(`Found ${result.data.specialOffers.length} special offers`);
result.data.specialOffers.forEach(offer => {
console.log(`- ${offer.title} (${offer.sourceCurrency.symbol}${offer.price})`);
});
}
}
getSpecialOffers();
{
"success": true,
"statusCode": 200,
"message": "Special offers fetched successfully",
"data": {
"specialOffers": [
{
"id": 42,
"uuid": "9d1a2b3c-4e5f-6g7h-8i9j-0k1l2m3n4o5p",
"title": "Rome City Tour - 3 Days",
"slug": "rome-city-tour-3-days",
"shortDescription": "Explore the eternal city with our exclusive 3-day tour package",
"sourceCurrency": {
"id": 1,
"name": "Euro",
"isoCode": "EUR",
"symbol": "€"
},
"price": 450.00,
"discount": 50.00,
"discountType": "fixed",
"provider": "LocalRydes Premium Tours",
"startDate": "2026-05-01",
"endDate": "2026-09-30",
"city": {
"id": 125,
"name": "Rome",
"slug": "rome",
"countryName": "Italy"
},
"country": "IT",
"vehicle": {
"id": 521,
"title": "Mercedes-Benz E-Class",
"vehicleNumberPlate": "ROM-2024",
"seatingCapacity": 4,
"luggageCapacity": 3,
"thumbnail": "https://example.com/vehicles/mercedes-e-class.jpg"
},
"thumbnail": "https://example.com/offers/rome-tour.jpg",
"images": [
"https://example.com/offers/rome-tour.jpg",
"https://example.com/offers/rome-colosseum.jpg",
"https://example.com/offers/rome-vatican.jpg"
],
"maxBookingLimit": 5,
"maxPassengerLimit": 4,
"durationUnit": "daily",
"duration": 3,
"metaDescription": "Experience Rome like never before with our 3-day city tour",
"metaKeywords": "Rome, Italy, Tour, City Tour, Travel",
"additionalNoteTitle": "Special Requests",
"additionalNoteDefaultValue": "Please specify any dietary restrictions or special requests",
"isShowOnHome": true,
"contents": [
{
"id": 101,
"title": "Day 1: Colosseum & Roman Forum",
"description": "Visit the iconic Colosseum and explore ancient Roman ruins",
"showOnPdf": 1,
"icon": "bi-file-earmark-text"
},
{
"id": 102,
"title": "Day 2: Vatican City",
"description": "Tour St. Peter's Basilica and the Vatican Museums",
"showOnPdf": 1,
"icon": "bi-file-earmark-text"
},
{
"id": 103,
"title": "Day 3: Trevi Fountain & Spanish Steps",
"description": "Explore Rome's beautiful fountains and squares",
"showOnPdf": 1,
"icon": "bi-file-earmark-text"
}
],
"isActive": true,
"status": true,
"isFeatured": true,
"specialOfferCategory": {
"id": 3,
"name": "City Tours",
"slug": "city-tours"
}
}
]
}
}
Special Offers are perfect for:
limit and skip for pagination (e.g., limit=10&skip=0 for first page, skip=10 for second page)durationUnit can be either "daily" or "hourly" to indicate package duration typeduration represents the number of days/hours depending on durationUnitcontents array contains detailed itinerary information for each day/segmentmaxBookingLimit indicates how many simultaneous bookings can be made for this offermaxPassengerLimit shows the maximum number of passengers allowed per bookinguuid to fetch detailed information using the Get Offer Details endpointdiscountType (fixed or percentage)Endpoint: /special-offers/{uuid}
Retrieve detailed information about a specific special offer including complete itinerary, pricing, vehicle details, and booking requirements.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid |
string | Required | The unique identifier (UUID) of the special offer |
curl --location 'https://www.localrydes.com/api/v2/external/special-offers/9d1a2b3c-4e5f-6g7h-8i9j-0k1l2m3n4o5p' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE'
<?php
$apiKey = 'lr_live_YOUR_API_KEY_HERE';
$baseUrl = 'https://www.localrydes.com/api/v2/external';
$offerUuid = '9d1a2b3c-4e5f-6g7h-8i9j-0k1l2m3n4o5p';
$ch = curl_init($baseUrl . '/special-offers/' . $offerUuid);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'x-api-key: ' . $apiKey
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
curl_close($ch);
if ($result['success']) {
$offer = $result['data']['specialOffer'];
echo "Offer: " . $offer['title'] . "\n";
echo "Price: " . $offer['sourceCurrency']['symbol'] . $offer['price'] . "\n";
echo "Duration: " . $offer['duration'] . " " . $offer['durationUnit'] . "\n";
echo "Location: " . $offer['city']['name'] . ", " . $offer['city']['countryName'] . "\n";
}
?>
const API_KEY = 'lr_live_YOUR_API_KEY_HERE';
const BASE_URL = 'https://www.localrydes.com/api/v2/external';
const OFFER_UUID = '9d1a2b3c-4e5f-6g7h-8i9j-0k1l2m3n4o5p';
async function getOfferDetails() {
const response = await fetch(`${BASE_URL}/special-offers/${OFFER_UUID}`, {
method: 'GET',
headers: {
'x-api-key': API_KEY
}
});
const result = await response.json();
if (result.success) {
const offer = result.data.specialOffer;
console.log(`Offer: ${offer.title}`);
console.log(`Price: ${offer.sourceCurrency.symbol}${offer.price}`);
console.log(`Duration: ${offer.duration} ${offer.durationUnit}`);
console.log(`Location: ${offer.city.name}, ${offer.city.countryName}`);
// Display itinerary
console.log('\nItinerary:');
offer.contents.forEach((item, index) => {
console.log(`${index + 1}. ${item.title}: ${item.description}`);
});
}
}
getOfferDetails();
{
"success": true,
"statusCode": 200,
"message": "Special offer fetched successfully",
"data": {
"specialOffer": {
"id": 42,
"uuid": "9d1a2b3c-4e5f-6g7h-8i9j-0k1l2m3n4o5p",
"title": "Rome City Tour - 3 Days",
"slug": "rome-city-tour-3-days",
"shortDescription": "Explore the eternal city with our exclusive 3-day tour package",
"sourceCurrency": {
"id": 1,
"name": "Euro",
"isoCode": "EUR",
"symbol": "€"
},
"price": 450.00,
"discount": 50.00,
"discountType": "fixed",
"provider": "LocalRydes Premium Tours",
"startDate": "2026-05-01",
"endDate": "2026-09-30",
"city": {
"id": 125,
"name": "Rome",
"slug": "rome",
"countryName": "Italy",
"lat": "41.9028",
"lng": "12.4964"
},
"country": "IT",
"vehicle": {
"id": 521,
"title": "Mercedes-Benz E-Class",
"vehicleNumberPlate": "ROM-2024",
"partnerId": 125,
"partnerName": "Premium Tours Rome",
"seatingCapacity": 4,
"luggageCapacity": 3,
"thumbnail": "https://example.com/vehicles/mercedes-e-class.jpg",
"vehicleClass": {
"id": 3,
"title": "Luxury",
"slug": "luxury"
}
},
"thumbnail": "https://example.com/offers/rome-tour.jpg",
"images": [
"https://example.com/offers/rome-tour.jpg",
"https://example.com/offers/rome-colosseum.jpg",
"https://example.com/offers/rome-vatican.jpg",
"https://example.com/offers/rome-trevi.jpg"
],
"maxBookingLimit": 5,
"maxPassengerLimit": 4,
"durationUnit": "daily",
"duration": 3,
"metaDescription": "Experience Rome like never before with our 3-day city tour",
"metaKeywords": "Rome, Italy, Tour, City Tour, Travel",
"additionalNoteTitle": "Special Requests",
"additionalNoteDefaultValue": "Please specify any dietary restrictions or special requests",
"isShowOnHome": true,
"contents": [
{
"id": 101,
"title": "Day 1: Colosseum & Roman Forum",
"description": "Begin your journey with a guided tour of the iconic Colosseum, the largest amphitheater ever built. Walk through history at the Roman Forum, the center of ancient Roman life. Includes skip-the-line tickets and professional English-speaking guide.",
"showOnPdf": 1,
"icon": "bi-file-earmark-text"
},
{
"id": 102,
"title": "Day 2: Vatican City & Museums",
"description": "Explore the world's smallest country with a comprehensive tour of St. Peter's Basilica, the Sistine Chapel, and the Vatican Museums. Marvel at Michelangelo's masterpieces and Renaissance art. Includes all entrance fees and expert art historian guide.",
"showOnPdf": 1,
"icon": "bi-file-earmark-text"
},
{
"id": 103,
"title": "Day 3: Trevi Fountain, Spanish Steps & Trastevere",
"description": "Discover Rome's charming neighborhoods, toss a coin in the Trevi Fountain, climb the Spanish Steps, and explore the bohemian Trastevere district. Includes authentic Italian lunch and gelato tasting.",
"showOnPdf": 1,
"icon": "bi-file-earmark-text"
}
],
"isActive": true,
"status": true,
"isFeatured": true,
"specialOfferCategory": {
"id": 3,
"name": "City Tours",
"slug": "city-tours",
"description": "Curated city exploration packages"
}
}
}
}
Key information in the response:
contents array provides detailed itinerary for each day/segment of the tourvehicle object includes complete vehicle details with partner informationimages array contains all promotional images for the offerstartDate and endDate define the validity period for bookingcity includes geographic coordinates for mapping integrationmaxBookingLimit shows remaining availability for simultaneous bookingsmaxPassengerLimit indicates maximum group size per bookingadditionalNoteTitle/DefaultValue suggest what customers should specify during bookingprice shows the final price after applying any discountsdiscountType can be "fixed" (amount) or "percentage"status and isActive before allowing bookingscontents array is ordered and represents the chronological itineraryEndpoint: /special-offers/add-to-cart
Book a special offer by adding it to cart and creating an immediate reservation. This endpoint handles the complete booking flow including date/time selection, passenger details, and reservation creation.
| Parameter | Type | Required | Description |
|---|---|---|---|
special_offer_id |
integer | Required | The ID of the special offer (from the list or details endpoint) |
pickup_date |
string | Optional | Pickup date in YYYY-MM-DD format (e.g., "2026-05-15"). If not provided, uses offer's start date |
pickup_time |
string | Optional | Pickup time in HH:MM format (e.g., "09:00"). If not provided, uses default time |
drop_off_date |
string | Optional | Drop-off date in YYYY-MM-DD format. Auto-calculated based on offer duration if not provided |
pickup_location |
string | Optional | Full pickup address (max 500 characters) |
drop_off_location |
string | Optional | Full drop-off address (max 500 characters) |
additional_note |
string | Optional | Special requests or notes (max 1000 characters) |
passenger |
object | Optional | Passenger details if booking for someone else (see Passenger Object below) |
| Field | Type | Required | Description |
|---|---|---|---|
full_name |
string | Required | Passenger's full name (max 255 characters) |
email |
string | Required | Passenger's email address (max 255 characters) |
mobile |
string | Required | Passenger's mobile phone number (max 50 characters) |
curl --location 'https://www.localrydes.com/api/v2/external/special-offers/add-to-cart' \
--header 'Content-Type: application/json' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE' \
--data '{
"special_offer_id": 42,
"pickup_date": "2026-05-15",
"pickup_time": "09:00",
"pickup_location": "Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy",
"drop_off_location": "Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy",
"additional_note": "We would like an English-speaking guide. Vegetarian lunch option preferred."
}'
curl --location 'https://www.localrydes.com/api/v2/external/special-offers/add-to-cart' \
--header 'Content-Type: application/json' \
--header 'x-api-key: lr_live_YOUR_API_KEY_HERE' \
--data '{
"special_offer_id": 42,
"pickup_date": "2026-05-15",
"pickup_time": "09:00",
"pickup_location": "Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy",
"drop_off_location": "Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy",
"additional_note": "Early morning pickup requested",
"passenger": {
"full_name": "John Smith",
"email": "john.smith@example.com",
"mobile": "+1-555-0123"
}
}'
<?php
$apiKey = 'lr_live_YOUR_API_KEY_HERE';
$baseUrl = 'https://www.localrydes.com/api/v2/external';
$data = [
'special_offer_id' => 42,
'pickup_date' => '2026-05-15',
'pickup_time' => '09:00',
'pickup_location' => 'Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy',
'drop_off_location' => 'Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy',
'additional_note' => 'English-speaking guide preferred',
'passenger' => [
'full_name' => 'John Smith',
'email' => 'john.smith@example.com',
'mobile' => '+1-555-0123'
]
];
$ch = curl_init($baseUrl . '/special-offers/add-to-cart');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'x-api-key: ' . $apiKey
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
curl_close($ch);
if ($result['success']) {
$reservation = $result['data']['reservation'];
echo "Reservation Created!\n";
echo "Reservation ID: " . $reservation['reservationId'] . "\n";
echo "UUID: " . $reservation['uuid'] . "\n";
echo "Total Price: " . $reservation['items'][0]['priceDetails']['currency']['symbol'];
echo $reservation['items'][0]['priceDetails']['grandTotal'] . "\n";
}
?>
const API_KEY = 'lr_live_YOUR_API_KEY_HERE';
const BASE_URL = 'https://www.localrydes.com/api/v2/external';
async function bookSpecialOffer() {
const data = {
special_offer_id: 42,
pickup_date: '2026-05-15',
pickup_time: '09:00',
pickup_location: 'Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy',
drop_off_location: 'Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy',
additional_note: 'English-speaking guide preferred',
passenger: {
full_name: 'John Smith',
email: 'john.smith@example.com',
mobile: '+1-555-0123'
}
};
const response = await fetch(`${BASE_URL}/special-offers/add-to-cart`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': API_KEY
},
body: JSON.stringify(data)
});
const result = await response.json();
if (result.success) {
const reservation = result.data.reservation;
console.log('Reservation Created!');
console.log(`Reservation ID: ${reservation.reservationId}`);
console.log(`UUID: ${reservation.uuid}`);
console.log(`Total: ${reservation.items[0].priceDetails.currency.symbol}${reservation.items[0].priceDetails.grandTotal}`);
// You can now redirect to payment or confirmation page
return reservation;
} else {
console.error('Booking failed:', result.message);
}
}
bookSpecialOffer();
{
"success": true,
"statusCode": 200,
"message": "Special offer reservation created successfully",
"data": {
"reservation": {
"id": 1523,
"uuid": "9e12a34b-56c7-8d90-1e23-456f789g012h",
"reservationId": "LR101523",
"serviceType": {
"id": 19,
"service": "Special Offer",
"slug": "special-offer"
},
"status": 4,
"passenger": {
"id": 892,
"fullName": "John Smith",
"email": "john.smith@example.com",
"phoneNo": "+1-555-0123",
"otherPassengerDetails": {
"full_name": "John Smith",
"email": "john.smith@example.com",
"mobile": "+1-555-0123"
}
},
"items": [
{
"id": 3421,
"uuid": "8a9b0c1d-2e3f-4g5h-6i7j-8k9l0m1n2o3p",
"reservationId": "LR101523",
"title": "Rome City Tour - 3 Days",
"pickUpDate": "2026-05-15",
"pickUpTime": "09:00 AM",
"dropOffDate": "2026-05-18",
"dropOffTime": "06:00 PM",
"pickUpAddress": "Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy",
"dropOffAddress": "Hotel Colosseo, Via Labicana, 125, 00184 Rome, Italy",
"additionalNote": "English-speaking guide preferred",
"priceDetails": {
"currency": {
"id": 1,
"name": "Euro",
"isoCode": "EUR",
"symbol": "€"
},
"grandTotal": 450.00,
"partnerAmountOwnCurrency": 405.00,
"adminCommissionAmount": 45.00,
"adminCommissionPercentage": 10
},
"vehicle": {
"id": 521,
"title": "Mercedes-Benz E-Class",
"vehicleNumberPlate": "ROM-2024",
"partnerId": 125,
"partnerName": "Premium Tours Rome",
"thumbnail": "https://example.com/vehicles/mercedes-e-class.jpg",
"vehicleClass": {
"id": 3,
"title": "Luxury",
"slug": "luxury"
},
"seatingCapacity": 4,
"luggageCapacity": 3
},
"specialOffer": {
"id": 42,
"uuid": "9d1a2b3c-4e5f-6g7h-8i9j-0k1l2m3n4o5p",
"title": "Rome City Tour - 3 Days",
"durationUnit": "daily",
"duration": 3,
"thumbnail": "https://example.com/offers/rome-tour.jpg"
},
"status": 4
}
],
"chatRoom": {
"uuid": "9e12a34b-56c7-8d90-1e23-456f789g012h",
"reservationId": "LR101523",
"isEnded": false
},
"createdAt": "2026-04-08T10:30:00.000000Z"
}
}
}
Key information after successful booking:
reservationId - Unique human-readable reservation identifier (e.g., "LR101523")uuid - System UUID for tracking and API operationsstatus: 4 - Reservation is confirmed and ready for paymentitems - Contains complete trip details including dates, times, addresses, and pricingpriceDetails - Breakdown of total cost, partner amount, and commissionchatRoom - Communication channel for customer-partner interactionpassenger - Complete passenger information for confirmationImportant notes about date/time handling:
startDateduration and durationUnitstartDate and endDate rangespecial_offer_id is required and must be a valid, active offer IDpassenger object is provided, booking is made for that person instead of the API account holderpassenger is omitted, the reservation is created for the API account's default userreservationId for customer support and tracking purposesadditional_note field should contain special requests (dietary needs, accessibility, etc.)priceDetails show the split between partner and platformstatus field - status 4 means confirmed and awaiting paymentAfter successfully creating a reservation:
reservationId and uuid in your systemchatRoom UUID for any real-time communication featuresAll error responses follow a consistent structure:
{
"success": false,
"statusCode": 400,
"message": "Error description",
"errors": [
{
"errorCode": 1001,
"errorField": "pickup_date",
"errorMessage": "Pickup date is required"
}
]
}
| Status Code | Error Code | Description | Solution |
|---|---|---|---|
| 401 | AUTH_INVALID |
Invalid or missing API key | Check your API key in the header |
| 403 | AUTH_EXPIRED |
API key has expired | Contact support to renew your key |
| 404 | RESOURCE_NOT_FOUND |
Requested resource not found | Verify the resource ID or URL |
| 422 | VALIDATION_ERROR |
Request validation failed | Check request parameters |
| 429 | RATE_LIMIT_EXCEEDED |
Too many requests | Wait and retry with backoff |
| 500 | SERVER_ERROR |
Internal server error | Contact support with request details |
Monitor your usage through response headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1672531200
If you don't have an API key yet, contact our sales team to set up your agency account and receive your credentials.
Contact Sales