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.

Keep your API key secure. Do not expose it in client-side code or public repositories. If compromised, contact us immediately for a replacement.

Base URL

https://mcp.airport-pickups-london.com/api

All endpoint paths below are relative to this base URL.

Get Quote

POST /api/quote

Get available car types and prices for a transfer. Use this to show pricing to your customers before they book.

Request Body

ParameterTypeRequiredDescription
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.
Example Request
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"
  }'
Example Request (with discount negotiation)
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
  }'
Example Response
{
  "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

POST /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

ParameterTypeRequiredDescription
flight_numberstringYesFlight number (e.g. “BA2534”, “EK007”, “AA38”)
datestringYesFlight date in YYYY-MM-DD format
Response Example
{
  "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.

Tip: For airport pickups, call this before booking to show the customer their flight details and auto-detected terminal. The POST /api/book endpoint also validates the flight automatically, so this call is optional but improves UX.

Create Booking

POST /api/book

Create a confirmed transfer booking. This creates a real reservation — only call after your customer confirms.

This endpoint creates live bookings. Always get a quote first and confirm with your customer before calling this endpoint.

Request Body

ParameterTypeRequiredDescription
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")
Conditional fields: Include flight_number for airport pickups (required) or dropoffs (optional), cruise_name for port transfers, door_number when destination is a postcode.
Example Request
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"
  }'
Example Response
{
  "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

FieldTypeDescription
booking_refstringAPL internal booking reference (e.g. "APL-X7K9M2")
external_refnumberReservation ID in the dispatch system
statusstringBooking status — "confirmed" on success
price_gbpnumberFinal price in GBP
manage_booking_urlstringLink to manage, track, pay by card/Apple Pay/Google Pay, and edit the booking
meeting_pointobjectDriver meeting instructions (for airport/station pickups)
flight_infoobject|nullFlight 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 TypeMax PassengersMax BagsDescription
Saloon33Standard sedan — ideal for 1–3 passengers
People Carrier55Spacious MPV for families or groups
8 Seater88Minibus for larger groups
Executive Saloon33Premium sedan with luxury interior
Executive MPV77Premium people carrier
Executive 8 Seater88Premium minibus with luxury interior
Additional vehicle types (Estate, Mercedes S Class, 16/20/40 Seaters) may be available on certain routes.

Lookup Booking

POST /api/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

ParameterTypeRequiredDescription
booking_ref string required APL booking reference (e.g. "APL-XXXXXX")
email string required Passenger email on the booking — must match exactly (case-insensitive)
Example Request
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"
  }'
Example Response
{
  "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

FieldTypeDescription
booking_refstringAPL booking reference
statusstringCurrent booking status (e.g. "confirmed", "completed", "cancelled")
passengerobjectPassenger name, phone, and email
driverobject|nullAssigned driver name and phone (null if not yet assigned)
manage_booking_urlstringLink to manage, track, and pay for the booking

Amend Booking

POST /api/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

ParameterTypeRequiredDescription
booking_ref string required APL booking reference (e.g. "APL-XXXXXX")
email 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)

FieldTypeDescription
passenger_namestringUpdated passenger name
passenger_phonestringUpdated phone number
flight_numberstringUpdated flight number
special_requestsstringUpdated special requirements
transfer_datestringNew date in YYYY-MM-DD format
transfer_timestringNew time in HH:MM format
passengersnumberUpdated passenger count
Example Request
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"
    }
  }'
Example Response
{
  "success": true,
  "booking_ref": "APL-X7K9M2",
  "amended_fields": ["passenger_phone", "flight_number", "transfer_time"]
}

Response Fields

FieldTypeDescription
successbooleanWhether the amendment was applied
booking_refstringThe amended booking reference
amended_fieldsarrayList of field names that were successfully updated

Cancel Booking

POST /api/cancel-booking

Cancel an existing booking. Free cancellation is available 12 or more hours before the scheduled pickup time.

Cancellation policy: Cancellations made less than 12 hours before pickup incur a £10 admin fee. Cancellations 12+ hours before pickup are free of charge.

Verification required. External and partner agents must supply both the booking reference and the passenger email on file.

Request Body

