Skip to main content

Coordinate-based transfer search

The Booking API supports GPS coordinates and IATA codes as location identifiers for transfer searches. This means you can search transfers directly from a guest's GPS position — hotel, port, station — without needing to pre-map those locations to internal IDs.

Identification methods

Each origin and destination accepts exactly one of the following identification methods:

MethodHow to send itWhen to use it
Location ID (L prefix)LocationOriginID="L4714" attributeYou have the internal location ID from static data
Accommodation ID (H prefix)LocationOriginID="H1559666" attributeYou have the internal accommodation ID
GIATA code (G prefix)LocationOriginID="G12345" attributeYou have the GIATA code for the accommodation
IATA code (airports only)LocationOrigin subnode with <IATA>Origin or destination is an airport
GPS coordinatesLocationOrigin subnode with <Coordinates>You have a lat/lon from the guest's location (hotel, port, station, etc.)

The first three use the LocationOriginID / LocationDestinationID attributes directly in TransferOptions. IATA and GPS use the LocationOrigin / LocationDestination subnodes.

You can combine methods freely in the same request — for example, GPS origin with IATA destination. Existing integrations using ID-based searches continue to work without changes.

The Type attribute

LocationOrigin and LocationDestination accept an optional Type attribute that filters resolution by location type:

ValueLocation type
AAirport
HHotel / Accommodation
SStation (train, bus)
PPort
  • When using IATA: Type="A" is required. IATA codes only identify airports.
  • When using GPS coordinates: Type is optional. If omitted, the system resolves to the nearest location regardless of type. If provided, it filters to the nearest location of that type — useful when multiple location types are near the same coordinates.
  • <Name> and <Address> cannot be sent alongside IATA — they only apply to GPS points.

AVAIL — sending coordinates

Add LocationOrigin and/or LocationDestination subnodes inside the existing TransferOptions node. Both subnodes share the same structure:

<TransferOptions Type="ROUNDTRIP" LocationOriginTime="HH:MM" LocationDestinationTime="HH:MM">

<!-- GPS origin: coordinates identify the pickup point -->
<LocationOrigin Type="H">
<Name>Hotel name</Name> <!-- Optional in AVAIL; see Commit section below -->
<Address>Street address</Address> <!-- Optional in AVAIL; see Commit section below -->
<Coordinates>
<Latitude>XX.XXXX</Latitude> <!-- Decimal degrees, WGS84 -->
<Longitude>YY.YYYY</Longitude>
</Coordinates>
<IATA></IATA> <!-- Leave empty when using coordinates -->
</LocationOrigin>

<!-- IATA destination: airport identified by IATA code -->
<LocationDestination Type="A">
<Name></Name>
<Address></Address>
<Coordinates>
<Latitude></Latitude> <!-- Leave empty when using IATA -->
<Longitude></Longitude>
</Coordinates>
<IATA>XYZ</IATA>
</LocationDestination>

</TransferOptions>
info

Coordinates must be in decimal degrees (DD) format under the WGS84 standard — the format produced by all standard GPS and mapping APIs.

COMMIT — providing address data for GPS points

When any location in the AVAIL was identified by GPS coordinates, the system requires Name and Address for that point before confirming the booking. These can come from either source:

  • From AVAIL — if <Name> and <Address> were already sent in the Avail request
  • From COMMIT — via the <TransferAddress> node, for any field not yet provided
<Name> + <Address> in AVAIL<TransferAddress> in COMMIT
Both provided (non-empty)Optional
Missing or emptyRequired

The <TransferAddress> node goes directly inside <objRequest>, before <Concepts>:

<TransferAddress
OriginName="Physical name of the GPS origin point"
OriginAddress="Street address"
OriginAddress2="Additional address info"
OriginPostalCode="Postal code"
DestinationName=""
DestinationAddress=""
DestinationAddress2=""
DestinationPostalCode=""
/>

Only populate fields for GPS points. Fields for points identified by ID or IATA are ignored.


Validation rules

Identification rules

  • You must provide exactly one identification method per origin and per destination.
  • Sending more than one (e.g., both coordinates and IATA) returns an error.
  • Sending none also returns an error.

Coordinate rules

  • Both <Latitude> and <Longitude> are required. Sending only one returns an error.
  • Format: decimal degrees (DD), WGS84.

IATA rules

  • Type="A" is required when using an IATA code.
  • If Type="A" is set, an IATA code must be provided — coordinates are not accepted for airports.
  • <Name> and <Address> cannot be sent alongside an IATA code.

Same origin/destination

  • Requests where origin and destination resolve to the same location are rejected — whether identified by ID, IATA, or coordinates.
  • Exception: hotel-to-hotel transfers.
