DeTurista Public API (beta)
Public JSON API (beta)

Product listings for partners and integrations

Use the DeTurista public API to search active public products, choose a departure and price, and then create a lead or reservation from that selected travel option.

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.

  1. 1
    Find a product GET /products or POST /products
    Keep
    id, can_buy, can_deposit
    Rule
    Show only visible products returned by the API. Use can_buy for full-payment reservations and can_deposit only to decide whether the deposit path can be offered; can_deposit already accounts for whether installments apply, and the payable deposit comes from the selected departure price.
  2. 2
    Choose a departure GET /products/{id}/departures
    Keep
    Departure id, dates, lowest price, seats, route, luggage
    Rule
    Present future active departures to the end user. The list is for choosing dates; it does not contain the final id_price.
  3. 3
    Choose price and rooms GET /products/{product_id}/departures/{departure_id}
    Keep
    prices[].id, amounts[].room_type, amounts[].deposit_ars / amounts[].deposit_usd, amounts[].num_of_payments, flight, included services
    Rule
    The selected id_price must come from this response, and the requested room types must exist in that price's amounts.
  4. 4
    Preview price and coupon POST .../price-preview
    Keep
    total_ars / total_usd, new_total_ars / new_total_usd, applied code
    Rule
    Use the same id_price and rooms the user selected. A returned default_code is only a suggestion; send it as coupon_code only after the user applies it.
  5. 5
    Create contact or reservation POST .../contacts or POST .../reservations
    Keep
    Receipt id, creation_date, current status
    Rule
    Create a contact for a lead or call/WhatsApp handoff. Create a reservation only after the user has selected a valid payment option, price, rooms, customer, and passengers.
Room counts are room counts, not passenger counts. A request with "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.

curlDiscover by destination
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.

curlFirst call
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

curlQuery string search
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

curlJSON body search
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

curlExact product list
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

curlSingle product
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

curlProduct departures
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

curlProduct departure detail
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

curlProduct departure price preview
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

curlProduct departure contact
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

curlProduct departure reservation
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

curlContact receipt
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

curlReservation receipt
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

curlDestination list
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

curlCategory list
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

curlDestination groups
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.

curlHero slider blocks
curl -sS 'https://api.deturista.com/v1/home?type=slider' \
  -H 'X-API-Key: YOUR_API_KEY'
curlProduct-list carousels
curl -sS 'https://api.deturista.com/v1/home?type=list' \
  -H 'X-API-Key: YOUR_API_KEY'
curlPopup
curl -sS 'https://api.deturista.com/v1/home?type=popup' \
  -H 'X-API-Key: YOUR_API_KEY'
curlBanner strip
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

curlSite and footer metadata
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

curlSubscribe an email
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.
For development, use https://test.deturista.com/api/v1 instead of https://api.deturista.com/v1.

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.

Success 200 OK
Create success 201 Created
Auth failure 401 Unauthorized
Invalid request 400 Bad Request
Not found 404 Not Found
Rate limit 429 Too Many Requests
The default rate limit is 10 requests per second per API consumer. A configured consumer limit overrides that default.

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.

JSONSuccess shape
{
  "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.

JSONProduct detail
{
  "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.

JSONUSD display site product
{
  "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.

JSONProduct 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.

JSONProduct departure detail
{
  "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.

JSONProduct departure contact
{
  "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.

JSONProduct departure reservation
{
  "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.

JSONContact receipt
{
  "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.

JSONReservation receipt
{
  "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.

JSONDestinations
{
  "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.

JSONCategories
{
  "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.

JSONProduct groups
{
  "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.

JSONHome list section (type=list)
{
  "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.

JSONHome banners section (type=banners)
{
  "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.

JSONSite metadata
{
  "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.

JSONNewsletter 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

JSONUnauthorized
{
  "success": 0,
  "error": "unauthorized",
  "message": "missing or invalid API key"
}
JSONInvalid request
{
  "success": 0,
  "error": "invalid_request",
  "message": "month must be between 1 and 12"
}
JSONNot found
{
  "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.

JSONRate limited
{
  "success": 0,
  "error": "rate_limited",
  "message": "rate limit exceeded"
}
Requests are rate limited per API key. When you exceed your limit you get HTTP 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.

During beta, treat Swagger as a reference and call the API from your server. Swagger's Try it out runs from your browser against the selected server; when this page is opened from 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.