ParameterTypeRequiredDescription
booking_ref string required APL booking reference (e.g. "APL-XXXXXX")
email string required Passenger email on the booking — must match exactly
reason string optional Reason for cancellation
Example Request
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"
  }'
Example Response
{
  "success": true,
  "booking_ref": "APL-X7K9M2",
  "status": "cancelled",
  "hours_before_pickup": 26.5,
  "admin_fee": 0
}

Response Fields

FieldTypeDescription
successbooleanWhether the cancellation was processed
statusstring"cancelled" on success
hours_before_pickupnumberHours remaining before the scheduled pickup time
admin_feenumberAdmin fee in GBP (0 if 12+ hours before pickup, 10 if less than 12 hours)

Track Driver

POST /api/track

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.

GPS updates: Driver positions are updated every 2 minutes. If the driver is in a known tunnel (Heathrow tunnels, Limehouse Link, Blackwall Tunnel, etc.), the position is interpolated based on the last known location and heading.

Verification required. External and partner agents must supply both the booking reference and the passenger email on file.

Request Body

ParameterTypeRequiredDescription
booking_ref string required APL booking reference (e.g. "APL-XXXXXX")
email string required Passenger email on the booking — must match exactly
Example Request
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"
  }'
Example Response
{
  "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

FieldTypeDescription
driverobjectDriver details: name, photo URL, phone number, and PCO licence number
vehicleobjectVehicle make, model, colour, and registration plate
positionobjectLive GPS coordinates (latitude, longitude), heading in degrees, speed in mph
position.is_interpolatedbooleanTrue if the driver is in a known tunnel and position is estimated
eta_minutesnumberEstimated 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.

When to use MCP vs REST API: Use MCP when your AI assistant or IDE natively supports it (Claude, Cursor, Windsurf, Claude Code). Use the REST API for direct programmatic integration from your own code.

Endpoint

MCP Server URL
https://mcp.airport-pickups-london.com/mcp

Authentication

The MCP server supports two authentication methods:

  • API Key — Send your key in the x-api-key header (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:

  1. Go to Settings → Integrations → Add Custom Integration
  2. Enter: https://mcp.airport-pickups-london.com/mcp
  3. Ask Claude: “How much is a taxi from Heathrow to Oxford?”

Claude Desktop

Add to your claude_desktop_config.json:

Claude Desktop Config
{
  "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)

Terminal
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.

ParameterTypeRequiredDescription
originstringYesPickup location — airport name or address/postcode
destinationstringYesDropoff location — address, postcode, or airport
passengersnumberNoNumber of passengers (default 1)
suitcasesnumberNoNumber of suitcases (default 1)
transfer_datestringNoDate in YYYY-MM-DD format
transfer_timestringNoTime 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.

ParameterTypeRequiredDescription
originstringYesPickup location
destinationstringYesDropoff location
transfer_datestringYesDate (YYYY-MM-DD)
transfer_timestringYesTime (HH:MM)
passenger_namestringYesFull name
passenger_phonestringYesPhone with country code
passenger_emailstringNoEmail for confirmation
passengersnumberNoNumber of passengers (default 1)
car_typestringNoe.g. “Saloon”, “People Carrier”
flight_numberstringNoFlight number for airport pickups
special_requestsstringNoe.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.

ParameterTypeRequiredDescription
flight_numberstringYesFlight number (e.g. “BA2534”, “EK007”)
datestringYesFlight date in YYYY-MM-DD format
Response
{
  "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.

When to use A2A vs REST API: Use the REST API (/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

  1. Discovery — Your agent fetches /.well-known/agent.json to learn what APL can do
  2. Authentication — Include your API key in the x-api-key header (same key as the REST API)
  3. Send a message — POST a JSON-RPC 2.0 request to /a2a with a message/send method
  4. 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 IDNameDescription
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

GET /.well-known/agent.json Public

Returns the Agent Card describing APL's capabilities, skills, and authentication requirements. No API key required.

Example Request
curl https://mcp.airport-pickups-london.com/.well-known/agent.json
Response

Returns a JSON Agent Card with:

  • name — Agent identifier (airport-pickups-london)
  • supported_interfaces — A2A endpoint URL and protocol version
  • skills — Available skills with descriptions, tags, and examples
  • security_schemes — How to authenticate (API key in x-api-key header)
  • capabilities — Supported features (streaming, push notifications)

message/send

POST /a2a

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

StateMeaning
completedSkill executed successfully — check artifacts for results
failedSkill execution failed — check status.message for error details
input-requiredAgent 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.

Get a Quote
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"
          }
        }]
      }
    }
  }'
