{
  "info": {
    "_postman_id": "6677dbc0-ec76-5eec-9340-eda6d97b6ba2",
    "name": "TransferPlatform Partner API (v1)",
    "description": "Search → recheck → book → booking details → cancel. Select the Sandbox environment, set apiKey, then run the folders in order. See postman/README.md.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "apikey",
    "apikey": [
      {
        "key": "key",
        "value": "X-API-Key",
        "type": "string"
      },
      {
        "key": "value",
        "value": "{{apiKey}}",
        "type": "string"
      },
      {
        "key": "in",
        "value": "header",
        "type": "string"
      }
    ]
  },
  "item": [
    {
      "id": "8669831d-b802-5b2f-9bb3-8893617f74b1",
      "name": "0. Health",
      "description": "No API key needed.",
      "item": [
        {
          "id": "b06943dd-1c11-5bd8-ad8d-d655f71e95bf",
          "name": "Health",
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/health",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "health"
              ]
            },
            "description": "",
            "auth": {
              "type": "noauth"
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));"
                ]
              }
            }
          ],
          "response": []
        }
      ]
    },
    {
      "id": "c0f940b1-a297-558d-a298-e1dbdb00de4d",
      "name": "1. Search",
      "description": "Run ONE search, then continue with 2. Recheck. Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
      "item": [
        {
          "id": "f33d7495-9d70-54a8-b5cf-316472f15c7d",
          "name": "Search: airport arrival",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/search",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "search"
              ]
            },
            "description": "Airport → hotel. Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transfer_type\": \"airport\",\n  \"iata\": \"BOM\",\n  \"airport_name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n  \"place\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\"\n  },\n  \"adults\": 2,\n  \"currency\": \"INR\",\n  \"source_type\": \"air\",\n  \"arrival_date\": \"{{arrivalDate}}\",\n  \"arrival_time\": \"10:30\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Future dates so the examples never go stale: +30 days (and +33 for the return / departure).",
                  "const d = (days) => { const t = new Date(Date.now() + days * 86400000); return t.toISOString().slice(0, 10); };",
                  "pm.collectionVariables.set('arrivalDate', d(30));",
                  "pm.collectionVariables.set('pickupDate', d(30));",
                  "pm.collectionVariables.set('departureDate', d(33));",
                  "pm.collectionVariables.set('returnDate', d(33));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offers is an array', () => pm.expect(res.offers).to.be.an('array'));",
                  "if (res.errors && res.errors.length) { console.log('provider errors', JSON.stringify(res.errors)); }",
                  "// Pick the offer to carry forward: an offer of preferredProvider (optional) first, otherwise the cheapest offer.",
                  "const preferred = (pm.environment.get('preferredProvider') || '').toLowerCase();",
                  "const candidates = res.offers || [];",
                  "const offer = candidates.find(o => preferred && o.provider === preferred) || candidates[0];",
                  "pm.test('an offer was found', () => pm.expect(offer, 'no offer in the response').to.exist);",
                  "if (offer) {",
                  "  pm.collectionVariables.set('offerProvider', offer.provider);",
                  "  pm.collectionVariables.set('offerRateKey', offer.rate_key);",
                  "  pm.collectionVariables.set('offerToken', offer.offer_token);",
                  "  pm.collectionVariables.set('offerFlightInfoRequired', String(offer.flight_info_required));",
                  "  console.log('carrying offer', offer.provider, offer.rate_key, offer.price.total, offer.price.currency);",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "3da2d66e-d76c-563f-b8bc-c8ee1b5c6943",
              "name": "Airport arrival",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/search",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "search"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transfer_type\": \"airport\",\n  \"iata\": \"BOM\",\n  \"airport_name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n  \"place\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\"\n  },\n  \"adults\": 2,\n  \"currency\": \"INR\",\n  \"source_type\": \"air\",\n  \"arrival_date\": \"{{arrivalDate}}\",\n  \"arrival_time\": \"10:30\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"request_id\": \"3e51940a-7b52-5ffe-a1c2-f7604038365d\",\n  \"transfer_type\": \"airport\",\n  \"offers\": [\n    {\n      \"provider\": \"provider_d\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"offer_id\": \"1421a5071cc20000\",\n      \"rate_key\": \"7\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 1317.0,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"AC SUV Large\",\n        \"model\": \"Ertiga or similar\",\n        \"image_url\": \"https://images.example.com/vehicles/ac-suv-large.png\",\n        \"max_passengers\": 6,\n        \"max_bags\": 2\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_c\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"offer_id\": \"9f0f189773d3b1c7\",\n      \"rate_key\": \"F6879023\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 1462.33,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Sedan Hyundai Xcent or Similar 2018\",\n        \"model\": \"Sedan Hyundai Xcent or Similar 2018\",\n        \"image_url\": \"https://images.example.com/vehicles/sedan-hyundai-xcent-or-similar-2018.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": 25,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_a\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"offer_id\": \"0f48d65d40e92602\",\n      \"rate_key\": \"d320deaaed65343ed2a5b8fac337a7dd\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 2508.37,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Sedan\",\n        \"model\": \"Corolla\",\n        \"image_url\": \"https://images.example.com/vehicles/sedan.png\",\n        \"max_passengers\": 3,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": 45,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"100% refund if cancelled at least 24h before pickup\",\n      \"flight_info_required\": true,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_b\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"offer_id\": \"7f85ef6fe033b526\",\n      \"rate_key\": \"1902\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 16104.46,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"economy\",\n        \"model\": \"Toyota Prius\",\n        \"image_url\": \"https://images.example.com/vehicles/economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    }\n  ],\n  \"errors\": [],\n  \"meta\": {\n    \"providers\": [\n      \"provider_a\",\n      \"provider_b\",\n      \"provider_c\",\n      \"provider_d\"\n    ],\n    \"directions\": [\n      \"arrival\"\n    ],\n    \"skipped_providers\": {},\n    \"offer_count\": 39,\n    \"sort\": \"price_asc\",\n    \"currencies\": [\n      \"INR\"\n    ]\n  }\n}"
            }
          ]
        },
        {
          "id": "810addb2-daab-5b1f-9b21-4fa9a6d2f103",
          "name": "Search: airport departure",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/search",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "search"
              ]
            },
            "description": "Hotel → airport. Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transfer_type\": \"airport\",\n  \"iata\": \"BOM\",\n  \"airport_name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n  \"place\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\"\n  },\n  \"adults\": 2,\n  \"currency\": \"INR\",\n  \"source_type\": \"hotel\",\n  \"arrival_date\": \"{{arrivalDate}}\",\n  \"arrival_time\": \"07:00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Future dates so the examples never go stale: +30 days (and +33 for the return / departure).",
                  "const d = (days) => { const t = new Date(Date.now() + days * 86400000); return t.toISOString().slice(0, 10); };",
                  "pm.collectionVariables.set('arrivalDate', d(30));",
                  "pm.collectionVariables.set('pickupDate', d(30));",
                  "pm.collectionVariables.set('departureDate', d(33));",
                  "pm.collectionVariables.set('returnDate', d(33));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offers is an array', () => pm.expect(res.offers).to.be.an('array'));",
                  "if (res.errors && res.errors.length) { console.log('provider errors', JSON.stringify(res.errors)); }",
                  "// Pick the offer to carry forward: an offer of preferredProvider (optional) first, otherwise the cheapest offer.",
                  "const preferred = (pm.environment.get('preferredProvider') || '').toLowerCase();",
                  "const candidates = res.offers || [];",
                  "const offer = candidates.find(o => preferred && o.provider === preferred) || candidates[0];",
                  "pm.test('an offer was found', () => pm.expect(offer, 'no offer in the response').to.exist);",
                  "if (offer) {",
                  "  pm.collectionVariables.set('offerProvider', offer.provider);",
                  "  pm.collectionVariables.set('offerRateKey', offer.rate_key);",
                  "  pm.collectionVariables.set('offerToken', offer.offer_token);",
                  "  pm.collectionVariables.set('offerFlightInfoRequired', String(offer.flight_info_required));",
                  "  console.log('carrying offer', offer.provider, offer.rate_key, offer.price.total, offer.price.currency);",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "608582e0-06b7-566c-b4e5-4d115b46d8c2",
              "name": "Airport departure",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/search",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "search"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transfer_type\": \"airport\",\n  \"iata\": \"BOM\",\n  \"airport_name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n  \"place\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\"\n  },\n  \"adults\": 2,\n  \"currency\": \"INR\",\n  \"source_type\": \"hotel\",\n  \"arrival_date\": \"{{arrivalDate}}\",\n  \"arrival_time\": \"07:00\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"request_id\": \"8f6e8857-b25a-5ecc-83b4-4c41115ee1aa\",\n  \"transfer_type\": \"airport\",\n  \"offers\": [\n    {\n      \"provider\": \"provider_d\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"departure\",\n      \"offer_id\": \"1b991a806a1c4703\",\n      \"rate_key\": \"7\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 1058.0,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"AC SUV Large\",\n        \"model\": \"Ertiga or similar\",\n        \"image_url\": \"https://images.example.com/vehicles/ac-suv-large.png\",\n        \"max_passengers\": 6,\n        \"max_bags\": 2\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_c\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"departure\",\n      \"offer_id\": \"f63e512b6b082487\",\n      \"rate_key\": \"F6879023\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 1462.33,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Sedan Hyundai Xcent or Similar 2018\",\n        \"model\": \"Sedan Hyundai Xcent or Similar 2018\",\n        \"image_url\": \"https://images.example.com/vehicles/sedan-hyundai-xcent-or-similar-2018.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": 25,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_a\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"departure\",\n      \"offer_id\": \"bab783b92153cac8\",\n      \"rate_key\": \"a90e73d54f9d804b2038c637ceb6f193\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 2414.84,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Sedan\",\n        \"model\": \"Corolla\",\n        \"image_url\": \"https://images.example.com/vehicles/sedan.png\",\n        \"max_passengers\": 3,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": 45,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"100% refund if cancelled at least 24h before pickup\",\n      \"flight_info_required\": true,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_b\",\n      \"transfer_type\": \"airport\",\n      \"direction\": \"departure\",\n      \"offer_id\": \"a1e1889785353ddf\",\n      \"rate_key\": \"1902\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 15782.44,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"economy\",\n        \"model\": \"Toyota Prius\",\n        \"image_url\": \"https://images.example.com/vehicles/economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": null,\n      \"pickup_datetime\": null,\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": null,\n      \"included_waiting_minutes\": null\n    }\n  ],\n  \"errors\": [],\n  \"meta\": {\n    \"providers\": [\n      \"provider_a\",\n      \"provider_b\",\n      \"provider_c\",\n      \"provider_d\"\n    ],\n    \"directions\": [\n      \"departure\"\n    ],\n    \"skipped_providers\": {},\n    \"offer_count\": 39,\n    \"sort\": \"price_asc\",\n    \"currencies\": [\n      \"INR\"\n    ]\n  }\n}"
            }
          ]
        },
        {
          "id": "f112f063-4ce3-5281-b199-f7146c7f9458",
          "name": "Search: airport both directions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/search",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "search"
              ]
            },
            "description": "Arrival and departure legs in one search. Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transfer_type\": \"airport\",\n  \"iata\": \"BOM\",\n  \"airport_name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n  \"place\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\"\n  },\n  \"adults\": 2,\n  \"currency\": \"INR\",\n  \"source_type\": \"air\",\n  \"arrival_date\": \"{{arrivalDate}}\",\n  \"arrival_time\": \"10:30\",\n  \"departure_date\": \"{{departureDate}}\",\n  \"departure_time\": \"06:00\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Future dates so the examples never go stale: +30 days (and +33 for the return / departure).",
                  "const d = (days) => { const t = new Date(Date.now() + days * 86400000); return t.toISOString().slice(0, 10); };",
                  "pm.collectionVariables.set('arrivalDate', d(30));",
                  "pm.collectionVariables.set('pickupDate', d(30));",
                  "pm.collectionVariables.set('departureDate', d(33));",
                  "pm.collectionVariables.set('returnDate', d(33));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offers is an array', () => pm.expect(res.offers).to.be.an('array'));",
                  "if (res.errors && res.errors.length) { console.log('provider errors', JSON.stringify(res.errors)); }",
                  "// Pick the offer to carry forward: an offer of preferredProvider (optional) first, otherwise the cheapest offer.",
                  "const preferred = (pm.environment.get('preferredProvider') || '').toLowerCase();",
                  "const candidates = res.offers || [];",
                  "const offer = candidates.find(o => preferred && o.provider === preferred) || candidates[0];",
                  "pm.test('an offer was found', () => pm.expect(offer, 'no offer in the response').to.exist);",
                  "if (offer) {",
                  "  pm.collectionVariables.set('offerProvider', offer.provider);",
                  "  pm.collectionVariables.set('offerRateKey', offer.rate_key);",
                  "  pm.collectionVariables.set('offerToken', offer.offer_token);",
                  "  pm.collectionVariables.set('offerFlightInfoRequired', String(offer.flight_info_required));",
                  "  console.log('carrying offer', offer.provider, offer.rate_key, offer.price.total, offer.price.currency);",
                  "}"
                ]
              }
            }
          ],
          "response": []
        },
        {
          "id": "0e86d3b1-a639-51a6-916e-e4321be9abf0",
          "name": "Search: point-to-point one way",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/search",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "search"
              ]
            },
            "description": "Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transfer_type\": \"point_to_point\",\n  \"pickup\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n    \"city\": \"Mumbai\",\n    \"country_code\": \"IN\"\n  },\n  \"dropoff\": {\n    \"lat\": 18.5308,\n    \"lng\": 73.8475,\n    \"name\": \"Shivajinagar\",\n    \"address\": \"Shivajinagar, Pune, Maharashtra 411005\",\n    \"city\": \"Pune\",\n    \"country_code\": \"IN\"\n  },\n  \"pickup_date\": \"{{pickupDate}}\",\n  \"pickup_time\": \"09:00\",\n  \"adults\": 2,\n  \"currency\": \"INR\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Future dates so the examples never go stale: +30 days (and +33 for the return / departure).",
                  "const d = (days) => { const t = new Date(Date.now() + days * 86400000); return t.toISOString().slice(0, 10); };",
                  "pm.collectionVariables.set('arrivalDate', d(30));",
                  "pm.collectionVariables.set('pickupDate', d(30));",
                  "pm.collectionVariables.set('departureDate', d(33));",
                  "pm.collectionVariables.set('returnDate', d(33));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offers is an array', () => pm.expect(res.offers).to.be.an('array'));",
                  "if (res.errors && res.errors.length) { console.log('provider errors', JSON.stringify(res.errors)); }",
                  "// Pick the offer to carry forward: an offer of preferredProvider (optional) first, otherwise the cheapest offer.",
                  "const preferred = (pm.environment.get('preferredProvider') || '').toLowerCase();",
                  "const candidates = res.offers || [];",
                  "const offer = candidates.find(o => preferred && o.provider === preferred) || candidates[0];",
                  "pm.test('an offer was found', () => pm.expect(offer, 'no offer in the response').to.exist);",
                  "if (offer) {",
                  "  pm.collectionVariables.set('offerProvider', offer.provider);",
                  "  pm.collectionVariables.set('offerRateKey', offer.rate_key);",
                  "  pm.collectionVariables.set('offerToken', offer.offer_token);",
                  "  pm.collectionVariables.set('offerFlightInfoRequired', String(offer.flight_info_required));",
                  "  console.log('carrying offer', offer.provider, offer.rate_key, offer.price.total, offer.price.currency);",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "a9648165-40db-554e-8778-571ecfb8c310",
              "name": "Point-to-point one way",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/search",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "search"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transfer_type\": \"point_to_point\",\n  \"pickup\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n    \"city\": \"Mumbai\",\n    \"country_code\": \"IN\"\n  },\n  \"dropoff\": {\n    \"lat\": 18.5308,\n    \"lng\": 73.8475,\n    \"name\": \"Shivajinagar\",\n    \"address\": \"Shivajinagar, Pune, Maharashtra 411005\",\n    \"city\": \"Pune\",\n    \"country_code\": \"IN\"\n  },\n  \"pickup_date\": \"{{pickupDate}}\",\n  \"pickup_time\": \"09:00\",\n  \"adults\": 2,\n  \"currency\": \"INR\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"request_id\": \"3d1f5d4d-3ca1-526c-8960-cb70c96434b8\",\n  \"transfer_type\": \"point_to_point\",\n  \"offers\": [\n    {\n      \"provider\": \"provider_d\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"38b24db1cfc7558b\",\n      \"rate_key\": \"3\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 2266.0,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"AC Economy\",\n        \"model\": \"Wagon R or Equivalent\",\n        \"image_url\": \"https://images.example.com/vehicles/ac-economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 1\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"Free cancellation until 6h before pickup; later: INR 500 or 20% of the booking amount, whichever is less\",\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T09:00\",\n      \"pricing_model\": \"outstation_package\",\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": \"oneWay\",\n        \"label\": \"Outstation (150 km)\"\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": {\n          \"amount\": 18.0,\n          \"currency\": \"INR\"\n        },\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"inclusions\": {\n        \"tolls\": true,\n        \"state_tax\": true,\n        \"parking\": false,\n        \"driver_allowance\": true,\n        \"gratuity\": false,\n        \"included\": [\n          \"Fuel Charges\",\n          \"Driver Allowance\",\n          \"Toll / State tax\",\n          \"GST (5%)\"\n        ],\n        \"excluded\": [\n          \"Pay INR 18/km after 150 km\",\n          \"Multiple pickups/drops\",\n          \"Airport Entry/Parking\"\n        ]\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 6.0,\n        \"rules\": [],\n        \"policy_text\": \"Free cancellation until 6h before pickup; later: INR 500 or 20% of the booking amount, whichever is less\"\n      },\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_a\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"68453f24193fab43\",\n      \"rate_key\": \"3f3526b8a0171ac988390429eb820d27\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 3962.65,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Bus\",\n        \"model\": null,\n        \"image_url\": \"https://images.example.com/vehicles/bus.png\",\n        \"max_passengers\": 15,\n        \"max_bags\": 1\n      },\n      \"duration_minutes\": 195,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"100% refund if cancelled at least 4h before pickup\",\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T09:00\",\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 4.0,\n        \"rules\": [\n          {\n            \"hours_before_pickup\": 4.0,\n            \"refund_percent\": 100.0\n          }\n        ],\n        \"policy_text\": \"100% refund if cancelled at least 4h before pickup\"\n      },\n      \"included_waiting_minutes\": 30\n    },\n    {\n      \"provider\": \"provider_b\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"31474d69768dac75\",\n      \"rate_key\": \"1902\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 51795.83,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"economy\",\n        \"model\": \"Toyota Prius\",\n        \"image_url\": \"https://images.example.com/vehicles/economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T09:00\",\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": {\n        \"tolls\": true,\n        \"state_tax\": null,\n        \"parking\": null,\n        \"driver_allowance\": null,\n        \"gratuity\": true,\n        \"included\": [],\n        \"excluded\": []\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 3.0,\n        \"rules\": [],\n        \"policy_text\": null\n      },\n      \"included_waiting_minutes\": 15\n    }\n  ],\n  \"errors\": [\n    {\n      \"provider\": \"provider_c\",\n      \"code\": \"provider_error\",\n      \"message\": \"Provider search failed\",\n      \"raw\": {\n        \"leg\": \"outbound\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"providers\": [\n      \"provider_a\",\n      \"provider_b\",\n      \"provider_c\",\n      \"provider_d\"\n    ],\n    \"legs\": [\n      \"outbound\"\n    ],\n    \"searches\": [\n      {\n        \"provider\": \"provider_a\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_b\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_c\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_d\",\n        \"leg\": \"outbound\"\n      }\n    ],\n    \"skipped_providers\": {},\n    \"offer_count\": 22,\n    \"sort\": \"price_asc\",\n    \"currencies\": [\n      \"INR\"\n    ],\n    \"trip_type\": \"one_way\"\n  }\n}"
            }
          ]
        },
        {
          "id": "406e99de-0d4f-556c-b8b3-5b93fbb132ea",
          "name": "Search: point-to-point round trip",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/search",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "search"
              ]
            },
            "description": "Offers per leg (outbound, return, round_trip). Book one leg at a time. Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transfer_type\": \"point_to_point\",\n  \"trip_type\": \"round_trip\",\n  \"pickup\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n    \"city\": \"Mumbai\",\n    \"country_code\": \"IN\"\n  },\n  \"dropoff\": {\n    \"lat\": 18.5308,\n    \"lng\": 73.8475,\n    \"name\": \"Shivajinagar\",\n    \"address\": \"Shivajinagar, Pune, Maharashtra 411005\",\n    \"city\": \"Pune\",\n    \"country_code\": \"IN\"\n  },\n  \"pickup_date\": \"{{pickupDate}}\",\n  \"pickup_time\": \"09:00\",\n  \"return_date\": \"{{returnDate}}\",\n  \"return_time\": \"18:00\",\n  \"adults\": 2,\n  \"currency\": \"INR\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Future dates so the examples never go stale: +30 days (and +33 for the return / departure).",
                  "const d = (days) => { const t = new Date(Date.now() + days * 86400000); return t.toISOString().slice(0, 10); };",
                  "pm.collectionVariables.set('arrivalDate', d(30));",
                  "pm.collectionVariables.set('pickupDate', d(30));",
                  "pm.collectionVariables.set('departureDate', d(33));",
                  "pm.collectionVariables.set('returnDate', d(33));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offers is an array', () => pm.expect(res.offers).to.be.an('array'));",
                  "if (res.errors && res.errors.length) { console.log('provider errors', JSON.stringify(res.errors)); }",
                  "// Pick the offer to carry forward: an offer of preferredProvider (optional) first, otherwise the cheapest offer.",
                  "const preferred = (pm.environment.get('preferredProvider') || '').toLowerCase();",
                  "const candidates = res.offers || [];",
                  "const offer = candidates.find(o => preferred && o.provider === preferred) || candidates[0];",
                  "pm.test('an offer was found', () => pm.expect(offer, 'no offer in the response').to.exist);",
                  "if (offer) {",
                  "  pm.collectionVariables.set('offerProvider', offer.provider);",
                  "  pm.collectionVariables.set('offerRateKey', offer.rate_key);",
                  "  pm.collectionVariables.set('offerToken', offer.offer_token);",
                  "  pm.collectionVariables.set('offerFlightInfoRequired', String(offer.flight_info_required));",
                  "  console.log('carrying offer', offer.provider, offer.rate_key, offer.price.total, offer.price.currency);",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "9055422e-906c-5e76-a1e9-28676f0e7851",
              "name": "Point-to-point round trip",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/search",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "search"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transfer_type\": \"point_to_point\",\n  \"trip_type\": \"round_trip\",\n  \"pickup\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n    \"city\": \"Mumbai\",\n    \"country_code\": \"IN\"\n  },\n  \"dropoff\": {\n    \"lat\": 18.5308,\n    \"lng\": 73.8475,\n    \"name\": \"Shivajinagar\",\n    \"address\": \"Shivajinagar, Pune, Maharashtra 411005\",\n    \"city\": \"Pune\",\n    \"country_code\": \"IN\"\n  },\n  \"pickup_date\": \"{{pickupDate}}\",\n  \"pickup_time\": \"09:00\",\n  \"return_date\": \"{{returnDate}}\",\n  \"return_time\": \"18:00\",\n  \"adults\": 2,\n  \"currency\": \"INR\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"request_id\": \"4568dc4b-74c1-512b-aead-56df54c33088\",\n  \"transfer_type\": \"point_to_point\",\n  \"offers\": [\n    {\n      \"provider\": \"provider_a\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"4cc3da7271e11591\",\n      \"rate_key\": \"3f3526b8a0171ac988390429eb820d27\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 3962.65,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Bus\",\n        \"model\": null,\n        \"image_url\": \"https://images.example.com/vehicles/bus.png\",\n        \"max_passengers\": 15,\n        \"max_bags\": 1\n      },\n      \"duration_minutes\": 195,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"100% refund if cancelled at least 4h before pickup\",\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T09:00\",\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 4.0,\n        \"rules\": [\n          {\n            \"hours_before_pickup\": 4.0,\n            \"refund_percent\": 100.0\n          }\n        ],\n        \"policy_text\": \"100% refund if cancelled at least 4h before pickup\"\n      },\n      \"included_waiting_minutes\": 30\n    },\n    {\n      \"provider\": \"provider_a\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"return\",\n      \"offer_id\": \"b707526adc2287ec\",\n      \"rate_key\": \"e54e52fcb88703abfee20783bd03de9a\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 3962.65,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Bus\",\n        \"model\": null,\n        \"image_url\": \"https://images.example.com/vehicles/bus.png\",\n        \"max_passengers\": 15,\n        \"max_bags\": 1\n      },\n      \"duration_minutes\": 195,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"100% refund if cancelled at least 4h before pickup\",\n      \"flight_info_required\": false,\n      \"leg\": \"return\",\n      \"pickup_datetime\": \"2026-11-29T18:00\",\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 4.0,\n        \"rules\": [\n          {\n            \"hours_before_pickup\": 4.0,\n            \"refund_percent\": 100.0\n          }\n        ],\n        \"policy_text\": \"100% refund if cancelled at least 4h before pickup\"\n      },\n      \"included_waiting_minutes\": 30\n    },\n    {\n      \"provider\": \"provider_d\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"round_trip\",\n      \"offer_id\": \"4eb6ea2ee73cd4b5\",\n      \"rate_key\": \"3\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 8181.0,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"AC Economy\",\n        \"model\": \"Wagon R or Equivalent\",\n        \"image_url\": \"https://images.example.com/vehicles/ac-economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 1\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"Free cancellation until 6h before pickup; later: INR 500 or 20% of the booking amount, whichever is less\",\n      \"flight_info_required\": false,\n      \"leg\": \"round_trip\",\n      \"pickup_datetime\": \"2026-11-27T09:00\",\n      \"pricing_model\": \"outstation_package\",\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": 3,\n        \"code\": \"roundTrip\",\n        \"label\": \"Outstation (600 km)\"\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": {\n          \"amount\": 12.0,\n          \"currency\": \"INR\"\n        },\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"inclusions\": {\n        \"tolls\": false,\n        \"state_tax\": false,\n        \"parking\": false,\n        \"driver_allowance\": true,\n        \"gratuity\": null,\n        \"included\": [\n          \"Fuel Charges\",\n          \"Driver Allowance\",\n          \"GST (5%)\"\n        ],\n        \"excluded\": [\n          \"Pay INR 12/km after 600 km\",\n          \"Toll / State tax\",\n          \"Night Allowance\",\n          \"Parking\"\n        ]\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 6.0,\n        \"rules\": [],\n        \"policy_text\": \"Free cancellation until 6h before pickup; later: INR 500 or 20% of the booking amount, whichever is less\"\n      },\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_b\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"7a3d4250bdb744f8\",\n      \"rate_key\": \"1902\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 51795.83,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"economy\",\n        \"model\": \"Toyota Prius\",\n        \"image_url\": \"https://images.example.com/vehicles/economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T09:00\",\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": {\n        \"tolls\": true,\n        \"state_tax\": null,\n        \"parking\": null,\n        \"driver_allowance\": null,\n        \"gratuity\": true,\n        \"included\": [],\n        \"excluded\": []\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 3.0,\n        \"rules\": [],\n        \"policy_text\": null\n      },\n      \"included_waiting_minutes\": 15\n    },\n    {\n      \"provider\": \"provider_b\",\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"return\",\n      \"offer_id\": \"55eac7f020d1b02c\",\n      \"rate_key\": \"1902\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 52773.0,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"economy\",\n        \"model\": \"Toyota Prius\",\n        \"image_url\": \"https://images.example.com/vehicles/economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": \"return\",\n      \"pickup_datetime\": \"2026-11-29T18:00\",\n      \"pricing_model\": \"fixed_route\",\n      \"package\": null,\n      \"extra_charges\": null,\n      \"inclusions\": {\n        \"tolls\": true,\n        \"state_tax\": null,\n        \"parking\": null,\n        \"driver_allowance\": null,\n        \"gratuity\": true,\n        \"included\": [],\n        \"excluded\": []\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 3.0,\n        \"rules\": [],\n        \"policy_text\": null\n      },\n      \"included_waiting_minutes\": 15\n    }\n  ],\n  \"errors\": [\n    {\n      \"provider\": \"provider_c\",\n      \"code\": \"provider_error\",\n      \"message\": \"Provider search failed\",\n      \"raw\": {\n        \"leg\": \"outbound\"\n      }\n    },\n    {\n      \"provider\": \"provider_c\",\n      \"code\": \"provider_error\",\n      \"message\": \"Provider search failed\",\n      \"raw\": {\n        \"leg\": \"return\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"providers\": [\n      \"provider_a\",\n      \"provider_b\",\n      \"provider_c\",\n      \"provider_d\"\n    ],\n    \"legs\": [\n      \"outbound\",\n      \"return\",\n      \"round_trip\"\n    ],\n    \"searches\": [\n      {\n        \"provider\": \"provider_a\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_a\",\n        \"leg\": \"return\"\n      },\n      {\n        \"provider\": \"provider_b\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_b\",\n        \"leg\": \"return\"\n      },\n      {\n        \"provider\": \"provider_c\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_c\",\n        \"leg\": \"return\"\n      },\n      {\n        \"provider\": \"provider_d\",\n        \"leg\": \"round_trip\"\n      }\n    ],\n    \"skipped_providers\": {},\n    \"offer_count\": 43,\n    \"sort\": \"price_asc\",\n    \"currencies\": [\n      \"INR\"\n    ],\n    \"trip_type\": \"round_trip\"\n  }\n}"
            }
          ]
        },
        {
          "id": "c8e7676d-5f79-5e39-9a57-78cc0c250e57",
          "name": "Search: hourly 4 h",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/search",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "search"
              ]
            },
            "description": "Runs a search and stores one offer (an offer of preferredProvider when set, otherwise the cheapest) for the next steps.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"transfer_type\": \"hourly\",\n  \"hours\": 4,\n  \"pickup\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n    \"city\": \"Mumbai\",\n    \"country_code\": \"IN\"\n  },\n  \"pickup_date\": \"{{pickupDate}}\",\n  \"pickup_time\": \"10:00\",\n  \"adults\": 2,\n  \"currency\": \"INR\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Future dates so the examples never go stale: +30 days (and +33 for the return / departure).",
                  "const d = (days) => { const t = new Date(Date.now() + days * 86400000); return t.toISOString().slice(0, 10); };",
                  "pm.collectionVariables.set('arrivalDate', d(30));",
                  "pm.collectionVariables.set('pickupDate', d(30));",
                  "pm.collectionVariables.set('departureDate', d(33));",
                  "pm.collectionVariables.set('returnDate', d(33));"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offers is an array', () => pm.expect(res.offers).to.be.an('array'));",
                  "if (res.errors && res.errors.length) { console.log('provider errors', JSON.stringify(res.errors)); }",
                  "// Pick the offer to carry forward: an offer of preferredProvider (optional) first, otherwise the cheapest offer.",
                  "const preferred = (pm.environment.get('preferredProvider') || '').toLowerCase();",
                  "const candidates = res.offers || [];",
                  "const offer = candidates.find(o => preferred && o.provider === preferred) || candidates[0];",
                  "pm.test('an offer was found', () => pm.expect(offer, 'no offer in the response').to.exist);",
                  "if (offer) {",
                  "  pm.collectionVariables.set('offerProvider', offer.provider);",
                  "  pm.collectionVariables.set('offerRateKey', offer.rate_key);",
                  "  pm.collectionVariables.set('offerToken', offer.offer_token);",
                  "  pm.collectionVariables.set('offerFlightInfoRequired', String(offer.flight_info_required));",
                  "  console.log('carrying offer', offer.provider, offer.rate_key, offer.price.total, offer.price.currency);",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "82d69541-1cbd-5bac-b51e-212ad13fb3b7",
              "name": "Hourly",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/search",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "search"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"transfer_type\": \"hourly\",\n  \"hours\": 4,\n  \"pickup\": {\n    \"lat\": 18.9217,\n    \"lng\": 72.8332,\n    \"name\": \"The Taj Mahal Palace\",\n    \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n    \"city\": \"Mumbai\",\n    \"country_code\": \"IN\"\n  },\n  \"pickup_date\": \"{{pickupDate}}\",\n  \"pickup_time\": \"10:00\",\n  \"adults\": 2,\n  \"currency\": \"INR\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"request_id\": \"19fe82d7-5cab-5759-8962-83fba57bac49\",\n  \"transfer_type\": \"hourly\",\n  \"offers\": [\n    {\n      \"provider\": \"provider_d\",\n      \"transfer_type\": \"hourly\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"4c294e3903461db2\",\n      \"rate_key\": \"43:440\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 1500.0,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"AC Mid-Size Plus\",\n        \"model\": \"Dzire, Etios or similar\",\n        \"image_url\": \"https://images.example.com/vehicles/ac-mid-size-plus.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 2\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"Free cancellation until 2h before pickup; later: INR 500 or 20% of the booking amount, whichever is less\",\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T10:00\",\n      \"pricing_model\": \"hourly_package\",\n      \"package\": {\n        \"hours_included\": 4.0,\n        \"km_included\": 40.0,\n        \"days\": null,\n        \"code\": \"440\",\n        \"label\": \"Local (4hr/40 km)\"\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": {\n          \"amount\": 12.0,\n          \"currency\": \"INR\"\n        },\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"inclusions\": {\n        \"tolls\": false,\n        \"state_tax\": false,\n        \"parking\": false,\n        \"driver_allowance\": true,\n        \"gratuity\": null,\n        \"included\": [\n          \"Fuel Charges\",\n          \"Driver Allowance\",\n          \"GST (5%)\"\n        ],\n        \"excluded\": [\n          \"Pay INR 12/km after 40 km\",\n          \"Pay INR 144/hr after 4 hours\",\n          \"Toll / State tax\",\n          \"Night Allowance\",\n          \"Parking\"\n        ]\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 2.0,\n        \"rules\": [],\n        \"policy_text\": \"Free cancellation until 2h before pickup; later: INR 500 or 20% of the booking amount, whichever is less\"\n      },\n      \"included_waiting_minutes\": null\n    },\n    {\n      \"provider\": \"provider_a\",\n      \"transfer_type\": \"hourly\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"6f07c0af1951b62f\",\n      \"rate_key\": \"6ee0dc5f7a825465f0267b13846e334f\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 3170.14,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"Bus\",\n        \"model\": null,\n        \"image_url\": \"https://images.example.com/vehicles/bus.png\",\n        \"max_passengers\": 15,\n        \"max_bags\": 1\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": \"100% refund if cancelled at least 4h before pickup\",\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T10:00\",\n      \"pricing_model\": \"hourly_package\",\n      \"package\": {\n        \"hours_included\": 4.0,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": null,\n      \"inclusions\": null,\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 4.0,\n        \"rules\": [\n          {\n            \"hours_before_pickup\": 4.0,\n            \"refund_percent\": 100.0\n          }\n        ],\n        \"policy_text\": \"100% refund if cancelled at least 4h before pickup\"\n      },\n      \"included_waiting_minutes\": 0\n    },\n    {\n      \"provider\": \"provider_b\",\n      \"transfer_type\": \"hourly\",\n      \"direction\": \"outbound\",\n      \"offer_id\": \"26218a928aa973de\",\n      \"rate_key\": \"1902\",\n      \"offer_token\": \"ot1.gAAAAAB...opaque-offer-token...(about 1 kB; trimmed in this example)\",\n      \"price\": {\n        \"total\": 34166.68,\n        \"currency\": \"INR\",\n        \"taxes_included\": true\n      },\n      \"vehicle\": {\n        \"category\": \"economy\",\n        \"model\": \"Toyota Prius\",\n        \"image_url\": \"https://images.example.com/vehicles/economy.png\",\n        \"max_passengers\": 4,\n        \"max_bags\": 3\n      },\n      \"duration_minutes\": null,\n      \"distance_meters\": null,\n      \"cancellation_summary\": null,\n      \"flight_info_required\": false,\n      \"leg\": \"outbound\",\n      \"pickup_datetime\": \"2026-11-27T10:00\",\n      \"pricing_model\": \"hourly_package\",\n      \"package\": {\n        \"hours_included\": 4.0,\n        \"km_included\": 100.0,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": null,\n      \"inclusions\": {\n        \"tolls\": false,\n        \"state_tax\": null,\n        \"parking\": false,\n        \"driver_allowance\": null,\n        \"gratuity\": true,\n        \"included\": [],\n        \"excluded\": []\n      },\n      \"cancellation\": {\n        \"free_until\": null,\n        \"free_cancellation_hours\": 3.0,\n        \"rules\": [],\n        \"policy_text\": null\n      },\n      \"included_waiting_minutes\": 15\n    }\n  ],\n  \"errors\": [\n    {\n      \"provider\": \"provider_c\",\n      \"code\": \"mode_not_supported\",\n      \"message\": \"provider_c has no hourly product\",\n      \"raw\": {\n        \"transfer_type\": \"hourly\"\n      }\n    }\n  ],\n  \"meta\": {\n    \"providers\": [\n      \"provider_a\",\n      \"provider_b\",\n      \"provider_c\",\n      \"provider_d\"\n    ],\n    \"legs\": [\n      \"outbound\"\n    ],\n    \"searches\": [\n      {\n        \"provider\": \"provider_a\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_b\",\n        \"leg\": \"outbound\"\n      },\n      {\n        \"provider\": \"provider_d\",\n        \"leg\": \"outbound\"\n      }\n    ],\n    \"skipped_providers\": {\n      \"provider_c\": \"provider_c has no hourly product\"\n    },\n    \"offer_count\": 12,\n    \"sort\": \"price_asc\",\n    \"currencies\": [\n      \"INR\"\n    ],\n    \"hours\": 4\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "id": "982db682-c598-5aa3-98b4-9e7832b21346",
      "name": "2. Recheck",
      "description": "",
      "item": [
        {
          "id": "bfcc01b4-97ee-5290-9295-a15dc0c056e9",
          "name": "Recheck",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/transfer/recheck",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "transfer",
                "recheck"
              ]
            },
            "description": "Uses the offer stored by the search.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('offer is available', () => pm.expect(res.available, JSON.stringify(res.error)).to.eql(true));",
                  "if (res.price_changed) { console.warn('price changed to', res.total_price, res.currency); }",
                  "if (res.offer_token) { pm.collectionVariables.set('offerToken', res.offer_token); }"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "590203fc-770c-5586-8fdb-0eb8bf92dbb7",
              "name": "Live price check",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/recheck",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "recheck"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"available\": true,\n  \"price_changed\": false,\n  \"total_price\": 2509.96,\n  \"currency\": \"INR\",\n  \"cancellation_policy\": null,\n  \"offer_token\": \"ot1.gAAAAAB...fresh-offer-token-from-recheck...(trimmed in this example)\",\n  \"error\": null\n}"
            },
            {
              "id": "cbc0c679-8d8c-537c-b672-7f0ea7a9c37a",
              "name": "Validity check",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/recheck",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "recheck"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"available\": true,\n  \"price_changed\": false,\n  \"total_price\": 188.54,\n  \"currency\": \"USD\",\n  \"cancellation_policy\": null,\n  \"offer_token\": \"ot1.gAAAAAB...fresh-offer-token-from-recheck...(trimmed in this example)\",\n  \"error\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "id": "36e0afb0-c02a-58d4-adf4-bb88b778e5a7",
      "name": "3. Book",
      "description": "Creates a REAL booking in the selected environment. In sandbox, cancel it afterwards (5. Cancel). Never send book twice for the same order.",
      "item": [
        {
          "id": "b8ef30f0-7e26-5087-86ad-aa0a170d4029",
          "name": "Book: airport (with flight)",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/transfer/book",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "transfer",
                "book"
              ]
            },
            "description": "For airport offers.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  },\n  \"travellers\": [\n    {\n      \"title\": \"Ms\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"is_lead\": true,\n      \"email\": \"jane.doe@example.com\",\n      \"phone\": \"+442079460000\",\n      \"phone_country_code\": \"GB\"\n    }\n  ],\n  \"internal_reference\": \"{{internalReference}}\",\n  \"flight_info\": {\n    \"airline\": \"AI\",\n    \"flight_number\": \"AI101\",\n    \"terminal\": \"T2\",\n    \"flight_datetime\": \"{{arrivalDate}}T09:30\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Unique reference per booking.",
                  "pm.collectionVariables.set('internalReference', 'TEST-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('booking not failed', () => pm.expect(res.status, JSON.stringify(res.error)).to.not.eql('failed'));",
                  "if (res.status !== 'failed') {",
                  "  pm.collectionVariables.set('bookedProvider', pm.collectionVariables.get('offerProvider'));",
                  "  pm.collectionVariables.set('supplierReference', JSON.stringify(res.supplier_reference));",
                  "  console.log('booked', res.supplier_booking_ref, res.status, '- cancel it when done testing');",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "f6284a7d-07be-5ce0-8f7c-ed884621242b",
              "name": "Airport booking",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/book",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "book"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  },\n  \"travellers\": [\n    {\n      \"title\": \"Ms\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"is_lead\": true,\n      \"email\": \"jane.doe@example.com\",\n      \"phone\": \"+442079460000\",\n      \"phone_country_code\": \"GB\"\n    }\n  ],\n  \"internal_reference\": \"{{internalReference}}\",\n  \"flight_info\": {\n    \"airline\": \"AI\",\n    \"flight_number\": \"AI101\",\n    \"terminal\": \"T2\",\n    \"flight_datetime\": \"{{arrivalDate}}T09:30\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"completed\",\n  \"supplier_booking_id\": \"01aa00bb11cc22dd33ee44ff55667781\",\n  \"supplier_booking_ref\": \"PRV0000001\",\n  \"supplier_reference\": {\n    \"booking_id\": \"01aa00bb11cc22dd33ee44ff55667781\",\n    \"confirmation_number\": \"PRV0000001\",\n    \"provider\": \"provider_a\",\n    \"booking_status\": \"completed\",\n    \"booking_token\": \"bt1.gAAAAAB...opaque-booking-token...(about 1-2 kB; trimmed in this example)\"\n  },\n  \"total_price\": 2509.96,\n  \"currency\": \"INR\",\n  \"booking_details\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_a\",\n      \"supplier_booking_id\": \"01aa00bb11cc22dd33ee44ff55667781\",\n      \"supplier_confirmation_number\": \"PRV0000001\",\n      \"status\": \"confirmed\",\n      \"status_source\": \"book_reference\",\n      \"supplier_status\": null,\n      \"booked_at\": \"2026-10-23T06:33:43+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"pickup\": {\n        \"type\": \"airport\",\n        \"iata\": \"BOM\",\n        \"name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n        \"terminal\": null,\n        \"address\": null,\n        \"lat\": null,\n        \"lng\": null\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"The Taj Mahal Palace\",\n        \"terminal\": null,\n        \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n        \"lat\": 18.9217,\n        \"lng\": 72.8332\n      },\n      \"pickup_datetime\": \"2026-11-26T10:30:00+05:30\",\n      \"timezone\": \"Asia/Kolkata\",\n      \"flight\": {\n        \"airline\": \"AI\",\n        \"number\": \"AI101\",\n        \"terminal\": null,\n        \"datetime\": null\n      },\n      \"return_datetime\": null,\n      \"hours\": null,\n      \"locations_source\": \"book_snapshot\",\n      \"route_matches_booking\": null\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"Sedan\",\n      \"model\": \"Corolla\",\n      \"or_similar\": true,\n      \"max_passengers\": 3,\n      \"max_bags\": 3,\n      \"count\": null,\n      \"image_url\": \"https://images.example.com/vehicles/sedan.png\"\n    },\n    \"service\": {\n      \"type\": null,\n      \"duration_minutes\": 45,\n      \"meet_and_greet\": null,\n      \"free_waiting_minutes\": null,\n      \"meeting_point\": \"Chhatrapati Shivaji Maharaj International Airport\",\n      \"pickup_instructions\": null,\n      \"child_seats\": null,\n      \"booster_seats\": null,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": null,\n        \"phone\": null,\n        \"email\": null,\n        \"support_phone\": null\n      }\n    },\n    \"price\": {\n      \"total\": 2509.96,\n      \"currency\": \"INR\",\n      \"paid\": 2509.96\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": null,\n      \"free_cancellation_hours\": null,\n      \"policy_text\": \"100% refund if cancelled at least 24h before pickup\",\n      \"rules\": [],\n      \"cancelled\": false,\n      \"cancelled_at\": null,\n      \"refund_amount\": null,\n      \"refund_currency\": null,\n      \"refund_source\": null,\n      \"cancelled_at_source\": null\n    },\n    \"supplier_voucher_url\": null\n  },\n  \"error\": null\n}"
            }
          ]
        },
        {
          "id": "776885c0-d29a-5b0a-b1af-6a2ee068e9d0",
          "name": "Book: point-to-point / hourly",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/transfer/book",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "transfer",
                "book"
              ]
            },
            "description": "For point-to-point and hourly offers.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  },\n  \"travellers\": [\n    {\n      \"title\": \"Ms\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"is_lead\": true,\n      \"email\": \"jane.doe@example.com\",\n      \"phone\": \"+442079460000\",\n      \"phone_country_code\": \"GB\"\n    },\n    {\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\"\n    }\n  ],\n  \"internal_reference\": \"{{internalReference}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Unique reference per booking.",
                  "pm.collectionVariables.set('internalReference', 'TEST-' + Date.now());"
                ]
              }
            },
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('booking not failed', () => pm.expect(res.status, JSON.stringify(res.error)).to.not.eql('failed'));",
                  "if (res.status !== 'failed') {",
                  "  pm.collectionVariables.set('bookedProvider', pm.collectionVariables.get('offerProvider'));",
                  "  pm.collectionVariables.set('supplierReference', JSON.stringify(res.supplier_reference));",
                  "  console.log('booked', res.supplier_booking_ref, res.status, '- cancel it when done testing');",
                  "}"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "dacf83f6-cb10-58ab-bba8-618857422522",
              "name": "Point-to-point booking",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/book",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "book"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{offerProvider}}\",\n    \"rate_key\": \"{{offerRateKey}}\",\n    \"offer_token\": \"{{offerToken}}\"\n  },\n  \"travellers\": [\n    {\n      \"title\": \"Ms\",\n      \"first_name\": \"Jane\",\n      \"last_name\": \"Doe\",\n      \"is_lead\": true,\n      \"email\": \"jane.doe@example.com\",\n      \"phone\": \"+442079460000\",\n      \"phone_country_code\": \"GB\"\n    },\n    {\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\"\n    }\n  ],\n  \"internal_reference\": \"{{internalReference}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"completed\",\n  \"supplier_booking_id\": \"INT-0000001\",\n  \"supplier_booking_ref\": \"INT-0000001\",\n  \"supplier_reference\": {\n    \"booking_id\": \"INT-0000001\",\n    \"confirmation_number\": \"INT-0000001\",\n    \"provider\": \"provider_c\",\n    \"booking_status\": \"completed\",\n    \"booking_token\": \"bt1.gAAAAAB...opaque-booking-token...(about 1-2 kB; trimmed in this example)\"\n  },\n  \"total_price\": 70.39,\n  \"currency\": \"USD\",\n  \"booking_details\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_c\",\n      \"supplier_booking_id\": \"INT-0000001\",\n      \"supplier_confirmation_number\": \"INT-0000001\",\n      \"status\": \"confirmed\",\n      \"status_source\": \"book_reference\",\n      \"supplier_status\": null,\n      \"booked_at\": \"2026-10-23T06:35:31+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"point_to_point\",\n      \"direction\": \"outbound\",\n      \"pickup\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"Dubai Marina\",\n        \"terminal\": null,\n        \"address\": \"Dubai Marina, Dubai\",\n        \"lat\": 25.0805,\n        \"lng\": 55.1403\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": null,\n        \"terminal\": null,\n        \"address\": \"Corniche Road, Abu Dhabi\",\n        \"lat\": 24.4539,\n        \"lng\": 54.3773\n      },\n      \"pickup_datetime\": \"2026-11-25T10:00:00+04:00\",\n      \"timezone\": \"Asia/Dubai\",\n      \"flight\": {\n        \"airline\": null,\n        \"number\": null,\n        \"terminal\": null,\n        \"datetime\": null\n      },\n      \"return_datetime\": null,\n      \"hours\": null,\n      \"locations_source\": \"book_snapshot\",\n      \"route_matches_booking\": null\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"Sedan Chevrolet Malibu 2018\",\n      \"model\": \"Sedan Chevrolet Malibu 2018\",\n      \"or_similar\": true,\n      \"max_passengers\": 4,\n      \"max_bags\": 3,\n      \"count\": null,\n      \"image_url\": \"https://images.example.com/vehicles/sedan.png\"\n    },\n    \"service\": {\n      \"type\": null,\n      \"duration_minutes\": 75,\n      \"meet_and_greet\": null,\n      \"free_waiting_minutes\": null,\n      \"meeting_point\": \"Dubai Marina\",\n      \"pickup_instructions\": null,\n      \"child_seats\": null,\n      \"booster_seats\": null,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": null,\n        \"phone\": null,\n        \"email\": null,\n        \"support_phone\": null\n      }\n    },\n    \"price\": {\n      \"total\": 70.39,\n      \"currency\": \"USD\",\n      \"paid\": null\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": null,\n      \"free_cancellation_hours\": 0.0,\n      \"policy_text\": null,\n      \"rules\": [],\n      \"cancelled\": false,\n      \"cancelled_at\": null,\n      \"refund_amount\": null,\n      \"refund_currency\": null,\n      \"refund_source\": null,\n      \"cancelled_at_source\": null\n    },\n    \"supplier_voucher_url\": \"https://vouchers.example.com/v/0000example0000\"\n  },\n  \"error\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "id": "41fc7cd5-d559-58e0-97ad-c1fb73414707",
      "name": "4. Booking details",
      "description": "",
      "item": [
        {
          "id": "5f55e571-8c59-5184-b58a-a868258aa0b3",
          "name": "Booking details",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/transfer/booking-details",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "transfer",
                "booking-details"
              ]
            },
            "description": "",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('lookup ok', () => pm.expect(res.status, JSON.stringify(res.error)).to.eql('ok'));",
                  "pm.test('details_version 3', () => pm.expect(res.booking_details.details_version).to.eql('3'));",
                  "console.log('booking status', res.booking_details.booking.status);"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "7c699700-1694-5caa-98c9-f157b41c62f6",
              "name": "Airport, confirmed",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/booking-details",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "booking-details"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}}\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"booking_details\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_a\",\n      \"supplier_booking_id\": \"01aa00bb11cc22dd33ee44ff55667781\",\n      \"supplier_confirmation_number\": \"PRV0000001\",\n      \"status\": \"confirmed\",\n      \"status_source\": \"supplier\",\n      \"supplier_status\": \"confirmed\",\n      \"booked_at\": \"2026-10-23T06:33:43+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"pickup\": {\n        \"type\": \"airport\",\n        \"iata\": \"BOM\",\n        \"name\": \"Bombay Mumbai Chhatrapati Shivaji International Airport\",\n        \"terminal\": null,\n        \"address\": \"Bombay Mumbai Chhatrapati Shivaji International Airport\",\n        \"lat\": 19.088699,\n        \"lng\": 72.867897\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"The Taj Mahal Palace\",\n        \"terminal\": null,\n        \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n        \"lat\": 18.9217,\n        \"lng\": 72.8332\n      },\n      \"pickup_datetime\": \"2026-11-26T10:30:00+05:30\",\n      \"timezone\": \"Asia/Calcutta\",\n      \"flight\": {\n        \"airline\": \"AI\",\n        \"number\": \"AI101\",\n        \"terminal\": null,\n        \"datetime\": \"2026-11-26T09:30:00+05:30\"\n      },\n      \"return_datetime\": null,\n      \"hours\": null,\n      \"locations_source\": \"supplier\",\n      \"route_matches_booking\": true\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"Sedan\",\n      \"model\": \"Toyota Corolla\",\n      \"or_similar\": true,\n      \"max_passengers\": 3,\n      \"max_bags\": 3,\n      \"count\": 1,\n      \"image_url\": \"https://images.example.com/vehicles/sedan.png\"\n    },\n    \"service\": {\n      \"type\": null,\n      \"duration_minutes\": 45,\n      \"meet_and_greet\": false,\n      \"free_waiting_minutes\": 33,\n      \"meeting_point\": \"Bombay Mumbai Chhatrapati Shivaji International Airport\",\n      \"pickup_instructions\": \"For Customers Who Paid for \\\"Meet&Greet\\\" Service:\\nIf you have paid for the Meet&Greet service, your driver will be waiting for you at the arrival hall holding a sign with your name.\\n\\nFor Customers Who Did Not Pay for \\\"Meet&Greet\\\" Service:\\nIf you havent paid for the Meet&Greet service, your driver will contact you via text message to confirm the meeting point. Please ensure your phone is switched on and accessible.\\n\\nIn Case of Difficulty Finding Your Driver:\\nIf you cannot locate your driver, please contact the 24/7 hotline immediately:\\n\\n\\\\\\\\*Airport have the WIFI, PLEASE CONNECT IT.\",\n      \"child_seats\": null,\n      \"booster_seats\": null,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": \"Example Transfers Ltd\",\n        \"phone\": \"+442079460001\",\n        \"email\": \"support@example.com\",\n        \"support_phone\": \"+442079460002\"\n      }\n    },\n    \"price\": {\n      \"total\": 2509.96,\n      \"currency\": \"INR\",\n      \"paid\": 2509.96\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": \"2026-11-25T10:30:00+05:30\",\n      \"free_cancellation_hours\": 24.0,\n      \"policy_text\": \"100% refund if cancelled at least 24h before pickup\",\n      \"rules\": [\n        {\n          \"hours_before_pickup\": 24.0,\n          \"refund_percent\": 100.0\n        }\n      ],\n      \"cancelled\": false,\n      \"cancelled_at\": null,\n      \"refund_amount\": null,\n      \"refund_currency\": null,\n      \"refund_source\": null,\n      \"cancelled_at_source\": null\n    },\n    \"supplier_voucher_url\": null\n  },\n  \"voucher_data\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_a\",\n      \"supplier_booking_id\": \"01aa00bb11cc22dd33ee44ff55667781\",\n      \"supplier_confirmation_number\": \"PRV0000001\",\n      \"status\": \"confirmed\",\n      \"status_source\": \"supplier\",\n      \"supplier_status\": \"confirmed\",\n      \"booked_at\": \"2026-10-23T06:33:43+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"pickup\": {\n        \"type\": \"airport\",\n        \"iata\": \"BOM\",\n        \"name\": \"Bombay Mumbai Chhatrapati Shivaji International Airport\",\n        \"terminal\": null,\n        \"address\": \"Bombay Mumbai Chhatrapati Shivaji International Airport\",\n        \"lat\": 19.088699,\n        \"lng\": 72.867897\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"The Taj Mahal Palace\",\n        \"terminal\": null,\n        \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n        \"lat\": 18.9217,\n        \"lng\": 72.8332\n      },\n      \"pickup_datetime\": \"2026-11-26T10:30:00+05:30\",\n      \"timezone\": \"Asia/Calcutta\",\n      \"flight\": {\n        \"airline\": \"AI\",\n        \"number\": \"AI101\",\n        \"terminal\": null,\n        \"datetime\": \"2026-11-26T09:30:00+05:30\"\n      },\n      \"return_datetime\": null,\n      \"hours\": null,\n      \"locations_source\": \"supplier\",\n      \"route_matches_booking\": true\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"Sedan\",\n      \"model\": \"Toyota Corolla\",\n      \"or_similar\": true,\n      \"max_passengers\": 3,\n      \"max_bags\": 3,\n      \"count\": 1,\n      \"image_url\": \"https://images.example.com/vehicles/sedan.png\"\n    },\n    \"service\": {\n      \"type\": null,\n      \"duration_minutes\": 45,\n      \"meet_and_greet\": false,\n      \"free_waiting_minutes\": 33,\n      \"meeting_point\": \"Bombay Mumbai Chhatrapati Shivaji International Airport\",\n      \"pickup_instructions\": \"For Customers Who Paid for \\\"Meet&Greet\\\" Service:\\nIf you have paid for the Meet&Greet service, your driver will be waiting for you at the arrival hall holding a sign with your name.\\n\\nFor Customers Who Did Not Pay for \\\"Meet&Greet\\\" Service:\\nIf you havent paid for the Meet&Greet service, your driver will contact you via text message to confirm the meeting point. Please ensure your phone is switched on and accessible.\\n\\nIn Case of Difficulty Finding Your Driver:\\nIf you cannot locate your driver, please contact the 24/7 hotline immediately:\\n\\n\\\\\\\\*Airport have the WIFI, PLEASE CONNECT IT.\",\n      \"child_seats\": null,\n      \"booster_seats\": null,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": \"Example Transfers Ltd\",\n        \"phone\": \"+442079460001\",\n        \"email\": \"support@example.com\",\n        \"support_phone\": \"+442079460002\"\n      }\n    },\n    \"price\": {\n      \"total\": 2509.96,\n      \"currency\": \"INR\",\n      \"paid\": 2509.96\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": \"2026-11-25T10:30:00+05:30\",\n      \"free_cancellation_hours\": 24.0,\n      \"policy_text\": \"100% refund if cancelled at least 24h before pickup\",\n      \"rules\": [\n        {\n          \"hours_before_pickup\": 24.0,\n          \"refund_percent\": 100.0\n        }\n      ],\n      \"cancelled\": false,\n      \"cancelled_at\": null,\n      \"refund_amount\": null,\n      \"refund_currency\": null,\n      \"refund_source\": null,\n      \"cancelled_at_source\": null\n    },\n    \"supplier_voucher_url\": null\n  },\n  \"error\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "id": "ce6850af-d679-57f9-b000-7dcef19086e1",
      "name": "5. Cancel",
      "description": "",
      "item": [
        {
          "id": "dd2aac9c-3ed8-55b6-8c9f-4f77f5e7c96f",
          "name": "Cancel",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/transfer/cancel",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "transfer",
                "cancel"
              ]
            },
            "description": "",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"reason\": \"Test booking\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('cancel accepted', () => pm.expect(['cancelled', 'cancellation_pending']).to.include(res.status));",
                  "pm.collectionVariables.set('cancelResponse', JSON.stringify(res));"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "b48f04af-0ec2-5a2a-8ef0-f6687e766ad3",
              "name": "Refund from provider",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "cancel"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"reason\": \"Test booking\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"cancelled\",\n  \"cancelled\": true,\n  \"refund_amount\": 2509.96,\n  \"currency\": \"INR\",\n  \"refund_source\": \"supplier\",\n  \"refund_estimated\": false,\n  \"cancelled_at\": \"2026-10-23T06:33:47+00:00\",\n  \"cancelled_at_source\": \"tp_cancel\",\n  \"error\": null\n}"
            },
            {
              "id": "c1f95801-5b2e-55a9-ae69-15c9807358cb",
              "name": "Refund estimated",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "cancel"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"reason\": \"Test booking\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"cancelled\",\n  \"cancelled\": true,\n  \"refund_amount\": 188.54,\n  \"currency\": \"USD\",\n  \"refund_source\": \"policy_estimate\",\n  \"refund_estimated\": true,\n  \"cancelled_at\": \"2026-10-23T06:33:56+00:00\",\n  \"cancelled_at_source\": \"tp_cancel\",\n  \"error\": null\n}"
            },
            {
              "id": "3ebc4398-a166-5a0f-ac8a-29ec38a2cc2f",
              "name": "Cancellation pending",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/cancel",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "cancel"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"reason\": \"Test booking\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"cancellation_pending\",\n  \"cancelled\": false,\n  \"refund_amount\": 17.12,\n  \"currency\": \"USD\",\n  \"refund_source\": \"policy_estimate\",\n  \"refund_estimated\": true,\n  \"cancelled_at\": null,\n  \"cancelled_at_source\": null,\n  \"error\": null\n}"
            }
          ]
        },
        {
          "id": "86f2d27e-49e8-58bd-afcb-58f2b96cac44",
          "name": "Booking details after cancel",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{baseUrl}}/v1/transfer/booking-details",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "transfer",
                "booking-details"
              ]
            },
            "description": "",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"cancel_response\": {{cancelResponse}}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
                  "const res = pm.response.json();",
                  "pm.test('lookup ok', () => pm.expect(res.status, JSON.stringify(res.error)).to.eql('ok'));",
                  "pm.test('details_version 3', () => pm.expect(res.booking_details.details_version).to.eql('3'));",
                  "console.log('booking status', res.booking_details.booking.status);"
                ]
              }
            }
          ],
          "response": [
            {
              "id": "8370a30a-7e4a-55d1-8818-0a2783248bd6",
              "name": "Hourly, cancelled",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/booking-details",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "booking-details"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"cancel_response\": {{cancelResponse}}\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"booking_details\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_b\",\n      \"supplier_booking_id\": \"60000001\",\n      \"supplier_confirmation_number\": \"60000001\",\n      \"status\": \"cancelled\",\n      \"status_source\": \"supplier\",\n      \"supplier_status\": \"cancelled\",\n      \"booked_at\": \"2026-10-23T06:37:19+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"hourly\",\n      \"direction\": \"outbound\",\n      \"pickup\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"Berlin Hbf\",\n        \"terminal\": null,\n        \"address\": \"Berlin Hauptbahnhof, Europaplatz 1, 10557 Berlin\",\n        \"lat\": 52.5251,\n        \"lng\": 13.3694\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"Berlin Hbf\",\n        \"terminal\": null,\n        \"address\": \"Berlin Hauptbahnhof, Europaplatz 1, 10557 Berlin\",\n        \"lat\": 52.5251,\n        \"lng\": 13.3694\n      },\n      \"pickup_datetime\": \"2026-11-25T10:00:00+01:00\",\n      \"timezone\": null,\n      \"flight\": {\n        \"airline\": null,\n        \"number\": null,\n        \"terminal\": null,\n        \"datetime\": null\n      },\n      \"return_datetime\": null,\n      \"hours\": 4,\n      \"locations_source\": \"supplier\",\n      \"route_matches_booking\": true\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"economy\",\n      \"model\": \"Toyota Prius\",\n      \"or_similar\": true,\n      \"max_passengers\": 3,\n      \"max_bags\": 3,\n      \"count\": null,\n      \"image_url\": \"https://images.example.com/vehicles/economy.png\"\n    },\n    \"service\": {\n      \"type\": null,\n      \"duration_minutes\": 240,\n      \"meet_and_greet\": false,\n      \"free_waiting_minutes\": 15,\n      \"meeting_point\": \"Berlin Hauptbahnhof, Europaplatz 1, 10557 Berlin\",\n      \"pickup_instructions\": \"The driver will wait for you in front of the building that you have indicated as your pick-up point. In case you cannot find your driver, please contact him directly using the mobile number sent to you via SMS or use our Self Service Centre:\\n\\nhttps://provider.example.com/self-service/\",\n      \"child_seats\": null,\n      \"booster_seats\": null,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": 4.0,\n        \"km_included\": 100.0,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": \"Example Transfers Ltd\",\n        \"phone\": \"+442079460001\",\n        \"email\": \"support@example.com\",\n        \"support_phone\": \"+442079460002\"\n      }\n    },\n    \"price\": {\n      \"total\": 400.0,\n      \"currency\": \"EUR\",\n      \"paid\": null\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": \"2026-11-25T07:00:00+01:00\",\n      \"free_cancellation_hours\": 3.0,\n      \"policy_text\": null,\n      \"rules\": [],\n      \"cancelled\": true,\n      \"cancelled_at\": \"2026-10-23T06:37:22+00:00\",\n      \"refund_amount\": 400.0,\n      \"refund_currency\": \"EUR\",\n      \"refund_source\": \"policy_estimate\",\n      \"cancelled_at_source\": \"tp_cancel\"\n    },\n    \"supplier_voucher_url\": null\n  },\n  \"voucher_data\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_b\",\n      \"supplier_booking_id\": \"60000001\",\n      \"supplier_confirmation_number\": \"60000001\",\n      \"status\": \"cancelled\",\n      \"status_source\": \"supplier\",\n      \"supplier_status\": \"cancelled\",\n      \"booked_at\": \"2026-10-23T06:37:19+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"hourly\",\n      \"direction\": \"outbound\",\n      \"pickup\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"Berlin Hbf\",\n        \"terminal\": null,\n        \"address\": \"Berlin Hauptbahnhof, Europaplatz 1, 10557 Berlin\",\n        \"lat\": 52.5251,\n        \"lng\": 13.3694\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"Berlin Hbf\",\n        \"terminal\": null,\n        \"address\": \"Berlin Hauptbahnhof, Europaplatz 1, 10557 Berlin\",\n        \"lat\": 52.5251,\n        \"lng\": 13.3694\n      },\n      \"pickup_datetime\": \"2026-11-25T10:00:00+01:00\",\n      \"timezone\": null,\n      \"flight\": {\n        \"airline\": null,\n        \"number\": null,\n        \"terminal\": null,\n        \"datetime\": null\n      },\n      \"return_datetime\": null,\n      \"hours\": 4,\n      \"locations_source\": \"supplier\",\n      \"route_matches_booking\": true\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"economy\",\n      \"model\": \"Toyota Prius\",\n      \"or_similar\": true,\n      \"max_passengers\": 3,\n      \"max_bags\": 3,\n      \"count\": null,\n      \"image_url\": \"https://images.example.com/vehicles/economy.png\"\n    },\n    \"service\": {\n      \"type\": null,\n      \"duration_minutes\": 240,\n      \"meet_and_greet\": false,\n      \"free_waiting_minutes\": 15,\n      \"meeting_point\": \"Berlin Hauptbahnhof, Europaplatz 1, 10557 Berlin\",\n      \"pickup_instructions\": \"The driver will wait for you in front of the building that you have indicated as your pick-up point. In case you cannot find your driver, please contact him directly using the mobile number sent to you via SMS or use our Self Service Centre:\\n\\nhttps://provider.example.com/self-service/\",\n      \"child_seats\": null,\n      \"booster_seats\": null,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": 4.0,\n        \"km_included\": 100.0,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": \"Example Transfers Ltd\",\n        \"phone\": \"+442079460001\",\n        \"email\": \"support@example.com\",\n        \"support_phone\": \"+442079460002\"\n      }\n    },\n    \"price\": {\n      \"total\": 400.0,\n      \"currency\": \"EUR\",\n      \"paid\": null\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": \"2026-11-25T07:00:00+01:00\",\n      \"free_cancellation_hours\": 3.0,\n      \"policy_text\": null,\n      \"rules\": [],\n      \"cancelled\": true,\n      \"cancelled_at\": \"2026-10-23T06:37:22+00:00\",\n      \"refund_amount\": 400.0,\n      \"refund_currency\": \"EUR\",\n      \"refund_source\": \"policy_estimate\",\n      \"cancelled_at_source\": \"tp_cancel\"\n    },\n    \"supplier_voucher_url\": null\n  },\n  \"error\": null\n}"
            },
            {
              "id": "2dde660c-d1a3-519d-9e66-72636ee0bf20",
              "name": "Airport, cancelled",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{baseUrl}}/v1/transfer/booking-details",
                  "host": [
                    "{{baseUrl}}"
                  ],
                  "path": [
                    "v1",
                    "transfer",
                    "booking-details"
                  ]
                },
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"provider_context\": {\n    \"provider\": \"{{bookedProvider}}\"\n  },\n  \"supplier_reference\": {{supplierReference}},\n  \"cancel_response\": {{cancelResponse}}\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": \"ok\",\n  \"booking_details\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_c\",\n      \"supplier_booking_id\": \"INT-0000002\",\n      \"supplier_confirmation_number\": \"INT-0000002\",\n      \"status\": \"cancelled\",\n      \"status_source\": \"supplier\",\n      \"supplier_status\": \"process_canceled\",\n      \"booked_at\": \"2026-10-23T06:34:03+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"pickup\": {\n        \"type\": \"airport\",\n        \"iata\": \"BOM\",\n        \"name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n        \"terminal\": null,\n        \"address\": null,\n        \"lat\": null,\n        \"lng\": null\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"The Taj Mahal Palace\",\n        \"terminal\": null,\n        \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n        \"lat\": 18.9217,\n        \"lng\": 72.8332\n      },\n      \"pickup_datetime\": \"2026-11-26T10:30:00+05:30\",\n      \"timezone\": \"Asia/Kolkata\",\n      \"flight\": {\n        \"airline\": \"AI\",\n        \"number\": \"AI101\",\n        \"terminal\": null,\n        \"datetime\": \"2026-11-26T09:00:00+05:30\"\n      },\n      \"return_datetime\": null,\n      \"hours\": null,\n      \"locations_source\": \"mixed\",\n      \"route_matches_booking\": true\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"private\",\n      \"model\": \"Sedan Hyundai Xcent or Similar 2018\",\n      \"or_similar\": true,\n      \"max_passengers\": 4,\n      \"max_bags\": 3,\n      \"count\": 1,\n      \"image_url\": \"https://images.example.com/vehicles/sedan.png\"\n    },\n    \"service\": {\n      \"type\": \"private\",\n      \"duration_minutes\": 25,\n      \"meet_and_greet\": true,\n      \"free_waiting_minutes\": 60,\n      \"meeting_point\": \"Chhatrapati Shivaji Maharaj International Airport\",\n      \"pickup_instructions\": \"How to find your driver:\\nAfter collecting your luggage, proceed to the arrivals hall, where your driver will be waiting INSIDE, holding a sign with your name on it. Please show your driver a copy of your booking voucher to confirm your identity.\\n\\nIf you have any difficulty locating your driver, please call the support hotline listed on your booking voucher. An English-speaking representative will be available to assist you. Please remember to include the international dialing code when calling from a mobile or landline phone.\",\n      \"child_seats\": 0,\n      \"booster_seats\": 0,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": null,\n        \"phone\": null,\n        \"email\": null,\n        \"support_phone\": null\n      }\n    },\n    \"price\": {\n      \"total\": 17.12,\n      \"currency\": \"USD\",\n      \"paid\": null\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": \"2026-11-25T22:30:00+05:30\",\n      \"free_cancellation_hours\": 12.0,\n      \"policy_text\": null,\n      \"rules\": [],\n      \"cancelled\": true,\n      \"cancelled_at\": \"2026-10-23T06:34:07+00:00\",\n      \"refund_amount\": 17.12,\n      \"refund_currency\": \"USD\",\n      \"refund_source\": \"supplier\",\n      \"cancelled_at_source\": \"supplier\"\n    },\n    \"supplier_voucher_url\": \"https://vouchers.example.com/v/0000example0000\"\n  },\n  \"voucher_data\": {\n    \"details_version\": \"3\",\n    \"booking\": {\n      \"tp_booking_ref\": \"ORDER-10001\",\n      \"provider\": \"provider_c\",\n      \"supplier_booking_id\": \"INT-0000002\",\n      \"supplier_confirmation_number\": \"INT-0000002\",\n      \"status\": \"cancelled\",\n      \"status_source\": \"supplier\",\n      \"supplier_status\": \"process_canceled\",\n      \"booked_at\": \"2026-10-23T06:34:03+00:00\"\n    },\n    \"trip\": {\n      \"transfer_type\": \"airport\",\n      \"direction\": \"arrival\",\n      \"pickup\": {\n        \"type\": \"airport\",\n        \"iata\": \"BOM\",\n        \"name\": \"Chhatrapati Shivaji Maharaj International Airport\",\n        \"terminal\": null,\n        \"address\": null,\n        \"lat\": null,\n        \"lng\": null\n      },\n      \"dropoff\": {\n        \"type\": \"address\",\n        \"iata\": null,\n        \"name\": \"The Taj Mahal Palace\",\n        \"terminal\": null,\n        \"address\": \"Apollo Bunder, Colaba, Mumbai 400001\",\n        \"lat\": 18.9217,\n        \"lng\": 72.8332\n      },\n      \"pickup_datetime\": \"2026-11-26T10:30:00+05:30\",\n      \"timezone\": \"Asia/Kolkata\",\n      \"flight\": {\n        \"airline\": \"AI\",\n        \"number\": \"AI101\",\n        \"terminal\": null,\n        \"datetime\": \"2026-11-26T09:00:00+05:30\"\n      },\n      \"return_datetime\": null,\n      \"hours\": null,\n      \"locations_source\": \"mixed\",\n      \"route_matches_booking\": true\n    },\n    \"passengers\": {\n      \"lead\": {\n        \"name\": \"Jane Doe\",\n        \"email\": \"jane.doe@example.com\",\n        \"phone\": \"+442079460000\"\n      },\n      \"adults\": 2,\n      \"children\": 0,\n      \"infants\": 0,\n      \"total\": 2\n    },\n    \"vehicle\": {\n      \"category\": \"private\",\n      \"model\": \"Sedan Hyundai Xcent or Similar 2018\",\n      \"or_similar\": true,\n      \"max_passengers\": 4,\n      \"max_bags\": 3,\n      \"count\": 1,\n      \"image_url\": \"https://images.example.com/vehicles/sedan.png\"\n    },\n    \"service\": {\n      \"type\": \"private\",\n      \"duration_minutes\": 25,\n      \"meet_and_greet\": true,\n      \"free_waiting_minutes\": 60,\n      \"meeting_point\": \"Chhatrapati Shivaji Maharaj International Airport\",\n      \"pickup_instructions\": \"How to find your driver:\\nAfter collecting your luggage, proceed to the arrivals hall, where your driver will be waiting INSIDE, holding a sign with your name on it. Please show your driver a copy of your booking voucher to confirm your identity.\\n\\nIf you have any difficulty locating your driver, please call the support hotline listed on your booking voucher. An English-speaking representative will be available to assist you. Please remember to include the international dialing code when calling from a mobile or landline phone.\",\n      \"child_seats\": 0,\n      \"booster_seats\": 0,\n      \"pin_to_start_ride\": null,\n      \"package\": {\n        \"hours_included\": null,\n        \"km_included\": null,\n        \"days\": null,\n        \"code\": null,\n        \"label\": null\n      },\n      \"extra_charges\": {\n        \"extra_km_rate\": null,\n        \"extra_hour_rate\": null,\n        \"night_charge\": null,\n        \"driver_allowance\": null\n      },\n      \"driver\": {\n        \"name\": null,\n        \"phone\": null,\n        \"photo_url\": null,\n        \"vehicle_plate\": null\n      },\n      \"supplier_contact\": {\n        \"name\": null,\n        \"phone\": null,\n        \"email\": null,\n        \"support_phone\": null\n      }\n    },\n    \"price\": {\n      \"total\": 17.12,\n      \"currency\": \"USD\",\n      \"paid\": null\n    },\n    \"cancellation\": {\n      \"free_cancellation_until\": \"2026-11-25T22:30:00+05:30\",\n      \"free_cancellation_hours\": 12.0,\n      \"policy_text\": null,\n      \"rules\": [],\n      \"cancelled\": true,\n      \"cancelled_at\": \"2026-10-23T06:34:07+00:00\",\n      \"refund_amount\": 17.12,\n      \"refund_currency\": \"USD\",\n      \"refund_source\": \"supplier\",\n      \"cancelled_at_source\": \"supplier\"\n    },\n    \"supplier_voucher_url\": \"https://vouchers.example.com/v/0000example0000\"\n  },\n  \"error\": null\n}"
            }
          ]
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "arrivalDate",
      "value": ""
    },
    {
      "key": "departureDate",
      "value": ""
    },
    {
      "key": "pickupDate",
      "value": ""
    },
    {
      "key": "returnDate",
      "value": ""
    },
    {
      "key": "offerProvider",
      "value": ""
    },
    {
      "key": "offerRateKey",
      "value": ""
    },
    {
      "key": "offerToken",
      "value": ""
    },
    {
      "key": "offerFlightInfoRequired",
      "value": ""
    },
    {
      "key": "internalReference",
      "value": ""
    },
    {
      "key": "bookedProvider",
      "value": ""
    },
    {
      "key": "supplierReference",
      "value": ""
    },
    {
      "key": "cancelResponse",
      "value": ""
    }
  ]
}
