Overview
The Airport Pickups London (APL) API lets you get real-time transfer quotes and create bookings for airport, cruise port, and train station transfers across the UK.
- All UK airports including Heathrow (T2–T5), Gatwick (North & South), Stansted, Luton, London City, Manchester, Birmingham, Edinburgh, and more
- Cruise ports: Southampton, Dover, Portsmouth, Tilbury, Harwich
- Transfers to/from any UK address or postcode
- Fixed prices — no surge pricing
- Free cancellation & free child seats on request
- Meet & greet included for airport pickups
Authentication
All requests require an API key sent in the x-api-key header.
// Example header
x-api-key: your-api-key-here
Your API key is linked to your account configuration (account ID, payment type, etc). If you are already a registered APL partner or agency, your API key has been assigned to you — contact us at info@airport-pickups-london.com or call 020 3988 2168 to receive it. For new AI agents, you can self-register instantly.
Base URL
https://mcp.airport-pickups-london.com/api
All endpoint paths below are relative to this base URL.
Get Quote
Get available car types and prices for a transfer. Use this to show pricing to your customers before they book.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| origin | string | required | Pickup location — airport name, full address, or postcode (e.g. "Heathrow Terminal 5", "SW1A 2AA") |
| destination | string | required | Dropoff location — full address, postcode, or airport name |
| passengers | number | optional | Number of passengers (default: 1). Used to recommend the right car. |
| suitcases | number | optional | Number of suitcases / large bags (default: 0) |
| transfer_date | string | optional | Date in YYYY-MM-DD format (e.g. "2026-03-15"). Defaults to today. |
| transfer_time | string | optional | Time in HH:MM format (e.g. "14:30"). Defaults to 2 hours from now. |
| requestedDiscountPercent | number | optional | A2A pricing negotiation: request a discount (0–5%). Values above 5 are capped at 5%. Non-negotiable: peak surcharges, event pricing, child seats. Response includes appliedDiscountPercent showing the actual discount given. |
curl -X POST https://mcp.airport-pickups-london.com/api/quote \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "origin": "Heathrow Terminal 5", "destination": "10 Downing Street, London, SW1A 2AA", "passengers": 2, "suitcases": 2, "transfer_date": "2026-03-15", "transfer_time": "14:30" }'
curl -X POST https://mcp.airport-pickups-london.com/api/quote \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "origin": "Heathrow", "destination": "W1", "requestedDiscountPercent": 3 }'
{
"pickup": "London Heathrow Airport, Terminal 5",
"dropoff": "10 Downing Street, Downing Street, London SW1A 2AA, UK",
"transfer_date": "2026-03-15",
"transfer_time": "14:30",
"passengers": 2,
"recommended_car_type": "Saloon",
"duration": "51 minutes",
"cars": [
{
"car_type": "Saloon",
"price_gbp": 88,
"max_passengers": 3,
"max_bags": 3
},
{
"car_type": "People Carrier",
"price_gbp": 98,
"max_passengers": 5,
"max_bags": 5
},
{
"car_type": "8 Seater",
"price_gbp": 119,
"max_passengers": 8,
"max_bags": 8
}
],
"meeting_point": {
"name": "Heathrow T5",
"instructions": "Our driver will hold a board with your name inside the terminal..."
}
}
Validate Flight
/api/validate-flight
Validate a flight number and get flight details including airline name, arrival airport, terminal, and arrival time. Use this before booking to verify the customer’s flight and auto-detect the correct terminal. Works with flights within the next few days (FlightStats live data) and has static terminal mapping as fallback for future dates.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
flight_number | string | Yes | Flight number (e.g. “BA2534”, “EK007”, “AA38”) |
date | string | Yes | Flight date in YYYY-MM-DD format |
{
"valid": true,
"airline": "British Airways",
"flight_number": "BA2534",
"arrival_airport": "Heathrow",
"arrival_terminal": "T5",
"arrival_time": "14:30",
"departure_airport": "DXB",
"source": "flightstats"
}
If the flight cannot be verified, returns { "valid": false, "message": "..." }. This never blocks booking — the customer can still proceed without flight validation.
POST /api/book endpoint also validates the flight automatically, so this call is optional but improves UX.Create Booking
Create a confirmed transfer booking. This creates a real reservation — only call after your customer confirms.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| origin | string | required | Pickup location |
| destination | string | required | Dropoff location |
| transfer_date | string | required | Date in YYYY-MM-DD format |
| transfer_time | string | required | Time in HH:MM format |
| passenger_name | string | required | Full name of the lead passenger |
| passenger_phone | string | required | Phone number with country code (e.g. "+447123456789") |
| passenger_email | string | recommended | Email for booking confirmation and manage-booking link |
| passengers | number | optional | Number of passengers (default: 1) |
| suitcases | number | optional | Number of suitcases (default: 1) |
| car_type | string | optional | Car type from the quote (e.g. "Saloon", "People Carrier"). Auto-selected if omitted. |
| door_number | string | conditional | House/building number. Required when destination is a postcode (e.g. "12", "Flat 3"). |
| flight_number | string | conditional | Flight number — required for airport pickups, optional for dropoffs (e.g. "BA2534"). Auto-validates and detects terminal. |
| cruise_name | string | conditional | Ship/cruise name for port transfers (e.g. "P&O Ventura") |
| train_number | string | conditional | Train number or origin for station transfers |
| special_requests | string | optional | Any special requirements (e.g. "child seat needed", "wheelchair access") |
flight_number for airport pickups (required) or dropoffs (optional), cruise_name for port transfers, door_number when destination is a postcode.
curl -X POST https://mcp.airport-pickups-london.com/api/book \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "origin": "Heathrow Terminal 5", "destination": "10 Downing Street, London, SW1A 2AA", "transfer_date": "2026-03-15", "transfer_time": "14:30", "passengers": 2, "suitcases": 2, "car_type": "Saloon", "passenger_name": "John Smith", "passenger_phone": "+447123456789", "passenger_email": "john@example.com", "door_number": "10", "flight_number": "BA2534", "special_requests": "Child seat needed" }'
{
"booking_ref": "APL-X7K9M2",
"external_ref": 954226,
"status": "confirmed",
"pickup": "London Heathrow Airport, Terminal 5",
"dropoff": "10 Downing Street, Downing Street, London SW1A 2AA, UK",
"date": "2026-03-15",
"time": "14:30",
"car_type": "Saloon",
"price_gbp": 88,
"passengers": 2,
"passenger": {
"name": "John Smith",
"phone": "+447123456789",
"email": "john@example.com"
},
"duration": "51 minutes",
"manage_booking_url": "https://www.airport-pickups-london.com/manage-booking.html?reservationId=954226&email=john%40example.com",
"meeting_point": {
"name": "Heathrow T5",
"instructions": "Our driver will hold a board with your name inside the terminal..."
},
"flight_info": {
"airline": "British Airways",
"flight_number": "BA2534",
"arrival_airport": "Heathrow",
"arrival_terminal": "T5",
"arrival_time": "14:30",
"departure_airport": "DXB"
},
"message": "Booking confirmed! You can pay the driver in cash on the day, or if you prefer to pay by card, Apple Pay, or Google Pay, use the manage booking link."
}
Response Fields
| Field | Type | Description |
|---|---|---|
| booking_ref | string | APL internal booking reference (e.g. "APL-X7K9M2") |
| external_ref | number | Reservation ID in the dispatch system |
| status | string | Booking status — "confirmed" on success |
| price_gbp | number | Final price in GBP |
| manage_booking_url | string | Link to manage, track, pay by card/Apple Pay/Google Pay, and edit the booking |
| meeting_point | object | Driver meeting instructions (for airport/station pickups) |
| flight_info | object|null | Flight details from FlightStats validation (if flight_number was provided and verified). Contains: airline, flight_number, arrival_airport, arrival_terminal, arrival_time, departure_airport |
Car Types
Available vehicle types returned in quote responses. Use the car_type value when creating a booking.
| Car Type | Max Passengers | Max Bags | Description |
|---|---|---|---|
| Saloon | 3 | 3 | Standard sedan — ideal for 1–3 passengers |
| People Carrier | 5 | 5 | Spacious MPV for families or groups |
| 8 Seater | 8 | 8 | Minibus for larger groups |
| Executive Saloon | 3 | 3 | Premium sedan with luxury interior |
| Executive MPV | 7 | 7 | Premium people carrier |
| Executive 8 Seater | 8 | 8 | Premium minibus with luxury interior |
Lookup Booking
Retrieve the current status and details of an existing booking.
Verification required. External and partner agents must supply both the booking reference and the passenger email that is on file — the same verification a passenger performs on the "Manage Booking" page. Requests missing either field return 400.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| booking_ref | string | required | APL booking reference (e.g. "APL-XXXXXX") |
| string | required | Passenger email on the booking — must match exactly (case-insensitive) |
curl -X POST https://mcp.airport-pickups-london.com/api/lookup-booking \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "booking_ref": "APL-X7K9M2", "email": "john@example.com" }'
{
"booking_ref": "APL-X7K9M2",
"status": "confirmed",
"pickup": "London Heathrow Airport, Terminal 5",
"dropoff": "10 Downing Street, London SW1A 2AA",
"date": "2026-03-15",
"time": "14:30",
"car_type": "Saloon",
"price_gbp": 88,
"passenger": {
"name": "John Smith",
"phone": "+447123456789",
"email": "john@example.com"
},
"driver": {
"name": "David Johnson",
"phone": "+447900123456"
},
"manage_booking_url": "https://www.airport-pickups-london.com/manage-booking.html?reservationId=954226&email=john%40example.com"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| booking_ref | string | APL booking reference |
| status | string | Current booking status (e.g. "confirmed", "completed", "cancelled") |
| passenger | object | Passenger name, phone, and email |
| driver | object|null | Assigned driver name and phone (null if not yet assigned) |
| manage_booking_url | string | Link to manage, track, and pay for the booking |
Amend Booking
Amend details on an existing booking. You can update one or more fields at a time — only include the fields you want to change.
Verification required. External and partner agents must supply both the booking reference and the passenger email on file (case-insensitive match). passenger_email itself cannot be changed via this endpoint.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| booking_ref | string | required | APL booking reference (e.g. "APL-XXXXXX") |
| string | required | Passenger email on the booking — must match exactly | |
| changes | object | required | Object containing the fields to update (see below) |
Amendable Fields (inside changes)
| Field | Type | Description |
|---|---|---|
| passenger_name | string | Updated passenger name |
| passenger_phone | string | Updated phone number |
| flight_number | string | Updated flight number |
| special_requests | string | Updated special requirements |
| transfer_date | string | New date in YYYY-MM-DD format |
| transfer_time | string | New time in HH:MM format |
| passengers | number | Updated passenger count |
curl -X POST https://mcp.airport-pickups-london.com/api/amend-booking \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "booking_ref": "APL-X7K9M2", "email": "john@example.com", "changes": { "passenger_phone": "+447999888777", "flight_number": "BA2590", "transfer_time": "15:00" } }'
{
"success": true,
"booking_ref": "APL-X7K9M2",
"amended_fields": ["passenger_phone", "flight_number", "transfer_time"]
}
Response Fields
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the amendment was applied |
| booking_ref | string | The amended booking reference |
| amended_fields | array | List of field names that were successfully updated |
Cancel Booking
Cancel an existing booking. Free cancellation is available 12 or more hours before the scheduled pickup time.
Verification required. External and partner agents must supply both the booking reference and the passenger email on file.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| booking_ref | string | required | APL booking reference (e.g. "APL-XXXXXX") |
| string | required | Passenger email on the booking — must match exactly | |
| reason | string | optional | Reason for cancellation |
curl -X POST https://mcp.airport-pickups-london.com/api/cancel-booking \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "booking_ref": "APL-X7K9M2", "email": "john@example.com", "reason": "Flight cancelled" }'
{
"success": true,
"booking_ref": "APL-X7K9M2",
"status": "cancelled",
"hours_before_pickup": 26.5,
"admin_fee": 0
}
Response Fields
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the cancellation was processed |
| status | string | "cancelled" on success |
| hours_before_pickup | number | Hours remaining before the scheduled pickup time |
| admin_fee | number | Admin fee in GBP (0 if 12+ hours before pickup, 10 if less than 12 hours) |
Track Driver
Get live driver location and vehicle details for an active booking. Returns the assigned driver’s information, GPS coordinates, heading, speed, and estimated time of arrival.
Verification required. External and partner agents must supply both the booking reference and the passenger email on file.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| booking_ref | string | required | APL booking reference (e.g. "APL-XXXXXX") |
| string | required | Passenger email on the booking — must match exactly |
curl -X POST https://mcp.airport-pickups-london.com/api/track \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "booking_ref": "APL-X7K9M2", "email": "john@example.com" }'
{
"booking_ref": "APL-X7K9M2",
"driver": {
"name": "David Johnson",
"photo_url": "https://api.london-tech.com/drivers/photos/8042.jpg",
"phone": "+447900123456",
"pco_licence": "012345"
},
"vehicle": {
"make": "Mercedes-Benz",
"model": "E-Class",
"colour": "Black",
"registration": "AB12 CDE"
},
"position": {
"latitude": 51.4700,
"longitude": -0.4543,
"heading": 85,
"speed_mph": 42,
"is_interpolated": false
},
"eta_minutes": 8
}
Response Fields
| Field | Type | Description |
|---|---|---|
| driver | object | Driver details: name, photo URL, phone number, and PCO licence number |
| vehicle | object | Vehicle make, model, colour, and registration plate |
| position | object | Live GPS coordinates (latitude, longitude), heading in degrees, speed in mph |
| position.is_interpolated | boolean | True if the driver is in a known tunnel and position is estimated |
| eta_minutes | number | Estimated time of arrival in minutes |
MCP Protocol Model Context Protocol
Our server implements the Model Context Protocol (MCP) — the open standard used by Claude, Cursor, Windsurf, and other AI tools for connecting to external services. MCP provides tool-based access to quoting and booking via Streamable HTTP transport with OAuth 2.1 authentication.
Endpoint
https://mcp.airport-pickups-london.com/mcp
Authentication
The MCP server supports two authentication methods:
- API Key — Send your key in the
x-api-keyheader (same key as the REST API) - OAuth 2.1 — Automatic for Claude.ai Integrations and other OAuth-capable clients. Supports authorization code (with PKCE) and client credentials grants.
Connect to MCP
Claude.ai (Recommended)
The easiest way — no setup required:
- Go to Settings → Integrations → Add Custom Integration
- Enter:
https://mcp.airport-pickups-london.com/mcp - Ask Claude: “How much is a taxi from Heathrow to Oxford?”
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"airport-pickups-london": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.airport-pickups-london.com/mcp",
"--header",
"x-api-key:YOUR_API_KEY"
]
}
}
}Claude Code (CLI)
claude mcp add apl-transfers https://mcp.airport-pickups-london.com/mcp --header "x-api-key:YOUR_API_KEY"
Cursor / Windsurf / Other IDEs
Add the MCP server URL in your IDE’s MCP settings. Most IDEs support remote MCP servers via Streamable HTTP transport.
MCP Tools
Three tools are available via the MCP server:
london_airport_transfer_quote
Get fixed-price quotes for airport and cruise port transfers. Returns all available car types with prices, capacity, and luggage info.
| Parameter | Type | Required | Description |
|---|---|---|---|
origin | string | Yes | Pickup location — airport name or address/postcode |
destination | string | Yes | Dropoff location — address, postcode, or airport |
passengers | number | No | Number of passengers (default 1) |
suitcases | number | No | Number of suitcases (default 1) |
transfer_date | string | No | Date in YYYY-MM-DD format |
transfer_time | string | No | Time in HH:MM format |
book_london_airport_transfer
Create a confirmed reservation. Requires passenger details, date/time, and locations. Returns a booking reference and management link for payment and live driver tracking.
| Parameter | Type | Required | Description |
|---|---|---|---|
origin | string | Yes | Pickup location |
destination | string | Yes | Dropoff location |
transfer_date | string | Yes | Date (YYYY-MM-DD) |
transfer_time | string | Yes | Time (HH:MM) |
passenger_name | string | Yes | Full name |
passenger_phone | string | Yes | Phone with country code |
passenger_email | string | No | Email for confirmation |
passengers | number | No | Number of passengers (default 1) |
car_type | string | No | e.g. “Saloon”, “People Carrier” |
flight_number | string | No | Flight number for airport pickups |
special_requests | string | No | e.g. “child seat needed” |
validate_flight
Validate a flight number and get flight details including airline name, arrival airport, terminal, and arrival time. Use this before booking to verify the customer’s flight and auto-detect the correct terminal.
| Parameter | Type | Required | Description |
|---|---|---|---|
flight_number | string | Yes | Flight number (e.g. “BA2534”, “EK007”) |
date | string | Yes | Flight date in YYYY-MM-DD format |
{
"valid": true,
"airline": "British Airways",
"flight_number": "BA2534",
"arrival_airport": "Heathrow",
"arrival_terminal": "T5",
"arrival_time": "14:30",
"departure_airport": "DXB"
}
If the flight is not found or invalid, returns { "valid": false, "message": "..." }. Booking can still proceed without flight validation.
A2A Protocol Agent-to-Agent
The APL Transfer Agent implements Google's Agent-to-Agent (A2A) protocol, allowing any A2A-compatible AI agent to discover our services and request quotes or bookings via standard JSON-RPC 2.0 messages.
/api/quote, /api/book) for direct programmatic integration. Use A2A (/a2a) when your AI agent needs to discover and communicate with APL using the standard A2A protocol.
How It Works
- Discovery — Your agent fetches
/.well-known/agent.jsonto learn what APL can do - Authentication — Include your API key in the
x-api-keyheader (same key as the REST API) - Send a message — POST a JSON-RPC 2.0 request to
/a2awith amessage/sendmethod - Get results — The response contains a task with status and artifacts (quote data or booking confirmation)
Base URL
https://mcp.airport-pickups-london.com
Available Skills
| Skill ID | Name | Description |
|---|---|---|
| get_quote | Transfer Quoting | Get fixed prices for all car types on any supported route |
| create_booking | Transfer Booking | Create a live reservation with passenger details |
Agent Discovery
Returns the Agent Card describing APL's capabilities, skills, and authentication requirements. No API key required.
curl https://mcp.airport-pickups-london.com/.well-known/agent.json
Returns a JSON Agent Card with:
name— Agent identifier (airport-pickups-london)supported_interfaces— A2A endpoint URL and protocol versionskills— Available skills with descriptions, tags, and examplessecurity_schemes— How to authenticate (API key inx-api-keyheader)capabilities— Supported features (streaming, push notifications)
message/send
Send a message to the APL agent. The agent processes the message, executes the appropriate skill, and returns a task with the result.
Task States
| State | Meaning |
|---|---|
| completed | Skill executed successfully — check artifacts for results |
| failed | Skill execution failed — check status.message for error details |
| input-required | Agent needs more information — check status.message for guidance |
Option 1: DataPart (Recommended)
Send structured JSON data with a skill field for explicit routing, or omit it for auto-detection.
curl -X POST https://mcp.airport-pickups-london.com/a2a \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "message/send", "params": { "message": { "role": "user", "parts": [{ "type": "data", "mimeType": "application/json", "data": { "skill": "get_quote", "origin": "Heathrow", "destination": "W1K 1LN", "passengers": 2, "transfer_date": "2026-04-01", "transfer_time": "14:00" } }] } } }'
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "a1b2c3d4-...",
"status": { "state": "completed" },
"artifacts": [{
"name": "quote",
"parts": [{
"type": "data",
"mimeType": "application/json",
"data": {
"hub": "LHR",
"zone": "W1",
"direction": "from_hub",
"recommended_car_type": "Saloon",
"from_hub": [
{ "car_type": "Saloon", "price_gbp": 75, "max_passengers": 3 },
{ "car_type": "People Carrier", "price_gbp": 90, "max_passengers": 5 }
]
}
}]
}]
}
}
curl -X POST https://mcp.airport-pickups-london.com/a2a \ -H "Content-Type: application/json" \ -H "x-api-key: your-api-key" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "message/send", "params": { "message": { "role": "user", "parts": [{ "type": "data", "mimeType": "application/json", "data": { "skill": "create_booking", "origin": "Heathrow Terminal 5", "destination": "10 Downing Street, SW1A 2AA", "transfer_date": "2026-04-01", "transfer_time": "14:00", "passenger_name": "John Smith", "passenger_phone": "+447123456789", "passenger_email": "john@example.com", "passengers": 2, "car_type": "Saloon", "flight_number": "BA2534", "door_number": "10" } }] } } }'
create_booking skill creates real reservations. Always get a quote first and confirm with the end user before booking.Option 2: TextPart (Natural Language)
Send plain text. The agent will return input-required with the expected JSON schema.
{
"jsonrpc": "2.0",
"id": 3,
"method": "message/send",
"params": {
"message": {
"role": "user",
"parts": [{
"type": "text",
"text": "How much is a ride from Heathrow to central London?"
}]
}
}
}
Auto-Detection
If you omit the skill field from a DataPart, the agent auto-detects:
- Has
passenger_name? → routes tocreate_booking - Has
origin/destination? → routes toget_quote
tasks/get
Retrieve a previously created task by its ID. Tasks are stored in memory for 1 hour.
{
"jsonrpc": "2.0",
"id": 4,
"method": "tasks/get",
"params": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
Returns the full task object with status, artifacts, and history. Returns error code -32001 if the task is not found or has expired.
tasks/cancel
Cancel a task that is still in progress. Only tasks in submitted, working, or input-required states can be canceled.
{
"jsonrpc": "2.0",
"id": 5,
"method": "tasks/cancel",
"params": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
Returns the updated task with status.state: "canceled", or error code -32002 if the task has already completed.
A2A JSON-RPC Errors
A2A uses JSON-RPC 2.0 error codes. All error responses follow this format:
{
"jsonrpc": "2.0",
"error": { "code": -32601, "message": "Method not found: foo/bar" },
"id": 1
}
| Code | Name | Meaning |
|---|---|---|
| -32700 | Parse Error | Invalid JSON in request body |
| -32600 | Invalid Request | Missing jsonrpc: "2.0" or method |
| -32601 | Method Not Found | Unknown method (only message/send, tasks/get, tasks/cancel supported) |
| -32602 | Invalid Params | Missing or invalid parameters |
| -32603 | Internal Error | Server-side error |
| -32000 | Unauthorized | Missing or invalid API key |
| -32001 | Task Not Found | Task ID does not exist or has expired (1hr TTL) |
| -32002 | Task Not Cancelable | Task is already completed, failed, or canceled |
Agent Registration
- Email: info@airport-pickups-london.com
- Phone: 020 3988 2168
- WhatsApp: +44 7365 268 656
For new AI agents and developers, get an API key instantly by self-registering below. No approval required — your key is returned immediately. Self-registered agents use APL’s default booking account.
Public endpoint — no authentication needed. Rate limited to 3 registrations per IP per hour.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Your agent or company name |
email | string | Yes | Contact email (used for duplicate detection) |
url | string | No | Your website URL |
Example Request
{
"name": "TravelBot AI",
"email": "dev@travelbot.com",
"url": "https://travelbot.com"
}
Example Response (201 Created)
{
"agent_name": "TravelBot AI",
"api_key": "a1b2c3d4e5f6...",
"message": "API key created. Use this key in the x-api-key header for all A2A, REST API, and MCP requests."
}
/api/quote, /api/book), A2A protocol (/a2a), and MCP (/mcp).Corporate Account Registration
For travel agencies, AI platforms, and corporate clients who need monthly invoicing or credit accounts. Applications are reviewed by our team within 1–2 business days.
Public endpoint — no authentication needed. Rate limited to 3 per IP per hour. Your API key is issued but inactive until approved.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| Company Details | |||
company_name | string | Yes | Legal company name |
company_reg_number | string | No | Company registration number |
vat_number | string | No | VAT number |
company_address | string | No | Registered address |
| Contact | |||
contact_name | string | Yes | Primary contact name |
email | string | Yes | Contact email |
phone | string | No | Phone number |
accounts_payable_name | string | No | AP contact name |
accounts_payable_email | string | No | AP email for invoices |
| Commercial | |||
estimated_monthly_volume | integer | No | Expected monthly bookings |
estimated_monthly_spend | number | No | Expected monthly spend (£) |
preferred_vehicles | string | No | e.g. “Saloon, Executive, MPV” |
primary_routes | string | No | e.g. “Heathrow, Gatwick, Central London” |
| Billing | |||
billing_type | string | Yes | invoice or credit_account |
requested_credit_limit | number | No | Requested credit limit (£) — credit_account only |
payment_terms | integer | No | 14, 30, or 60 days (default: 30) |
url | string | No | Company website |
notes | string | No | Additional information |
Example Request
{
"company_name": "TravelTech AI Ltd",
"company_reg_number": "12345678",
"vat_number": "GB123456789",
"company_address": "100 Innovation Way, London EC2A 1NT",
"contact_name": "Sarah Johnson",
"email": "sarah@traveltech-ai.com",
"phone": "+44 20 7123 4567",
"accounts_payable_email": "ap@traveltech-ai.com",
"estimated_monthly_volume": 500,
"estimated_monthly_spend": 25000,
"preferred_vehicles": "Saloon, Executive, MPV",
"primary_routes": "Heathrow, Gatwick, Central London hotels",
"billing_type": "invoice",
"payment_terms": 30,
"url": "https://traveltech-ai.com"
}
Example Response (201 Created — Pending)
{
"status": "pending",
"company_name": "TravelTech AI Ltd",
"message": "Corporate account application received. Our team will review your application and contact you within 1-2 business days. Your API key will be activated upon approval.",
"contact": "corporate@aplcars.com"
}
- Our team reviews your application (1–2 business days)
- Upon approval, your API key is activated and billing type is set
- You receive an email with your API key and account details
- All bookings are invoiced monthly to your accounts payable contact
Error Handling
The API uses standard HTTP status codes. Error responses include a JSON body with an error field.
{
"error": "Missing required fields: transfer_date, passenger_name"
}
| Status | Meaning | Common Causes |
|---|---|---|
| 400 | Bad Request | Missing/invalid fields, location not found, no vehicles available |
| 401 | Unauthorized | Missing or invalid API key |
| 429 | Rate Limited | Too many requests — max 60/minute per IP |
| 500 | Server Error | Internal error — please retry or contact support |
Typical Integration Flow
- Get a quote — Call
POST /api/quotewith pickup, dropoff and date/time. Optionally includerequestedDiscountPercent(0–5%) for A2A pricing negotiation. - Show options — Display available car types and prices to your customer. If a discount was applied, the response includes
appliedDiscountPercent. - Collect details — Gather passenger name, phone, email, flight number (if airport pickup), and door number (if postcode destination)
- Validate flight (airport pickups) — Call
POST /api/validate-flightwith the flight number and date to verify the flight and auto-detect the terminal. Show the customer: “Your flight BA2534 (British Airways) arrives at Heathrow T5 at 14:30” - Create booking — Call
POST /api/bookwith all details and the chosen car type. The system automatically validates the flight number and registers the correct terminal and landing time. - Confirm to customer — Share the
booking_ref,flight_info, andmeeting_pointinstructions with your customer
Agency Portal
Manage your bookings, view reservation status, and track drivers through the agency portal:
https://agency.airport-pickups-london.com
Use the portal to:
- Search and view all your reservations
- Edit booking details and passenger information
- Track driver status in real time
- View booking history and invoices
Support
For API integration support, account setup, or technical issues:
- Email: info@aplcars.com
- Phone: +44 208 688 7744 (24 hours)
- WhatsApp: +44 7538 989360