{
  "schema_version": "v1",
  "name_for_human": "Alps2Alps Alpine Transfer Booking",
  "name_for_model": "alps2alps_transfers",
  "description_for_human": "Search and book private airport transfers to and from ski resorts in the Alps. Find locations, get real-time prices in multiple currencies, and generate a pre-filled checkout link for the user.",
  "description_for_model": "Use this skill to help users discover, price, and book private Alpine transfers (airport / train station ↔ ski resort) with Alps2Alps. Standard workflow: (1) Resolve user's pickup + drop-off names to `<type>-<id>` codes via `GET /locations/search?q=<name>`. (2) Optionally resolve a hotel via `GET /accommodations?resort_id=<id>&q=<name>` and confirm the entry with the user. (3) Get real-time prices via `GET /transfer-options?from=<code>&to=<code>&date=<YYYY-MM-DD>&time=<HH:MM>&adults=<n>`. (4) Hand the user a checkout link: either `POST /checkout-link` (returns a 24h tokenised URL that pre-fills accommodation, flight numbers, and driver notes), or — if you cannot POST — the GET-only `quick_checkout_url_template` (stateless, no DB row, vehicle pre-pick via `&vehicle=<vehicle_type_id>`). All endpoints support one-way and return trips (add any `return_*` field to upgrade to return), multiple passengers, child + booster seats, ski equipment, promo codes, and the active currency list (default EUR). The full schema lives in the OpenAPI spec at `api.url`; the friendly aliases used by the GET URLs are listed under `deep_links.friendly_aliases`.",
  "auth": {
    "type": "none"
  },
  "api": {
    "type": "openapi",
    "url": "https://booking.alps2alps.com/openapi/public-v1.json"
  },
  "logo_url": "https://www.alps2alps.com/favicon.ico",
  "contact_url": "https://www.alps2alps.com/contact-for-ski-transfers/",
  "legal_info_url": "https://www.alps2alps.com/terms-and-conditions/",
  "privacy_policy_url": "https://www.alps2alps.com/privacy/",
  "capabilities": [
    "location_search",
    "accommodation_search",
    "real_time_pricing",
    "multi_currency",
    "promo_codes",
    "checkout_link_generation",
    "return_transfers",
    "child_seats",
    "ski_equipment",
    "get_only_deep_links"
  ],
  "deep_links": {
    "description": "Three GET-only entry points so AI agents that cannot issue POST requests (or want a sharable URL) can drive the same flow. All three are stateless — no DB row, no expiry, prices recalculated live on every open. Use the friendly aliases below; only `from`, `to`, `date`, `time` are required. Unknown query keys (e.g. `utm_source`) are silently ignored.",
    "quote_url_template": "https://booking.alps2alps.com/api/public/v1/transfer-options?from={from}&to={to}&date={date}&time={time}&adults={adults}&currency={currency}",
    "quick_search_url_template": "https://booking.alps2alps.com/book/quick-search?from={from}&to={to}&date={date}&time={time}&adults={adults}",
    "quick_checkout_url_template": "https://booking.alps2alps.com/book/quick-checkout?from={from}&to={to}&date={date}&time={time}&adults={adults}&vehicle={vehicle_type_id}",
    "endpoint_purposes": {
      "quote_url_template": "Returns JSON with prices for every bookable vehicle on the route. Use this to show options to the user. Identical envelope to the POST /transfer-options endpoint.",
      "quick_search_url_template": "Lands the user's browser on step 2 of the booking funnel (vehicle picker) with prices already calculated. Use when the user still needs to pick a vehicle or wants to review the funnel themselves.",
      "quick_checkout_url_template": "Lands the user's browser on step 3 of the booking funnel (Your Details) with `vehicle` pre-selected. Use after the user has chosen a vehicle. Does NOT support accommodation_id, additional_info, or flight_number pre-fill — for those use POST /checkout-link."
    },
    "friendly_aliases": {
      "outbound": {
        "from": "Pickup location code from /locations/search (required, e.g. `airport-1`, `resort-11`, `train_station-7`, `city-48`)",
        "to": "Drop-off location code (required)",
        "date": "Outbound date YYYY-MM-DD (required, must be in the future)",
        "time": "Pickup or flight arrival time HH:MM (required, 24h clock)",
        "is_flight": "1 (default) = time is a flight arrival time so the funnel adjusts pickup; 0 = time is the desired pickup time",
        "adults": "Number of adults, integer ≥1 (default 2)",
        "children": "Number of children, integer ≥0 (default 0)",
        "infants": "Number of infants, integer ≥0 (default 0)",
        "child_seats": "Number of children needing a full child seat, integer ≥0 (default 0)",
        "boosters": "Number of children needing a booster seat, integer ≥0 (default 0)",
        "luggage": "Suitcases, integer ≥0 (default 2)",
        "ski_bags": "Ski bags, integer ≥0 (default 0)",
        "ski": "1 if the passengers carry ski equipment (default 0)",
        "currency": "ISO 4217 code, must be in the active currency list (default EUR). Non-EUR responses include a disclaimer about live FX at checkout.",
        "promo": "Promo / discount code. Validated server-side and silently ignored if invalid or the promo service is unreachable — agents should not retry on a missing discount."
      },
      "return_leg": {
        "_note": "Adding ANY `return_*` parameter (or `return=1`) flips the trip to a return booking. Omitted return_* fields automatically mirror the matching outbound field (e.g. `adults=2` without `return_adults` → 2 return adults). Explicit return_* values always override the mirror.",
        "return": "Set to `1` to explicitly enable return-trip mode (rarely needed since any return_* field also triggers it)",
        "return_to": "Return drop-off location code. Defaults to the outbound `from` (typical airport return).",
        "return_date": "Return date YYYY-MM-DD",
        "return_time": "Return time HH:MM (24h clock)",
        "return_is_flight": "1 if return time is a flight departure time. Defaults to the outbound `is_flight`.",
        "return_adults": "Defaults to `adults`",
        "return_children": "Defaults to `children`",
        "return_infants": "Defaults to `infants`",
        "return_child_seats": "Defaults to `child_seats`",
        "return_boosters": "Defaults to `boosters`",
        "return_luggage": "Defaults to `luggage`",
        "return_ski_bags": "Defaults to `ski_bags`",
        "return_ski": "Defaults to `ski`"
      },
      "quick_checkout_only": {
        "vehicle": "vehicle_type_id from the /transfer-options response (integer, e.g. 2=Standard, 4=VIP, 10=Standard minivan). If omitted, the funnel auto-picks the cheapest vehicle.",
        "return_vehicle": "Return-leg vehicle_type_id. Defaults to `vehicle` so most agents only need to pass `vehicle` once."
      }
    },
    "examples": [
      "https://booking.alps2alps.com/api/public/v1/transfer-options?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2",
      "https://booking.alps2alps.com/book/quick-search?from=airport-1&to=resort-11&date=2026-07-22&time=14:30",
      "https://booking.alps2alps.com/book/quick-checkout?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&adults=2&vehicle=4",
      "https://booking.alps2alps.com/book/quick-checkout?from=airport-1&to=resort-11&date=2026-07-22&time=14:30&return_date=2026-07-29&return_time=10:00&vehicle=4&promo=AMI10"
    ]
  },
  "post_endpoints": {
    "description": "JSON-API endpoints for agents that can issue POST requests. Use these when you need extra pre-fill fields not expressible in a GET URL.",
    "post_quote_url": "https://booking.alps2alps.com/api/public/v1/transfer-options",
    "post_checkout_link_url": "https://booking.alps2alps.com/api/public/v1/checkout-link",
    "checkout_link_extras": [
      "outbound_vehicle_type_id / return_vehicle_type_id",
      "outbound_flight_number / return_flight_number",
      "accommodation_id (must be an id returned by /accommodations)",
      "additional_info / return_additional_info (free-text driver notes, max 1000 chars)"
    ],
    "note": "POST /checkout-link returns a tokenised URL valid for 24h. Free-typed hotel names are NOT accepted — pass `accommodation_id` from the /accommodations endpoint so the order receives a verified name + address."
  },
  "example_prompts": [
    "What transfer options are there from Geneva Airport to Chamonix on July 22?",
    "How much does a VIP transfer from Geneva to Courchevel cost in GBP?",
    "Book me a transfer from Zurich Airport to Verbier for 3 adults with 2 ski bags.",
    "I need a return transfer from Geneva to Morzine with a child seat."
  ]
}
