GPS Transfer Certification
Before activating GPS coordinate-based transfer search in a production environment, integrators must complete this certification process. It validates that the full booking flow (Avail → Book → Commit) is implemented correctly, including edge cases and negative validations.
Make sure you have read the Coordinate-based Transfer Search guide before running these tests.
How to certify
- Execute all test cases described below in the PRO environment.
- Fill in the following table with the booking references (Locator) generated in each case.
- Send the completed table by email to helpdesk@ineedtours.com with the subject line: GPS Certification Test Suite - [CompanyName]
- Our team will review and contact you with the next steps.
| Case | Name | Locator | Observations |
|---|---|---|---|
| 1 | Baseline: Transfer Avail without GPS (traditional IDs) | ||
| 2 | Hotel → Airport (GPS + IATA), Palma de Mallorca | ||
| 3 | Port → Airport (GPS + IATA), Malaga | ||
| 4 | Station → Airport (GPS + IATA), Amsterdam | ||
| 5 | Hotel → Airport with Commit + TransferAddress (GPS + IATA), Madrid | ||
| 6 | Negative validation Commit: TransferAddress with insufficient data | ||
| 7 | GPS (origin) + IATA (destination), Amsterdam (without Type) | ||
| 8 | Negative validation: redundant data and incompatible combination | Not generated | |
| 9 | Negative validation: insufficient data | Not generated |
To avoid cancellation fees, bookings must be made at least 4 months ahead of the date the tests are executed. Update the dates in each test case accordingly before running them.
Request structure
All test cases use DestServicesAvailV2. The templates below show the full envelope structure
once — each test case section only shows the differentiating TransferOptions node.
AVAIL — GPS coordinate search
<?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>
<!-- Date range: at least 4 months ahead of execution date -->
<StayDateRange Start="YYYY-MM-DD" End="YYYY-MM-DD"/>
<Occupations>
<!-- Repeat one AvailRequestV2Occupation per passenger -->
<AvailRequestV2Occupation>
<Type>ADL</Type> <!-- ADL / CHD / INF -->
<Age>30</Age>
</AvailRequestV2Occupation>
</Occupations>
<!-- ↓ This node varies per test case — see each case section below -->
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="HH:MM" LocationDestinationTime="HH:MM">
<!-- Type is optional: A=Airport, H=Hotel, S=Station, P=Port.
Omit it to resolve purely by coordinate proximity. -->
<LocationOrigin Type="H">
<!-- Name and Address are passed through to Commit via TransferAddress.
Required when the Commit must include origin address data. -->
<Name>Origin name</Name>
<Address>Origin address</Address>
<Coordinates>
<Latitude>XX.XXXX</Latitude>
<Longitude>YY.YYYY</Longitude>
</Coordinates>
<IATA></IATA> <!-- Leave empty when using coordinates -->
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name>
<Address></Address>
<Coordinates>
<!-- Airport coordinates can be used instead of IATA (as a fallback) -->
<Latitude></Latitude>
<Longitude></Longitude>
</Coordinates>
<IATA>XYZ</IATA> <!-- 3-letter IATA code -->
</LocationDestination>
</TransferOptions>
</objRequest>
</DestServicesAvailV2>
</soap:Body>
</soap:Envelope>
Commit — with TransferAddress
The TransferAddress node passes the exact physical address of the GPS point to the provider.
Whether it is required depends on whether Name and Address were provided in the Avail:
Avail Name + Address | TransferAddress in Commit |
|---|---|
| Both provided (non-empty) | Optional — the system already has the address data |
| Missing or empty | Required — must be sent in Commit or the request is rejected |
<?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="TEST_GPS_CERT_XX">
<!-- Only include fields for points that used GPS in Avail.
Leave Destination* empty if destination was identified by IATA. -->
<TransferAddress
OriginName="Physical name of the GPS origin point"
OriginAddress="Street address"
OriginAddress2="Additional address info"
OriginPostalCode="Postal code"
DestinationName=""
DestinationAddress=""
DestinationAddress2=""
DestinationPostalCode=""
/>
<Concepts>
<!-- One CommitRequestV2Concept per trip direction (outbound + return) -->
<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>
Note on the Type attribute and coordinate accuracy
The Type attribute (A=Airport, H=Hotel, S=Station, P=Port) is optional in
LocationOrigin and LocationDestination.
- If
Typeis omitted, point resolution depends exclusively on the accuracy of the provided coordinates — the system selects the nearest location without filtering by type. - Even when coordinates are provided with
Type="H",Type="S"orType="P", removing the attribute shifts resolution entirely to coordinate precision.
Full booking flow tests (Avail → Book → Commit)
Case 1 — Baseline: Transfer Avail without GPS (traditional IDs)
Confirm that the end-to-end flow (Avail → Book → Commit) works with traditional IDs before testing GPS.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | L4714 — Montego Bay Airport (MBJ), Jamaica |
| Destination | H1559666 — Hotel Riu Negril, Negril, Jamaica |
| Origin time | 14:15 |
| Destination time | 16:15 |
| Pax | 2 ADL (30 years old) |
| Dates | 2026-07-12 → 2026-07-20 |
Pass criteria: Avail returns results, booking is confirmed successfully.
<!-- Traditional IDs — no LocationOrigin/LocationDestination child nodes -->
<TransferOptions Type="ROUNDTRIP"
LocationOriginID="L4714" LocationOriginTime="14:15"
LocationDestinationID="H1559666" LocationDestinationTime="16:15" />
Case 2 — Hotel → Airport (GPS + IATA), Palma de Mallorca
GPS hotel origin + IATA airport destination. Validates Type="H" coordinate resolution and
end-to-end flow.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 39.5750, 2.6511 with Type="H" — Hotel area, Palma de Mallorca |
| Destination | IATA PMI with Type="A" — Palma de Mallorca Airport |
| Origin time | 10:00 |
| Destination time | 15:00 |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Avail resolves origin to Location L543. Booking confirmed successfully.
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="H">
<Name>Hotel Origin</Name>
<Address>Address Origin</Address>
<Coordinates>
<Latitude>39.57501906180449</Latitude>
<Longitude>2.6511304348249034</Longitude>
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates><Latitude></Latitude><Longitude></Longitude></Coordinates>
<!-- Airport alternative: Lat 39.5520384756392 / Lon 2.738954410467207 -->
<IATA>PMI</IATA>
</LocationDestination>
</TransferOptions>
Case 3 — Port → Airport (GPS + IATA), Malaga
Validates Type="P" (Port) coordinate resolution.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 36.7177, -4.4205 with Type="P" — Port of Malaga |
| Destination | IATA AGP with Type="A" — Malaga-Costa del Sol Airport |
| Origin time | 10:00 |
| Destination time | 15:00 |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Avail resolves origin to Location L7615, destination to L525. Booking confirmed successfully.
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="P">
<Name>Port of Malaga</Name>
<Address>Address Origin</Address>
<Coordinates>
<Latitude>36.7177087</Latitude>
<Longitude>-4.4204626</Longitude>
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates><Latitude></Latitude><Longitude></Longitude></Coordinates>
<!-- Airport alternative: Lat 36.67760942658357 / Lon -4.488650236946915 -->
<IATA>AGP</IATA>
</LocationDestination>
</TransferOptions>
Case 4 — Station → Airport (GPS + IATA), Amsterdam
Validates Type="S" (Station) coordinate resolution in an area with multiple nearby location
types (city center, port, station).
Amsterdam Central Station (52.3775, 4.8965) is surrounded by other location types — a
City Center (L9) and a Port (L8860) are also nearby. The Type="S" filter must discriminate
correctly and resolve to Location L8859, not to L9 or L8860.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 52.3775, 4.8965 with Type="S" — Amsterdam Central Station |
| Destination | IATA AMS with Type="A" — Amsterdam Schiphol Airport |
| Origin time | 10:00 |
| Destination time | 15:00 |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Avail resolves origin to Location L8859 (not L9 or L8860), destination to L8. Booking confirmed successfully.
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="S">
<Name>Amsterdam Central Station</Name>
<Address>Address Origin</Address>
<Coordinates>
<Latitude>52.37751409315019</Latitude>
<Longitude>4.896546939150029</Longitude>
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates><Latitude></Latitude><Longitude></Longitude></Coordinates>
<!-- Airport alternative: Lat 52.31706823264256 / Lon 4.7464935572072 -->
<IATA>AMS</IATA>
</LocationDestination>
</TransferOptions>
Case 5 — Hotel → Airport with Commit + TransferAddress (GPS + IATA), Madrid
Validates the full end-to-end flow including a Commit with TransferAddress. Since the
Avail in this case already includes Name and Address for the GPS origin, TransferAddress
is technically optional — but this case validates that the node is accepted and processed
correctly when provided. Only Origin* fields are populated; Destination* fields are left
empty because the destination was identified by IATA.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 40.4052, -3.6879 with Type="H" — Atocha area, Madrid |
| Destination | IATA MAD with Type="A" — Madrid-Barajas Airport |
| Origin time | 10:00 |
| Destination time | 15:00 |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Avail resolves origin to Location L589. Commit with TransferAddress is accepted and booking is confirmed.
Avail — TransferOptions
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="H">
<Name>Name Origin</Name>
<Address>Address Origin</Address>
<Coordinates>
<Latitude>40.405182097641</Latitude>
<Longitude>-3.6879263655158905</Longitude>
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates><Latitude></Latitude><Longitude></Longitude></Coordinates>
<!-- Airport alternative: Lat 40.490461253908926 / Lon -3.5587827006887927 -->
<IATA>MAD</IATA>
</LocationDestination>
</TransferOptions>
Commit — TransferAddress
<!-- Destination fields left empty: destination was identified by IATA, not GPS -->
<TransferAddress
OriginName="NAME ORIGIN"
OriginAddress="ADDRESS ORIGIN"
OriginAddress2="ADDRESS2 ORIGIN"
OriginPostalCode="PC1234"
DestinationName=""
DestinationAddress=""
DestinationAddress2=""
DestinationPostalCode=""
/>
Case 6 — Negative validation Commit: TransferAddress with insufficient data
Verify that the Commit is rejected when the GPS origin has no name data available from either
source: Name is empty in Avail and OriginName is empty in TransferAddress. The system
requires the origin name to be provided through one of the two channels.
The Avail → Book flow will generate a booking reference, but the Commit must fail.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 40.4052, -3.6879 with Type="H" — Atocha area, Madrid. Name intentionally left empty in Avail |
| Destination | IATA MAD with Type="A" — Madrid-Barajas Airport |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Commit rejected — error In the Transfer node, OriginName is required.
Avail — TransferOptions (missing Name)
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="H">
<Name></Name> <!-- Intentionally empty -->
<Address>Address Origin</Address>
<Coordinates>
<Latitude>40.405182097641</Latitude>
<Longitude>-3.6879263655158905</Longitude>
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates><Latitude></Latitude><Longitude></Longitude></Coordinates>
<IATA>MAD</IATA>
</LocationDestination>
</TransferOptions>
Commit — TransferAddress (empty OriginName)
<!-- OriginName is empty — this must be rejected by the system -->
<TransferAddress
OriginName=""
OriginAddress="ADDRESS ORIGIN"
OriginAddress2="ADDRESS2 ORIGIN"
OriginPostalCode="PC1234"
DestinationName=""
DestinationAddress=""
DestinationAddress2=""
DestinationPostalCode=""
/>
Case 7 — GPS (origin) + IATA (destination), Amsterdam (without Type)
Validate a search with GPS origin without the Type attribute. Resolution depends
exclusively on coordinate accuracy — no type filter applied.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 52.3657, 4.88807 — Amsterdam City Center, no Type |
| Destination | IATA AMS with Type="A" — Amsterdam Schiphol Airport |
| Origin time | 10:00 |
| Destination time | 15:00 |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-06-10 → 2026-06-17 |
Pass criteria: Avail resolves origin to Location L9 (City Center — nearest location to these coordinates with no type filter). Booking confirmed successfully.
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin> <!-- No Type attribute -->
<Name>Hotel Origin</Name>
<Address>Address Origin</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>
<!-- Airport alternative: Lat 52.31706823264256 / Lon 4.7464935572072 -->
<IATA>AMS</IATA>
</LocationDestination>
</TransferOptions>
Avail validation tests
The following cases validate that the system rejects invalid requests with clear, actionable errors. No booking reference is generated for these cases.
For the full list of error codes and messages, see the Error List page.
Case 8 — Negative validation: redundant data and incompatible combination
Verify that the system rejects the request with all applicable errors:
- Exclusivity — cannot send Coordinates and IATA simultaneously for the same point.
- Type/IATA coherence — IATA requires
Type="A", notType="H". - Same origin/destination — origin and destination coordinates are identical.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | GPS 52.3657, 4.88807 + IATA AMS + Type="H" — coordinates and IATA sent simultaneously; Type contradicts IATA |
| Destination | GPS 52.3657, 4.88807 + IATA AMS + Type="A" — same violation; same coordinates as origin |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Request rejected with multiple validation errors covering exclusivity, Type/IATA coherence, and same-point origin/destination.
<?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="2026-08-10" End="2026-08-17"/>
<Occupations>
<AvailRequestV2Occupation><Type>ADL</Type><Age>30</Age></AvailRequestV2Occupation>
</Occupations>
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="H">
<Name>Hotel Origin</Name>
<Address>Address Origin</Address>
<Coordinates>
<Latitude>52.3657</Latitude>
<Longitude>4.88807</Longitude>
</Coordinates>
<IATA>AMS</IATA> <!-- Error: coordinates + IATA simultaneously; Type="H" incompatible with IATA -->
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates>
<Latitude>52.3657</Latitude> <!-- Error: same as origin coordinates -->
<Longitude>4.88807</Longitude>
</Coordinates>
<IATA>AMS</IATA> <!-- Error: coordinates + IATA simultaneously -->
</LocationDestination>
</TransferOptions>
</objRequest>
</DestServicesAvailV2>
</soap:Body>
</soap:Envelope>
Case 9 — Negative validation: insufficient data
Verify that the system rejects with clear errors:
- Partial coordinate — origin has only
Latitude, missingLongitude. - Empty destination — no coordinates, no IATA code, no location ID provided.
| Field | Value |
|---|---|
| Type | ROUNDTRIP |
| Origin | Partial coordinate: Latitude=10.5, Longitude empty — Type="H" |
| Destination | Completely empty: no coordinates, no IATA, no ID — Type="A" |
| Pax | 1 ADL (30 years old) |
| Dates | 2026-08-10 → 2026-08-17 |
Pass criteria: Request rejected — error for incomplete coordinates (origin) and missing identification data (destination).
<?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="2026-08-10" End="2026-08-17"/>
<Occupations>
<AvailRequestV2Occupation><Type>ADL</Type><Age>30</Age></AvailRequestV2Occupation>
</Occupations>
<TransferOptions Type="ROUNDTRIP" LocationOriginTime="10:00" LocationDestinationTime="15:00">
<LocationOrigin Type="H">
<Name></Name><Address></Address>
<Coordinates>
<Latitude>10.5</Latitude>
<Longitude></Longitude> <!-- Error: missing Longitude -->
</Coordinates>
<IATA></IATA>
</LocationOrigin>
<LocationDestination Type="A">
<Name></Name><Address></Address>
<Coordinates>
<Latitude></Latitude> <!-- Error: no coordinates, no IATA, no ID -->
<Longitude></Longitude>
</Coordinates>
<IATA></IATA>
</LocationDestination>
</TransferOptions>
</objRequest>
</DestServicesAvailV2>
</soap:Body>
</soap:Envelope>