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 [email protected] 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.
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 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..."
  }
}

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 for airport transfers (e.g. "BA2534"). Enables flight tracking.
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 transfers, 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": "[email protected]",
    "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": "[email protected]"
  },
  "duration": "51 minutes",
  "meeting_point": {
    "name": "Heathrow T5",
    "instructions": "Our driver will hold a board with your name inside the terminal..."
  },
  "message": "Booking confirmed."
}

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
meeting_pointobjectDriver meeting instructions (for airport/station pickups)

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.

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

Two 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”

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": "[email protected]",
            "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": "[email protected]",
  "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).

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
  2. Show options — Display available car types and prices to your customer
  3. Collect details — Gather passenger name, phone, email, flight number (if airport), and door number (if postcode destination)
  4. Create booking — Call POST /api/book with all details and the chosen car type
  5. Confirm to customer — Share the booking_ref 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: