Skip to main content

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.

Before you start

Make sure you have read the Coordinate-based Transfer Search guide before running these tests.

How to certify

  1. Execute all test cases described below in the PRO environment.
  2. Fill in the following table with the booking references (Locator) generated in each case.
  3. Send the completed table by email to helpdesk@ineedtours.com with the subject line: GPS Certification Test Suite - [CompanyName]
  4. Our team will review and contact you with the next steps.
CaseNameLocatorObservations
1Baseline: Transfer Avail without GPS (traditional IDs)
2Hotel → Airport (GPS + IATA), Palma de Mallorca
3Port → Airport (GPS + IATA), Malaga
4Station → Airport (GPS + IATA), Amsterdam
5Hotel → Airport with Commit + TransferAddress (GPS + IATA), Madrid
6Negative validation Commit: TransferAddress with insufficient data
7GPS (origin) + IATA (destination), Amsterdam (without Type)
8Negative validation: redundant data and incompatible combinationNot generated
9Negative validation: insufficient dataNot generated
Date requirement

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.

<?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 + AddressTransferAddress in Commit
Both provided (non-empty)Optional — the system already has the address data
Missing or emptyRequired — 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 Type is 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" or Type="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.

FieldValue
TypeROUNDTRIP
OriginL4714 — Montego Bay Airport (MBJ), Jamaica
DestinationH1559666 — Hotel Riu Negril, Negril, Jamaica
Origin time14:15
Destination time16:15
Pax2 ADL (30 years old)
Dates2026-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.

FieldValue
TypeROUNDTRIP
OriginGPS 39.5750, 2.6511 with Type="H" — Hotel area, Palma de Mallorca
DestinationIATA PMI with Type="A" — Palma de Mallorca Airport
Origin time10:00
Destination time15:00
Pax1 ADL (30 years old)
Dates2026-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.

FieldValue
TypeROUNDTRIP
OriginGPS 36.7177, -4.4205 with Type="P" — Port of Malaga
DestinationIATA AGP with Type="A" — Malaga-Costa del Sol Airport
Origin time10:00
Destination time15:00
Pax1 ADL (30 years old)
Dates2026-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).

note

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.

FieldValue
TypeROUNDTRIP
OriginGPS 52.3775, 4.8965 with Type="S" — Amsterdam Central Station
DestinationIATA AMS with Type="A" — Amsterdam Schiphol Airport
Origin time10:00
Destination time15:00
Pax1 ADL (30 years old)
Dates2026-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.

FieldValue
TypeROUNDTRIP
OriginGPS 40.4052, -3.6879 with Type="H" — Atocha area, Madrid
DestinationIATA MAD with Type="A" — Madrid-Barajas Airport
Origin time10:00
Destination time15:00
Pax1 ADL (30 years old)
Dates2026-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.

FieldValue
TypeROUNDTRIP
OriginGPS 40.4052, -3.6879 with Type="H" — Atocha area, Madrid. Name intentionally left empty in Avail
DestinationIATA MAD with Type="A" — Madrid-Barajas Airport
Pax1 ADL (30 years old)
Dates2026-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.

FieldValue
TypeROUNDTRIP
OriginGPS 52.3657, 4.88807 — Amsterdam City Center, no Type
DestinationIATA AMS with Type="A" — Amsterdam Schiphol Airport
Origin time10:00
Destination time15:00
Pax1 ADL (30 years old)
Dates2026-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.

tip

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:

  1. Exclusivity — cannot send Coordinates and IATA simultaneously for the same point.
  2. Type/IATA coherence — IATA requires Type="A", not Type="H".
  3. Same origin/destination — origin and destination coordinates are identical.
FieldValue
TypeROUNDTRIP
OriginGPS 52.3657, 4.88807 + IATA AMS + Type="H" — coordinates and IATA sent simultaneously; Type contradicts IATA
DestinationGPS 52.3657, 4.88807 + IATA AMS + Type="A" — same violation; same coordinates as origin
Pax1 ADL (30 years old)
Dates2026-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:

  1. Partial coordinate — origin has only Latitude, missing Longitude.
  2. Empty destination — no coordinates, no IATA code, no location ID provided.
FieldValue
TypeROUNDTRIP
OriginPartial coordinate: Latitude=10.5, Longitude empty — Type="H"
DestinationCompletely empty: no coordinates, no IATA, no ID — Type="A"
Pax1 ADL (30 years old)
Dates2026-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>