Integration flow
Treat the API as a selection flow. A product tells you what can be sold, a departure tells you when it runs, departure detail tells you which price and room options are valid, price preview confirms the selected total and coupon, and only then should you create a contact or reservation.
-
1Find a product
GET /productsorPOST /products -
2Choose a departure
GET /products/{id}/departures -
3Choose price and rooms
GET /products/{product_id}/departures/{departure_id} -
4Preview price and coupon
POST .../price-preview -
5Create contact or reservation
POST .../contactsorPOST .../reservations
"rooms":{"double":1} means one double room for two passengers, so reservation creation must send exactly two passenger objects.
Not sure where to start with products?
If the catalog is large and you have no obvious first product to show, do not page through the raw /products list hoping to find something. Start with discovery: /product-groups rolls every visible product up by destination or by category, so you can let the traveller pick a place or a theme first and then drill into just the products that match.
Say someone is planning a trip to Europe. Group products by destination at the continent level, find the Europe group in the response, and follow its products_url — that link is a ready-made /products drill-down that returns every product travelling there. From that shorter list you are right back on the main flow: choose a departure, load its detail to pick id_price and rooms, preview the selected price or coupon if needed, then create a contact or reservation.
curl -sS 'https://api.deturista.com/v1/product-groups?by=destination&group=continent&include_top_ranked=1' \
-H 'X-API-Key: YOUR_API_KEY'
Prefer browsing by interest rather than by map? Swap by=destination for by=category to group the same catalog by theme instead. Either way each group comes back with a product total and its own products_url, and setting include_top_ranked=1 adds a few real product previews so you have something to display before the traveller has even picked. See Product groups for the full set of grouping options.
Quick start
Ask DeTurista for an API key, then send it in the X-API-Key header. Keep the key private and do not put it in browser-side JavaScript.
Your first call
Got your key? Paste this into a terminal (swap in your key) for a successful 200 right away. It lists one product so you can confirm auth and see the response envelope before building anything.
curl -sS 'https://api.deturista.com/v1/products?limit=1' \
-H 'X-API-Key: YOUR_API_KEY'
Success looks like { "success": 1, "data": { "total": …, "results": [ … ] } }. A 401 unauthorized means the key is missing or wrong — check the X-API-Key header. From here, follow the Integration flow to turn a product into a contact or reservation.
GET example
curl -sS 'https://api.deturista.com/v1/products?limit=2&page=1' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Authenticate every call | Send X-API-Key from your server. Do not expose the key in browser-side JavaScript. |
| Store the product id | Use data.results[].id as the product_id for product detail and departure calls. |
| Read sale flags | can_buy enables payment_option=buy. can_deposit enables payment_option=deposit when the selected departure price also has deposit values; it is false when the product has deposit configured but no applicable installments. |
POST example
curl -sS 'https://api.deturista.com/v1/products' \
-X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-d '{"limit":2,"page":1,"id_destination":410,"id_category":154,"month":6,"year":2026}'
| Rule | How to use this response |
|---|---|
| Same search contract | POST accepts the same filters as GET. Use it when a JSON body is easier for your integration. |
| Use 1-based pagination | page=1 is the first page. limit is capped at 100. |
Exact IDs example
curl -sS 'https://api.deturista.com/v1/products?id_products=1924,2158' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Strict ids | All requested product ids must be visible to the authenticated consumer. If any one is missing or hidden, the request returns 404 not_found. |
| Limited filters | Do not combine id_products with listing filters or pagination. |
| Preserved order | The result order follows the requested id order, so this mode is useful for refreshing products already selected by your app. |
Detail example
curl -sS 'https://api.deturista.com/v1/products/2158' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Confirm current visibility | Call product detail before showing a saved product. A product that is no longer visible returns 404 not_found. |
| Decide available actions | If can_buy and can_deposit are both false, present inquiry/contact actions instead of a reservation checkout. |
| Fetch departures next | Product detail describes the offer. Use /products/{id}/departures to show concrete dates and availability. |
Departure example
curl -sS 'https://api.deturista.com/v1/products/2158/departures?limit=100&page=1' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Show date choices | Present start_date, end_date, nights, itinerary_days, inventory fields, last_seats, route, luggage, and lowest price so the end user can choose a departure. Format dates on the client side. |
| Use filters for UI | data.filters describes all matching departures, even when data.results is paginated. |
| Do not select price here | The departure list gives the departure id and display summary. Call departure detail to get the valid id_price values. |
Departure detail example
curl -sS 'https://api.deturista.com/v1/products/2158/departures/9876' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Save the selected price | Use data.prices[].id as id_price for contact or reservation creation. |
| Match room types | Each selected room type must exist in the selected price's amounts[].room_type. Do not send a room type that is not priced. |
| Present travel details | Show price, hotels, circuits, transfers, assistance, flight legs, luggage, flexible options, and deposit values before checkout. |
Price preview example
curl -sS 'https://api.deturista.com/v1/products/2158/departures/9876/price-preview' \
-X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-d '{"id_price":4321,"rooms":{"double":1},"coupon_code":"HOTSALE10"}'
| Rule | How to use this response |
|---|---|
| Preview before submit | Use this response to show the selected total and the discounted new_total_ars / new_total_usd before creating a contact or reservation. |
| Suggested is not applied | default_code can prefill a coupon field, but the discount is only applied when that code is submitted as coupon_code. |
| Reuse the applied code | When applied=true, send the same code as coupon_code in the contact or reservation request. The create endpoint recalculates the coupon again server-side. |
Departure contact example
curl -sS 'https://api.deturista.com/v1/products/2158/departures/9876/contacts' \
-X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-d '{"firstname":"Ana","lastname":"Gomez","email":"ana@example.com","phone":"1155550000","origin":"contact","id_price":4321,"rooms":{"double":1},"coupon_code":"HOTSALE10"}'
| Rule | How to use this response |
|---|---|
| Use for leads | Create a contact when the user asks for information, WhatsApp, or a call instead of completing a reservation. |
| Respect action availability | origin=whatsapp and origin=call are only accepted while advisors are currently available for that action. If not, the API returns 400 invalid_request; use origin=contact for the “quiero que me contacten” fallback. |
| Use valid selection ids | product_id, departure_id, and id_price must come from the previous product and departure calls. |
| Rooms imply pax | "rooms":{"double":1} means one double room, which is two passengers. Send rooms; each selected room type must exist in the selected price's amounts[].room_type. |
| Coupons are recalculated | If a coupon was applied in price preview, send the applied code as coupon_code. Contact creation validates and recalculates the coupon again before saving. |
Departure reservation example
curl -sS 'https://api.deturista.com/v1/products/2158/departures/9876/reservations' \
-X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: YOUR_API_KEY' \
-d '{"id_price":4321,"payment_option":"buy","rooms":{"double":1},"customer":{"firstname":"Ana","lastname":"Gomez","email":"ana@example.com","phone":"1155550000","cuil":"20987333015"},"passengers":[{"firstname":"Ana","lastname":"Gomez","document":"30999111","nationality":"Argentina","birth_date":"1990-01-01"},{"firstname":"Luis","lastname":"Gomez","document":"30999112","nationality":"Argentina","birth_date":"1988-05-10"}]}'
| Rule | How to use this response |
|---|---|
| Check product flags | payment_option=buy requires can_buy=true. payment_option=deposit requires effective can_deposit=true and a deposit value for the selected departure price. |
| Match passengers to rooms | Send one passenger object per room occupant. One double room requires exactly two passengers; two double rooms require four. |
| Do not send ownership or totals | The API key owns the reservation. Deposit totals and sale values are computed server-side from the selected product, departure, price, and rooms. |
Contact receipt example
curl -sS 'https://api.deturista.com/v1/contacts/12345' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Use API-owned ids | Only contacts created by the authenticated API consumer can be read back by id. |
| Status can change | The receipt returns the current workflow status, not only the status from creation time. |
| Handle 404 carefully | 404 not_found can mean the id does not exist, is outside your entity/site, or belongs to a different consumer. |
Reservation receipt example
curl -sS 'https://api.deturista.com/v1/reservations/765432' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Use API-owned ids | Only reservations created by the authenticated API consumer can be read back by id. |
| Read persisted fields | Read-back returns persisted reservation receipt fields. id_price and payment_option are creation-response fields only. |
| Status can change | The receipt returns the current reservation workflow status. |
Destination example
curl -sS 'https://api.deturista.com/v1/destinations?limit=100&page=1' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Use for navigation | Destinations help build filters and browsing UI. Use a destination id as id_destination in product search. |
| Default product scope is tree | Filtering products by destination includes child destinations unless you send destination_scope=linked. |
| Keep names display-only | Use destination ids for API calls; names, URLs, images, parents, and children are for presentation. |
Category example
curl -sS 'https://api.deturista.com/v1/categories?limit=100&page=1' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Use visible categories | The API returns website-visible categories. Hidden or disabled categories and categories under hidden ancestors are not returned. |
| Default product scope is tree | Filtering products by category includes child categories unless you send category_scope=linked. |
| Use ids for filters | Use category ids in product searches. Treat active as a menu-state field for display. |
Grouped discovery example
curl -sS 'https://api.deturista.com/v1/product-groups?by=destination&group=continent&include_top_ranked=1&top_ranked_limit=3' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Use drill-down URLs | Each group includes a products_url that points to the matching product search. |
| Top ranked is a preview | top_ranked is a compact preview for display. Call products_url for the full listing. |
| Read linked counts precisely | For category linked_parent, total is the exact one-level-up count, while its products_url uses tree scope and may return deeper products. |
Home section examples
type is required: request one section per call. There is no combined home response.
curl -sS 'https://api.deturista.com/v1/home?type=slider' \
-H 'X-API-Key: YOUR_API_KEY'
curl -sS 'https://api.deturista.com/v1/home?type=list' \
-H 'X-API-Key: YOUR_API_KEY'
curl -sS 'https://api.deturista.com/v1/home?type=popup' \
-H 'X-API-Key: YOUR_API_KEY'
curl -sS 'https://api.deturista.com/v1/home?type=banners' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| One section per call | type is required (slider, list, popup, banners). A request without type returns 400 invalid_request. Call once per section to build the home. |
| Render blocks in order | Block responses (slider/list/popup) return blocks sorted by order. Render in that order to reproduce the home layout. |
| Product cards are compact | Product resources and LIST products are compact home cards (image, title, price, discount, nights, service flags) using the same money/flag conventions as /products (price_from_ars/price_from_usd pairs, boolean has_*). They are not the full product row: load /products/{id} for full detail, checkout flags, and relations. |
| LIST products are slider-sized | A LIST block returns at most 20 products (enough for a slider). For the full list of a category use /products?id_category=<id>. |
| Category and destination tiles are summaries | For resource_type of category or destination, resource is a compact tile (id, name, url, image). Use id to drill into /products. |
| Only one popup | The response includes at most one popup block, the first by order, matching the single popup the home page shows. Other block types can repeat. |
| Banners are a section | Request the banners strip with ?type=banners; it returns up to two banners ordered by order under banners. Block sections never include banners. |
Site metadata example
curl -sS 'https://api.deturista.com/v1/site' \
-H 'X-API-Key: YOUR_API_KEY'
| Rule | How to use this response |
|---|---|
| Build footer and contact chrome | Use phone, email, address, social, legal_info, and offices to build the site header and footer. |
| Null-check display fields | Most fields are nullable. Only render what is present rather than assuming every field is set. |
| Analytics keys are not exposed | Pixel, analytics, and verification keys are intentionally omitted; the consuming site manages its own analytics. |
Newsletter subscription example
curl -sS -X POST 'https://api.deturista.com/v1/newsletter' \
-H 'X-API-Key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"firstname": "Ana",
"lastname": "Gomez",
"email": "ana@example.com",
"destination": "EUROPA"
}'
| Rule | How to use this response |
|---|---|
| firstname and email are required | lastname is optional and destination defaults to OTRO (one of OTRO, CARIBE, EUROPA, SUDAMERICA, MUNDO). |
| Duplicate emails are rejected | An already-subscribed email or an invalid field returns 400 invalid_request; a new subscription returns 201 with a receipt. |
Endpoints
Products
GET POST /products
Both methods perform the same listing/search operation. Use GET for simple query-string searches and POST when sending a JSON search body is easier for your client.
Product rows are the first decision point for checkout. Use can_buy to decide whether the full-payment reservation path can be shown, and effective can_deposit to decide whether a deposit reservation path can be shown. If neither action is available, keep the product as an inquiry/contact flow.
Use GET /products/{id} to retrieve one public product visible to the authenticated API consumer.
Use GET /products/{id}/departures to retrieve active future departures and filters for one public product.
Departure rows are meant for the end user's date-selection screen. Present raw dates, duration, remaining seats, lowest displayed price, origin city, hotel stars, luggage, route, and flight inventory hints when present.
Use GET /products/{product_id}/departures/{departure_id} to retrieve the selected departure detail payload, including prepared price rows, included services, and flight details when available.
Use POST /products/{product_id}/departures/{departure_id}/price-preview to preview the selected total and optionally apply a public coupon code before creating a contact or reservation.
Use POST /products/{product_id}/departures/{departure_id}/contacts to create a lead for a selected price and room selection. Leads are persisted with channel set to PUBLIC_API.
Use POST /products/{product_id}/departures/{departure_id}/reservations to create an operational reservation for a selected price, room selection, customer, and passenger list. Reservations are persisted with channel and origin set to PUBLIC_API.
Contacts
GET /contacts/{id}
Contact receipt lookup returns the same receipt fields as contact creation for contacts created by the authenticated API consumer. Contacts owned by another consumer, outside the authenticated entity or site, or created outside the public API return 404 not_found.
Reservations
GET /reservations/{id}
Reservation receipt lookup returns persisted receipt fields for reservations created by the authenticated API consumer. Reservations owned by another consumer, outside the authenticated entity or site, or created outside the public API return 404 not_found. The read-back receipt does not include id_price or payment_option; those fields are returned only by the creation response.
Destinations
GET /destinations
Destinations return the active destination tree visible to the authenticated API consumer. Use GET /destinations/{id} to retrieve one destination.
Categories
GET /categories
Categories return the website-visible category tree for the authenticated API consumer. Use GET /categories/{id} to retrieve one category.
Product groups
GET /product-groups
Product groups return destination or category group totals with drill-down URLs for /products. Set include_top_ranked=1 to include compact previews from real public products.
Home
GET /home
Home returns one section of the home for the authenticated consumer's site. type is required and selects the section: slider, list and popup return the ordered blocks of that type; banners returns the banners strip (up to two). There is no combined response — call once per section. Each block references a product, category, or destination; product resources and LIST products are compact home cards (not the full product row — load /products/{id} for full detail). At most one popup block is returned (the first by order), matching the single popup shown on the home page.
Site
GET /site
Site returns public site and footer metadata for the authenticated consumer's site: contact fields, social links, legal text, and the public office list. Analytics, pixel, and verification keys are not exposed.
Newsletter
POST /newsletter
Newsletter creates an email subscription for the authenticated consumer's site. It reuses the public newsletter validation and duplicate-email guard, so an invalid field or an already-subscribed email returns 400 invalid_request and a new subscription returns 201 with a receipt.
Parameters
Product listing parameters
GET accepts these as query parameters. POST accepts the same keys in a JSON object.
| Name | Type | Description |
|---|---|---|
limit |
integer | Maximum number of products to return. Defaults to 100 and is capped at 100. |
page |
integer | 1-based page number. page=1 is the first page. |
id_products |
array | Exact product ids. Use a comma-separated value in GET or an array in POST. The request fails if any id is not visible to the API consumer. Do not combine with listing filters or pagination. |
id_destination |
integer | Destination id. Child destinations are included by default. |
destination_scope |
tree or linked |
Use tree to include child destinations, or linked to match only direct product-destination links. |
id_category |
integer | Category id. Child categories are included by default. |
category_scope |
tree or linked |
Use tree to include child categories, or linked to match only direct product-category links. |
month |
integer | Departure month from 1 to 12. |
year |
integer | Departure year. Use it together with month to select a specific month in a specific year. |
Product currency is the package base currency used by its prices, not a display conversion hint.
Product departure parameters
| Name | Type | Description |
|---|---|---|
limit |
integer | Maximum number of departures to return. Defaults to 100 and is capped at 100. |
page |
integer | 1-based page number. page=1 is the first page. |
Product departure filters describe the full matching departure set for the product. results is paginated.
Product departure detail uses product_id and departure_id from the path. data.currency uses the product package base currency. The selected departure must belong to the product and must be active, future-visible, web-visible, and priced like rows returned by the departure listing endpoint.
Product departure price preview uses product_id and departure_id from the path and requires this JSON body:
| Name | Type | Description |
|---|---|---|
id_price |
integer | Selected price id from the departure detail prices list. |
rooms |
object | Room selection as a map of room type to room count, for example {"double": 1}. Valid room types are the same as contact and reservation creation. |
coupon_code |
string | Optional alphanumeric coupon code. Invalid or out-of-scope coupons return 400 invalid_request with the public coupon message. |
The preview response always includes total_ars / total_usd, new_total_ars / new_total_usd, pax_count, applied, and default_code. The suggested default_code is only returned when no coupon was applied in the request; when a coupon is applied it is null and the response also includes code, original_total_*, amount_discount_*, discount_type, and configured_value.
Product departure contacts use product_id and departure_id from the path and require this JSON body:
Ownership is always taken from the authenticated API key. A request body field named consumer is ignored.
| Name | Type | Description |
|---|---|---|
firstname |
string | Lead first name. |
lastname |
string | Optional lead last name. |
email |
string | Lead email address. |
phone |
string | Lead phone number. |
origin |
contact, whatsapp, or call |
Selected contact action. The lead is stored using the matching legacy promo origin. whatsapp and call require current advisor availability; when unavailable, send contact. |
id_price |
integer | Selected price id from the departure detail prices list. |
rooms |
object | Room selection as a map of room type to room count, for example {"double": 1}. Valid room types: single, double, double_shared, triple, quadruple, sextuple, family_1, family_2. At least one count must be greater than zero, and each selected room type must appear in the selected price's amounts[].room_type. |
coupon_code |
string | Optional alphanumeric coupon code resolved with the coupon rules engine. |
Room selection pax counts
The rooms object always counts rooms. The API expands those rooms into passenger slots for reservations.
| Room key | Passengers per room | Example |
|---|---|---|
single |
1 | {"single": 1} requires 1 passenger. |
double |
2 | {"double": 1} requires 2 passengers. |
double_shared |
1 | {"double_shared": 1} requires 1 passenger. |
triple |
3 | {"triple": 1} requires 3 passengers. |
quadruple |
4 | {"quadruple": 1} requires 4 passengers. |
sextuple |
6 | {"sextuple": 1} requires 6 passengers. |
family_1 |
3 | {"family_1": 1} requires 3 passengers. |
family_2 |
4 | {"family_2": 1} requires 4 passengers. |
Product departure reservations use the same path ids and require a structured reservation body:
Ownership is always taken from the authenticated API key. A request body field named consumer is ignored. Passenger count must match the pax count implied by rooms.
| Name | Type | Description |
|---|---|---|
id_price |
integer | Selected price id from the departure detail prices list. |
payment_option |
buy or deposit |
Selected payment option. The product must support the requested option. |
rooms |
object | Room selection as a map of room type to room count, for example {"double": 1}. Valid room types match the contact endpoint, and every selected room type must be priced by the selected id_price. |
customer |
object | Required customer fields: firstname, lastname, email, phone, and cuil. The CUIL is used to resolve or create the linked client. |
passengers |
array | One object per room occupant. Each passenger requires firstname, lastname, document, nationality, and birth_date in YYYY-MM-DD format. |
coupon_code |
string | Optional alphanumeric coupon code resolved with the coupon rules engine. |
viajeflex_id |
integer | Optional ViajeFlex service id for flexible confirmed-flight departures. The id must be available for the selected price and room selection. |
Destination listing parameters
| Name | Type | Description |
|---|---|---|
limit |
integer | Maximum number of destinations to return. Defaults to 100 and is capped at 100. |
page |
integer | 1-based page number. page=1 is the first page. |
The destination detail endpoint uses the destination id from the path and has no query parameters.
Category listing parameters
| Name | Type | Description |
|---|---|---|
limit |
integer | Maximum number of categories to return. Defaults to 100 and is capped at 100. |
page |
integer | 1-based page number. page=1 is the first page. |
The category detail endpoint uses the category id from the path and has no query parameters.
Product group parameters
| Name | Type | Description |
|---|---|---|
by |
destination or category |
Required grouping dimension. |
group |
string | For destinations use continent, country, or linked. For categories use root, linked_parent, or linked. Category linked_parent means exactly one level above the exact linked category; if the linked category is four levels deep, the product groups under the category at level three. For linked_parent the group total is exact, but the products_url drill-down uses tree scope on that parent and may include more deeply nested products than the count. |
include_top_ranked |
0 or 1 |
Optional. Set to 1 to include compact top-ranked product previews for each group. |
top_ranked_limit |
integer | Optional. Maximum previews per group when top-ranked products are included. Defaults to 3; values above 3 are rejected. |
Responses
Successful listing responses include success: 1 and a data object with total and results. Detail responses include the resource object directly under data.
{
"success": 1,
"data": {
"total": 69,
"results": [
{
"id": 2158,
"title": "Mundial de Futbol 2026 - 16avos de Final",
"subtitle": "03 noches de alojamiento...",
"summary": "03 noches de alojamiento...",
"url": "2158/mundial_de_futbol_2026.html",
"image": "img_web-03.jpg",
"discount": 20,
"transport": "Aereo",
"meal_plan": "Desayuno",
"currency": "ARS",
"price_from_ars": 5835,
"price_from_usd": 990,
"deposit_from_ars": 1200,
"deposit_from_usd": 190,
"num_of_payments": 5,
"nights": [3, 4],
"has_hotel": false,
"can_deposit": true,
"can_buy": false,
"destinations": [
{ "id": 410, "name": "Miami" }
],
"categories": [
{ "id": 154, "name": "Mundial" }
]
}
]
}
}
Product detail responses return the product object directly under data and replace the listing image field with the ordered images gallery plus public payment summaries.
{
"success": 1,
"data": {
"id": 2158,
"title": "Mundial de Futbol 2026 - 16avos de Final",
"subtitle": "03 noches de alojamiento...",
"summary": "03 noches de alojamiento...",
"url": "2158/mundial_de_futbol_2026.html",
"discount": 20,
"transport": "Aereo",
"meal_plan": "Desayuno",
"currency": "ARS",
"price_from_ars": 5835,
"price_from_usd": 990,
"deposit_from_ars": 1200,
"deposit_from_usd": 190,
"num_of_payments": 5,
"nights": [3],
"has_hotel": false,
"can_deposit": true,
"can_buy": false,
"destinations": [
{ "id": 410, "name": "Miami" }
],
"categories": [
{ "id": 154, "name": "Mundial" }
],
"images": [
{
"name": "img_web-03.jpg"
}
],
"payment_options": {
"deposit": [
{
"name": "Tarjeta Visa",
"title": "Reserva con tarjeta",
"description": "Pago de seña en cuotas disponibles."
}
]
}
}
}
When the authenticated API consumer is scoped to a USD display site, the same money fields use only the USD suffix.
{
"success": 1,
"data": {
"id": 3150,
"title": "Caribe 2026",
"url": "3150/caribe_2026.html",
"discount": null,
"transport": "Aereo",
"meal_plan": "All inclusive",
"currency": "USD",
"price_from_ars": null,
"price_from_usd": 990,
"deposit_from_ars": null,
"deposit_from_usd": null,
"num_of_payments": null,
"nights": [7],
"can_deposit": false,
"can_buy": true,
"destinations": [
{ "id": 410, "name": "Miami" }
],
"categories": [
{ "id": 154, "name": "Caribe" }
],
"images": [],
"payment_options": {
"buy": []
}
}
}
| Field | Rule for the next API call |
|---|---|
currency |
This is the package base currency (ARS or USD) used by the product prices. Money field suffixes identify the currency of each numeric amount. |
discount |
Informational package-level percentage, useful for badges or commercial labels. It does not replace departure or price calculations. |
transport / meal_plan |
Public labels from the package configuration. Internal ids are not exposed. |
can_buy |
When true, the product can support a reservation with payment_option=buy. Still fetch departure detail and choose a valid id_price before creating the reservation. |
can_deposit |
When true, the product can support a reservation with payment_option=deposit. This is effective availability, so it is false when installments do not apply even if deposit is configured internally. The selected departure price must also return deposit values. |
nights |
Display these numeric durations as nights available for the product. |
images |
Only present on product detail. Items are ordered by the admin gallery order and currently expose only the image file name. |
payment_options |
Only present on product detail. Includes buy and/or deposit arrays when those actions are available, exposing only public title and description fields. |
Product departure responses include active future departures for one product. The root currency is the package base currency for the product. The filters object is calculated from all matching departures, even when results is paginated. filters.months lists departure start months; each row omits month summaries because start_date and end_date carry the date range. Inventory fields distinguish confirmed flight seats from regular flight departures and no-flight departures.
{
"success": 1,
"data": {
"product_id": 2158,
"currency": "USD",
"total": 24,
"filters": {
"price": { "min": 5835, "max": 8720 },
"stars": [5, 4],
"months": ["2026-06", "2026-07"],
"itinerary_days": [5, 8],
"luggage": ["Carry on"],
"route": ["DIRECT"]
},
"results": [
{
"id": 9876,
"start_date": "2026-06-12",
"end_date": "2026-06-16",
"nights": 4,
"itinerary_days": 5,
"assistance_days": 5,
"last_seats": 6,
"available_prices_count": 1,
"inventory_type": "allotment",
"available_seats": 6,
"price_from_ars": null,
"price_from_usd": 5835,
"deposit_from_ars": null,
"deposit_from_usd": null,
"num_of_payments": null,
"city_from": "Buenos Aires",
"is_hook": false,
"hotel_stars": [5, 4],
"luggage": ["Carry on"],
"route": "DIRECT",
"flexible": false
}
]
}
}
| Field | Why it matters to the end user |
|---|---|
start_date, end_date, nights, itinerary_days |
These are raw travel dates and the passenger-facing trip duration. Format dates on the client side. |
assistance_days |
This is the coverage duration used for assistance and ViajeFlex calculations, which can differ from passenger-facing itinerary days. |
last_seats |
Use it to show remaining availability pressure when present. It is only populated for confirmed flights with few seats left. |
available_prices_count, inventory_type, available_seats |
available_prices_count counts enabled price rows for the departure. inventory_type is allotment, regular, or no_flight. available_seats is the real remaining seat count only for confirmed flight inventory, otherwise null. |
price_from_ars, price_from_usd, deposit_from_ars, deposit_from_usd |
These rounded integer money fields are always present; currencies that do not apply are null. The deposit_from_* fields are previews derived from the departure's lowest available price. Use departure detail to select the actual id_price. |
city_from, route, luggage, hotel_stars |
These fields help users compare departure quality before choosing one. hotel_stars is an aggregate of all available price options; precise hotel stars remain in detail at prices[].hotels[].stars. |
Product departure detail responses include the selected departure price payload. The root currency is the package base currency for the product. description uses the departure description when present, otherwise the product description. Deposit values are exposed on each selectable prices[].amounts[] row, not at the detail root. Use flight for flight details; it is null when the departure has no flight.
{
"success": 1,
"data": {
"product_id": 2158,
"currency": "USD",
"description": "<p>Departure details...</p>",
"prices": [
{
"id": 4321,
"amounts": [
{
"price_ars": null,
"name": "amount_double",
"price_usd": 990,
"deposit_ars": null,
"deposit_usd": 190,
"num_of_payments": 5,
"max_pax": 12,
"room_type": "DOUBLE",
"has_kids": false
}
],
"hotels": [
{
"id": 10,
"name": "Hotel Plaza",
"stars": 4,
"destination": "Madrid",
"image": "hotel.jpg",
"nights": 3,
"check_in_date": "2026-06-13",
"check_out_date": "2026-06-16",
"meal_plan": {
"code": "BREAKFAST",
"label": "Con Desayuno"
}
}
],
"circuits": [
{
"id": 20,
"name": "Circuito Andalucia",
"nights": 4,
"start_date": "2026-06-16",
"end_date": "2026-06-20",
"meal_plan": null
}
],
"transfers": [
{
"id": 30,
"name": "Traslado aeropuerto-hotel"
}
],
"assistances": [
{
"id": 25,
"name": "Asistencia operador",
"days": 9,
"source": "OPERATOR_INCLUDED",
"included_by_operator": true
}
],
"count": 1,
"price_from_ars": null,
"price_from_usd": 990,
"price_from_type": "DOUBLE"
}
],
"has_amounts": true,
"price_from_type": "DOUBLE",
"discount": null,
"kids_age": 12,
"start_date": "2026-06-12",
"end_date": "2026-06-20",
"nights": 7,
"itinerary_days": 8,
"assistance_days": 9,
"flight": {
"inventory_type": "ALLOTMENT",
"available_seats": 6,
"last_seats": 6,
"route": "DIRECT",
"luggage": ["CARRY_ON", "CHECKED"],
"departure_date": "2026-06-12",
"arrival_date": "2026-06-20",
"flight_legs": [
{
"leg_type": "OUTBOUND",
"airport_from": "EZE",
"city_from": "Buenos Aires",
"airport_to": "MIA",
"city_to": "Miami",
"airline_name": "Aerolinea",
"flight_number": "AR1302",
"departure_date": "2026-06-12 22:00:00",
"arrival_date": "2026-06-13 06:00:00"
}
]
},
"id_departure": 9876
}
}
| Field | Rule for contact or reservation creation |
|---|---|
prices[].id |
Send one of these values as id_price. Do not reuse a price id from another departure. |
amounts[].room_type |
Convert the displayed room type to the matching rooms key. For example, DOUBLE maps to {"double":1}. |
amounts[].deposit_ars, amounts[].deposit_usd, amounts[].num_of_payments |
These are the calculated deposit values and installment count for the selected room and departure date. Use the suffix that matches the selected money field. Do not send deposit totals in the reservation request; the reservation endpoint recomputes and persists them server-side. |
amounts[].has_kids, assistances[].included_by_operator |
Read these as JSON booleans when deciding how to label room and assistance details. |
flight, prices[].hotels, prices[].circuits, prices[].transfers, prices[].assistances, viajeflex_options |
Present these before checkout so the user confirms the operational travel details and included services attached to the selected departure. |
Product departure contact responses return a lead receipt. The persisted contact uses the submitted product, departure, price, and room selection, with channel set to PUBLIC_API. The id_seller field is the assigned seller id, or null when the lead is not assigned.
{
"success": 1,
"data": {
"id_contact": 654321,
"id_seller": 103,
"creation_date": "2026-06-03 18:59:05",
"status": "PENDING",
"channel": "PUBLIC_API",
"id_product": 2158,
"id_departure": 9876,
"id_price": 4321
}
}
Product departure reservation responses return a reservation receipt. The persisted reservation uses authenticated API ownership, channel and origin set to PUBLIC_API, and transfer payment selection.
{
"success": 1,
"data": {
"id_reservation": 765432,
"creation_date": "2026-06-03 19:11:02",
"status": "IN_PROCESS",
"channel": "PUBLIC_API",
"origin": "PUBLIC_API",
"id_product": 2158,
"id_departure": 9876,
"id_price": 4321,
"payment_option": "buy",
"payment_selection": "TRANSFER",
"price_usd": 200,
"deposit_usd": null,
"currency_to": "USD"
}
}
Contact receipt lookup returns the same data fields for contacts owned by the authenticated API consumer. The status field is the current contact workflow status and can change after creation.
{
"success": 1,
"data": {
"id_contact": 654321,
"id_seller": 103,
"creation_date": "2026-06-03 18:59:05",
"status": "FOLLOW",
"channel": "PUBLIC_API",
"id_product": 2158,
"id_departure": 9876,
"id_price": 4321
}
}
Reservation receipt lookup returns the persisted reservation receipt for reservations owned by the authenticated API consumer. The status field is the current reservation workflow status and can change after creation.
{
"success": 1,
"data": {
"id_reservation": 765432,
"creation_date": "2026-06-03 19:11:02",
"status": "DEBT",
"channel": "PUBLIC_API",
"origin": "PUBLIC_API",
"id_product": 2158,
"id_departure": 9876,
"payment_selection": "TRANSFER",
"price_usd": 200,
"deposit_usd": null,
"currency_to": "USD"
}
}
Destination listing responses include active destinations, their parent summary, and direct child summaries. Destination detail responses use the same fields, but data is the destination object directly.
{
"success": 1,
"data": {
"total": 3,
"results": [
{
"id": 410,
"name": "Miami",
"description": "Miami",
"parent_id": 23,
"url": "america-10/estados_unidos-23/miami-410",
"image": "miami.jpg",
"active": true,
"parent": { "id": 23, "name": "Estados Unidos" },
"children": []
}
]
}
}
Category listing responses include website-visible categories, their parent summary, and direct child summaries. The active field describes menu visibility state; disabled categories and categories under disabled parents are not returned. Category detail responses use the same fields, but data is the category object directly.
{
"success": 1,
"data": {
"total": 3,
"results": [
{
"id": 154,
"name": "Mundial",
"parent_id": null,
"url": "mundial-154",
"image": "mundial.jpg",
"active": true,
"parent": null,
"children": [
{ "id": 155, "name": "Final" }
]
}
]
}
}
Product group responses include the selected dimension, grouping level, product totals, drill-down URLs, and optional compact top-ranked products. In each top-ranked product, currency is the package base currency.
{
"success": 1,
"data": {
"by": "destination",
"group": "continent",
"groups": [
{
"id": 10,
"name": "Europe",
"parent_id": null,
"url": "europe-10",
"total": 42,
"products_url": "/api/v1/products?id_destination=10",
"top_ranked": [
{
"id": 1001,
"title": "Madrid escapada",
"url": "1001/madrid_escapada.html",
"image": "madrid.jpg",
"price_from_usd": 1200,
"currency": "USD"
}
]
}
]
}
}
Home responses return one section. A block section (slider/list/popup) returns blocks; ?type=banners returns banners. Each block carries its display metadata plus a resource; product resources and LIST products are compact home cards using the same money/flag conventions as /products, while category and destination resources are compact tile summaries. The example below shows a type=list response.
{
"success": 1,
"data": {
"blocks": [
{
"id": 1356,
"type": "list",
"order": 1,
"link": true,
"show_text": true,
"image_name": null,
"resource_type": "category",
"resource": {
"id": 126,
"name": "Playas",
"url": "playas-126",
"image": "playas.jpg"
},
"products": [
{
"id": 1684,
"title": "Paquete a Playas de Rep. Dominicana",
"url": "1684/paquete_rep_dominicana.html",
"image": "punta_cana.jpg",
"discount": 20,
"transport": "Aéreos",
"meal_plan": "All Inclusive",
"nights": [7, 8, 9, 10],
"has_hotel": true,
"has_transfer": false,
"has_assistance": false,
"has_tour": false,
"price_from_ars": 1903828,
"price_from_usd": 1200,
"deposit_from_ars": null,
"deposit_from_usd": null,
"num_of_payments": null
}
]
}
]
}
}
The ?type=banners section returns the banner strip under banners instead of blocks.
{
"success": 1,
"data": {
"banners": [
{
"name": "banner_mundial.png",
"description": "Mundial",
"link": "https://www.deturista.com/categoria/mundial-154"
}
]
}
}
Site responses return the site display fields, social links, legal text, and the public office list. Most fields are nullable, so null-check before rendering.
{
"success": 1,
"data": {
"id_site": 1,
"name": "deTurista.com",
"site_name": "Argentina",
"phone": "0810-333-8748",
"email": "info@deturista.com",
"working_hours": "Lunes a Viernes de 9 a 18 hs",
"address": "Av. Córdoba 1801/07, CABA, Buenos Aires",
"address_link": "https://maps.app.goo.gl/example",
"address2": null,
"address2_link": null,
"legal_info": "Razon social: deTurista.com de Aterrizando S.A - Leg. 16952",
"social": {
"facebook": "https://facebook.com/deturista",
"twitter": null,
"instagram": "https://instagram.com/deturista"
},
"offices": [
{
"id": 1,
"label": "Pilar",
"address": "Colectora Panamericana (Km 42.5) y Las Camelias, Pilar",
"working_hours": null,
"map_url": "https://www.google.com/maps/place/deTurista.com",
"image": "pilar_.png"
}
]
}
}
Newsletter creation returns 201 with the subscription receipt.
{
"success": 1,
"data": {
"id_newsletter": 472238,
"email": "ana@example.com",
"destination": "EUROPA",
"creation_date": "2026-07-21 11:42:29"
}
}
Working with the data
These conventions hold across every response, so handle them once instead of per endpoint.
| Topic | What to do |
|---|---|
| Dates and times | Timestamps such as creation_date and flight leg departure_date / arrival_date are in the API account's timezone, formatted YYYY-MM-DD HH:MM:SS. They are not ISO-8601 and carry no UTC offset, so do not assume one when parsing. Plain dates such as start_date, end_date, hotel check-in/check-out dates, and passenger birth_date are YYYY-MM-DD. |
| Nullable fields | Many non-money fields can be null or absent — for example subtitle, image, discount, route and luggage, and parent objects. Public money pairs are always present, with the unavailable currency set to null. |
| Money numbers | All public money fields (price_from_ars, price_from_usd, deposit_from_ars, deposit_from_usd, price_ars, price_usd, deposit_ars, deposit_usd) are emitted as ARS/USD pairs. Values are rounded integer JSON numbers without currency symbols, thousands separators, or decimals; an unavailable currency is null. Product currency and departure data.currency name the package base currency. Format amounts for display on the client side. |
| Deposit amounts | Preview fields named deposit_from_* are derived from the lowest available child price. The selectable deposit values are amounts[].deposit_ars and amounts[].deposit_usd in departure detail. num_of_payments is calculated server-side from the departure payment plan, including payment visibility, departure date, final-payment deadline, and increase rules. The create reservation endpoint never accepts client-supplied deposit totals; it recomputes them from the selected price and rooms. |
| Booleans drive the UI | Flags such as can_buy, effective can_deposit, and the product has_* flags are real JSON booleans (true / false), not 0 / 1. Gate buttons on them; do not infer them. |
Error shape
{
"success": 0,
"error": "unauthorized",
"message": "missing or invalid API key"
}
{
"success": 0,
"error": "invalid_request",
"message": "month must be between 1 and 12"
}
{
"success": 0,
"error": "not_found",
"message": "price not found"
}
For contact and reservation receipt lookup, 404 not_found also means the id is not owned by the authenticated API consumer.
{
"success": 0,
"error": "rate_limited",
"message": "rate limit exceeded"
}
429 with error: "rate_limited"; pause and retry with exponential backoff instead of hammering the endpoint. The exact limit is configured per consumer, so design clients to react to a 429 rather than assuming a fixed rate.
Every error carries a message. For invalid_request and not_found it is specific so you can fix the call (it names the offending field or the missing resource). For unauthorized and rate_limited it is intentionally generic and never reveals which key or limit failed — do not parse it, switch on the error code instead.
Swagger and OpenAPI schema
Swagger UI is bundled with this beta documentation and loads the local openapi.json schema. Use the Swagger Authorize button to enter your own X-API-Key; the docs do not include prototype credentials.
Beta and versioning
The contract is versioned under /v1. During beta it evolves additively: new fields and endpoints can appear without notice, but an existing /v1 field will not be removed or repurposed without a new version. Build defensively — read the fields you need and ignore any you do not recognise — so an additive change never breaks your integration.
test.deturista.com, Swagger selects the development host by default. Browser calls may still be blocked unless the selected API host allows your environment. The curl examples in this guide always work from a terminal or backend.
Public API (beta)