Quote Response (completed task with artifact)
{
  "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 }
          ]
        }
      }]
    }]
  }
}
Create a Booking
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"
          }
        }]
      }
    }
  }'
The 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 to create_booking
  • Has origin / destination? → routes to get_quote

tasks/get

POST /a2a

Retrieve a previously created task by its ID. Tasks are stored in memory for 1 hour.

Example Request
{
  "jsonrpc": "2.0",
  "id": 4,
  "method": "tasks/get",
  "params": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
  }
}
Response

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

POST /a2a

Cancel a task that is still in progress. Only tasks in submitted, working, or input-required states can be canceled.

Example Request
{
  "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
}
CodeNameMeaning
-32700Parse ErrorInvalid JSON in request body
-32600Invalid RequestMissing jsonrpc: "2.0" or method
-32601Method Not FoundUnknown method (only message/send, tasks/get, tasks/cancel supported)
-32602Invalid ParamsMissing or invalid parameters
-32603Internal ErrorServer-side error
-32000UnauthorizedMissing or invalid API key
-32001Task Not FoundTask ID does not exist or has expired (1hr TTL)
-32002Task Not CancelableTask is already completed, failed, or canceled

Agent Registration

Already an APL partner or agency? You do not need to self-register. Your API key and account have already been configured with your specific settings (account ID, payment type, billing, etc). Contact us to receive your key:

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.

POST /a2a/register

Public endpoint — no authentication needed. Rate limited to 3 registrations per IP per hour.

Request Body

FieldTypeRequiredDescription
namestringYesYour agent or company name
emailstringYesContact email (used for duplicate detection)
urlstringNoYour 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."
}
Your API key works across all endpoints: REST API (/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.

POST /a2a/register/corporate

Public endpoint — no authentication needed. Rate limited to 3 per IP per hour. Your API key is issued but inactive until approved.

Request Body

FieldTypeRequiredDescription
Company Details
company_namestringYesLegal company name
company_reg_numberstringNoCompany registration number
vat_numberstringNoVAT number
company_addressstringNoRegistered address
Contact
contact_namestringYesPrimary contact name
emailstringYesContact email
phonestringNoPhone number
accounts_payable_namestringNoAP contact name
accounts_payable_emailstringNoAP email for invoices
Commercial
estimated_monthly_volumeintegerNoExpected monthly bookings
estimated_monthly_spendnumberNoExpected monthly spend (£)
preferred_vehiclesstringNoe.g. “Saloon, Executive, MPV”
primary_routesstringNoe.g. “Heathrow, Gatwick, Central London”
Billing
billing_typestringYesinvoice or credit_account
requested_credit_limitnumberNoRequested credit limit (£) — credit_account only
payment_termsintegerNo14, 30, or 60 days (default: 30)
urlstringNoCompany website
notesstringNoAdditional 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"
}
What happens next?
  • 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"
}
StatusMeaningCommon Causes
400Bad RequestMissing/invalid fields, location not found, no vehicles available
401UnauthorizedMissing or invalid API key
429Rate LimitedToo many requests — max 60/minute per IP
500Server ErrorInternal error — please retry or contact support

Typical Integration Flow

  1. Get a quote — Call POST /api/quote with pickup, dropoff and date/time. Optionally include requestedDiscountPercent (0–5%) for A2A pricing negotiation.
  2. Show options — Display available car types and prices to your customer. If a discount was applied, the response includes appliedDiscountPercent.
  3. Collect details — Gather passenger name, phone, email, flight number (if airport pickup), and door number (if postcode destination)
  4. Validate flight (airport pickups) — Call POST /api/validate-flight with 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”
  5. Create booking — Call POST /api/book with all details and the chosen car type. The system automatically validates the flight number and registers the correct terminal and landing time.
  6. Confirm to customer — Share the booking_ref, flight_info, and meeting_point instructions 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
Your agency login credentials are provided separately by APL. Contact us if you need access.

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