tip

For the full list of error messages and suggested actions, see the Error List page.


Examples

Hotel (GPS) → Airport (IATA) — full flow

The most common GPS scenario: pickup from a GPS position, dropoff at an airport. The Avail includes Name and Address in the origin, so TransferAddress is optional in Commit — but shown here for completeness.

Avail

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<DestServicesAvailV2 xmlns="http://xml.ineedtours.com/ws/">
<objCredentials>
<Source>
<RequestorID Type="DSP" ID="{{User}}" MessagePassword="{{Pass}}"/>
</Source>
</objCredentials>
<objRequest PrimaryLangID="ES">
<ServiceType>T</ServiceType>
<StayDateRange Start="YYYY-MM-DD" End="YYYY-MM-DD"/>
<Occupations>
<AvailRequestV2Occupation>
<Type>ADL</Type>
<Age>30</Age>
</AvailRequestV2Occupation>
</Occupations>
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="H">
<Name>Hotel Test</Name>
<Address>Origin Test Address</Address>
<Coordinates>
<Latitude>52.3657</Latitude>
<Longitude>4.88807</Longitude>
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name>
<Address></Address>
<Coordinates>
<Latitude></Latitude>
<Longitude></Longitude>
</Coordinates>
<IATA>AMS</IATA>
</LocationDestination>
</TransferOptions>
</objRequest>
</DestServicesAvailV2>
</soap:Body>
</soap:Envelope>

Commit

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<DestServicesCommitV2 xmlns="http://xml.ineedtours.com/ws/">
<objCredentials>
<Source>
<RequestorID Type="DSP" ID="{{User}}" MessagePassword="{{Pass}}"/>
</Source>
</objCredentials>
<objRequest EchoToken="{{EchoToken}}" PrimaryLangID="ES"
TransactionIdentifier="{{TransactionIdentifier}}"
ClientReference="{{ClientReference}}">
<!-- Origin fields required: Avail did not provide Name/Address for the GPS origin.
Leave Destination* empty: destination was identified by IATA. -->
<TransferAddress
OriginName="Hotel Test"
OriginAddress="Origin Test Address"
OriginAddress2=""
OriginPostalCode=""
DestinationName=""
DestinationAddress=""
DestinationAddress2=""
DestinationPostalCode=""
/>
<Concepts>
<CommitRequestV2Concept>
<ConceptBookingCode>{{ConceptBookingCode_1}}</ConceptBookingCode>
<Guests>
<Guest>
<GivenName>FIRST NAME</GivenName>
<Surname>LAST NAME</Surname>
<BirthDate>YYYY-MM-DD</BirthDate>
<PhoneNumber>XXXXXXXXX</PhoneNumber>
</Guest>
</Guests>
<Transfer ContactPhone="XXXXXXXXX" TransportDataOrigin="FLIGHT_NUMBER"/>
</CommitRequestV2Concept>
<CommitRequestV2Concept>
<ConceptBookingCode>{{ConceptBookingCode_2}}</ConceptBookingCode>
<Guests>
<Guest>
<GivenName>FIRST NAME</GivenName>
<Surname>LAST NAME</Surname>
<BirthDate>YYYY-MM-DD</BirthDate>
<PhoneNumber>XXXXXXXXX</PhoneNumber>
</Guest>
</Guests>
<Transfer ContactPhone="XXXXXXXXX" TransportDataDestination="FLIGHT_NUMBER"/>
</CommitRequestV2Concept>
</Concepts>
</objRequest>
</DestServicesCommitV2>
</soap:Body>
</soap:Envelope>

Airport (ID) → Hotel (GPS)

Origin identified by Location ID, destination by GPS coordinates.

<TransferOptions Type="ROUNDTRIP" LocationOriginID="L8" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationDestination Type="H">
<Name>Hotel Test</Name>
<Address>Address Destination Test</Address>
<Coordinates>
<Latitude>52.3657</Latitude>
<Longitude>4.88807</Longitude>
</Coordinates>
<IATA></IATA>
</LocationDestination>
</TransferOptions>
info

Only LocationDestination appears as a subnode — origin uses the LocationOriginID attribute directly in TransferOptions. There is no LocationOrigin subnode when searching by ID.


Hotel (ID) → Airport (IATA)

Traditional flow with no GPS — included here to illustrate how ID and IATA combine.

<TransferOptions Type="ROUNDTRIP" LocationOriginID="H1559666" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationDestination Type="A">
<Name></Name>
<Address></Address>
<Coordinates>
<Latitude></Latitude>
<Longitude></Longitude>
</Coordinates>
<IATA>AMS</IATA>
</LocationDestination>
</TransferOptions>