Sell our private transfers in your own platform with live prices and instant confirmation.
The USA Caribbean Tours Transfers API lets travel agencies, OTAs and resellers sell our private airport and point-to-point transfers in their own website or booking system, with live prices and instant confirmation.
The API follows the ETG Transfers API v1 format, so partners already connected to that standard can reuse their integration. The same endpoints are also served under /api/v1/etg.
Credentials are issued by our team for each partner. To request access, contact us or apply to our partner program. You will receive a username and password together with your agreed currency and cancellation terms.
Every request uses HTTP Basic authentication with the username and password we issue you. Send it over HTTPS only and keep it on your server: never put it in a browser, mobile app or public repository.
Authorization: Basic base64(username:password)Offers and orders are scoped to your account: you can only book, read or cancel what your own credentials created.
POST with a JSON body (Content-Type: application/json).{ "amount": 95.0, "currency": "USD" }.start_date_time as the local wall-clock time of the pickup; a trailing Z is accepted but read as local time, not UTC. We answer with the same time and the pickup's real UTC offset, for example 2026-12-15T14:30:00-04:00.{ "offers": [] }.{ "code": string, "error": string } (see Errors).Returns bookable offers for a route. Each offer has a fixed price and can be booked for up to 24 hours (or until the minimum advance time before the trip, whichever comes first).
| Field | Type | Required | Description |
|---|---|---|---|
| passengers | integer | Yes | Number of passengers, 1–100. |
| start_date_time | string | Yes | Pickup date and local time, RFC 3339. |
| start_point | object | Yes | { "type": "iata", "iata": "PUJ" } for an airport, or { "type": "coordinates", "coordinates": { "lat": 18.56, "lon": -68.37 } } for any other address. address (text) is optional. |
| end_point | object | Yes | Same format as start_point. |
| children_seat_0 | integer | No | Cradles, 0–13 kg (under 1 year). |
| children_seat_1 | integer | No | Child seats, 9–18 kg (1–4 years). |
| children_seat_2 | integer | No | Child seats, 15–25 kg (3–7 years). |
| children_seat_3 | integer | No | Child seats, 22–36 kg (6–12 years). |
curl -X POST https://usacaribbeantours.com/api/v1/transfers/search \
-u "YOUR_USERNAME:YOUR_PASSWORD" \
-H "Content-Type: application/json" \
-d '{
"passengers": 4,
"children_seat_1": 1,
"start_date_time": "2026-12-15T14:30:00Z",
"start_point": { "type": "iata", "iata": "PUJ" },
"end_point": {
"type": "coordinates",
"coordinates": { "lat": 18.6812, "lon": -68.4124 },
"address": "Hotel Riu Palace, Bávaro"
}
}'{
"start_date_time": "2026-12-15T14:30:00-04:00",
"offers": [
{
"id": "cmh2x8k1p0001qz8l3f9a7b2c",
"service_type": "transfer",
"transfer_category": "economy_van",
"car_model": "Toyota Hiace",
"seats": 7,
"luggage_places": 7,
"estimated_duration_minutes": 35,
"distance": 24.6,
"included_waiting_time_minutes": 60,
"children_seat_0": 0,
"children_seat_1": 1,
"children_seat_2": 0,
"children_seat_3": 0,
"price": { "amount": 95.0, "currency": "USD" },
"upsells": [
{ "id": "children_seat_1", "type": "children_seat_1", "price": 10, "count": 1, "max_count": 2 }
],
"tolls_included": true,
"gratuity_included": false,
"free_cancel_until": "2026-12-14T14:30:00-04:00"
}
]
}id is the offer_id you send to /book.distance is in kilometres. One offer per vehicle category and capacity (the cheapest).Confirms an offer. The price is always the one returned by search. The booking must ask for the same child seats the offer was searched with.
| Field | Type | Required | Description |
|---|---|---|---|
| offer_id | string | Yes | The offer id from /search. |
| passengers | integer | Yes | Cannot exceed the offer's seats. |
| luggage_places | integer | Yes | Number of suitcases. |
| flight_number | string | Yes | Flight number, or "No flight" for non-airport pickups. |
| shield_text | string | Yes | Name shown on the driver's sign (can be empty). |
| main_passenger | object | Yes | first_name, last_name, phone, email (required); middle_name (optional). |
| start_point | object | Yes | Pickup point, same format as search. |
| end_point | object | Yes | Drop-off point. |
| comment | string | No | Notes for the driver. |
| upsells | array | No | Extras from the offer: [{ "id": "children_seat_1", "count": 1 }]. |
| sport_luggage_places | integer | No | Sports equipment items. |
| wheelchairs_places | integer | No | Wheelchairs. |
| animals_places | integer | No | Pets. |
| children_seat_0 | integer | No | Cradles, 0–13 kg (under 1 year). Must match the search. |
| children_seat_1 | integer | No | Child seats, 9–18 kg (1–4 years). Must match the search. |
| children_seat_2 | integer | No | Child seats, 15–25 kg (3–7 years). Must match the search. |
| children_seat_3 | integer | No | Child seats, 22–36 kg (6–12 years). Must match the search. |
{
"offer_id": "cmh2x8k1p0001qz8l3f9a7b2c",
"passengers": 4,
"luggage_places": 4,
"children_seat_1": 1,
"flight_number": "AA1234",
"shield_text": "SMITH FAMILY",
"comment": "Arriving with a stroller",
"main_passenger": {
"first_name": "John",
"last_name": "Smith",
"phone": "+15551234567",
"email": "john.smith@example.com"
},
"start_point": { "type": "iata", "iata": "PUJ" },
"end_point": {
"type": "coordinates",
"coordinates": { "lat": 18.6812, "lon": -68.4124 },
"address": "Hotel Riu Palace, Bávaro"
}
}{
"order_id": "T-7KQ4M2X",
"pin_code": "4821",
"supplier_link": "https://usacaribbeantours.com/admin/external-api/etg/orders/T-7KQ4M2X",
"start_time": "2026-12-15T14:30:00-04:00",
"distance": 24.6,
"estimated_duration_minutes": 35,
"included_waiting_time_minutes": 60,
"buffer_time_minutes": 0,
"passengers": 4,
"luggage_places": 4,
"sport_luggage_places": 0,
"animals": 0,
"wheelchairs_places": 0,
"children_seat_0": 0,
"children_seat_1": 1,
"children_seat_2": 0,
"children_seat_3": 0,
"flight_number": "AA1234",
"shield_text": "SMITH FAMILY",
"comment": "Arriving with a stroller",
"price": { "amount": 95.0, "currency": "USD" },
"meeting_instructions": "Our driver waits at the arrivals exit holding a sign with your name."
}order_id is short and easy to read over the phone. Store it: you need it for /status and /cancel.pin_code lets the passenger identify themselves to the driver.supplier_link points to the order in our back office, for our support team.meeting_instructions and upsells are only present when they apply.Returns the current state of an order.
| Field | Type | Required | Description |
|---|---|---|---|
| order_id | string | Yes | The order id from /book. |
{
"status": "completed",
"order_id": "T-7KQ4M2X",
"start_time": "2026-12-15T14:30:00-04:00",
"free_cancel_until": "2026-12-14T14:30:00-04:00",
"price": { "amount": 95.0, "currency": "USD" },
"transfer_category": "economy_van",
"main_passenger": { "first_name": "John", "last_name": "Smith", "phone": "+15551234567" },
"passengers": 4,
"luggage_places": 4,
"sport_luggage_places": 0,
"animals": 0,
"included_waiting_time_minutes": 60,
"buffer_time_minutes": 0,
"comment": "Arriving with a stroller",
"shield_text": "SMITH FAMILY",
"driver_info": {
"first_name": "Carlos",
"last_name": "Pérez",
"phone": "+18095551234",
"carrier_company_name": "USA Caribbean Tours"
},
"car_info": { "car_model": "Toyota Hiace", "plate_number": "A123456", "color": "White" },
"meeting_info": { "instructions": "Arrivals hall, exit B." }
}status is completed (confirmed and active) or cancelled.driver_info, car_info and meeting_info appear only after we assign them. Call /status again closer to the trip to pick them up.Cancels an order. It always succeeds, even when a driver is already assigned. Inside the free cancellation window (free_cancel_until) the penalty is 0; after it, the penalty agreed in your contract applies (never more than the order price).
| Field | Type | Required | Description |
|---|---|---|---|
| order_id | string | Yes | The order id from /book. |
{ "penalty": { "amount": 0, "currency": "USD" } }Cancelling the same order again is safe and returns the same penalty.
{ "code": "validation_error", "error": "passengers must be an integer between 1 and 100" }| code | HTTP | Meaning |
|---|---|---|
| unauthorized | 401 | Missing or wrong credentials, or the account is disabled. |
| validation_error | 400 | The body is not valid JSON or a field is missing or invalid. The message names the field. |
| offer_not_found | 400 | The offer_id does not exist or belongs to another account. |
| offer_expired | 400 | The offer is no longer bookable. Run a new search. |
| order_not_found | 400 | The order_id does not exist or belongs to another account. |
| internal_error | 500 | Unexpected error on our side. Safe to retry; contact us if it persists. |
transfer_category uses these values. car_model gives the actual make and model (for example "Toyota Hiace"), and seats the real capacity.
offer_expired, search again.order_id and pin_code and give the passenger the pin.{ "offers": [] } as "not available", not as a failure.Questions about the integration? Contact us.