{
  "openapi": "3.1.0",
  "info": {
    "title": "DeTurista Public API (beta)",
    "version": "1.0.0",
    "description": "Public JSON API (beta) for DeTurista products, product departures, contacts, reservations, destinations, categories, and grouped discovery. The integration flow is: search products, choose a product, list its departures, load one departure detail to choose id_price and rooms, optionally preview the selected price and coupon, then create either a contact lead or a reservation."
  },
  "servers": [
    {
      "url": "https://api.deturista.com/v1",
      "description": "Production API host"
    },
    {
      "url": "https://test.deturista.com/api/v1",
      "description": "Development API host"
    }
  ],
  "externalDocs": {
    "description": "Human integration guide and Swagger UI",
    "url": "https://api.deturista.com/v1/"
  },
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/home": {
      "get": {
        "summary": "Get the home page composition",
        "description": "Returns one section of the home composition for the authenticated consumer's site. The required type parameter selects the section: slider, list and popup return the ordered blocks of that type; banners returns the banner strip. There is no combined response, so call once per section. Each block references a product, category, or destination resource; product resources and LIST products are compact home cards (enough to render a tile), not the full product row, so load /products/{id} for full product detail. At most one popup block is returned (the first POPUP by order), matching the single popup shown on the home page.",
        "operationId": "getHome",
        "parameters": [
          {
            "$ref": "#/components/parameters/HomeTypeFilter"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/HomeSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/site": {
      "get": {
        "summary": "Get public site and footer metadata",
        "description": "Returns the authenticated consumer's site display metadata for building site chrome: contact fields, social links, legal text, and the public office/branch list used in the footer. Analytics, pixel, and verification keys are intentionally not exposed; the consuming site manages its own analytics.",
        "operationId": "getSite",
        "responses": {
          "200": {
            "$ref": "#/components/responses/SiteSuccess"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/newsletter": {
      "post": {
        "summary": "Subscribe an email to the newsletter",
        "description": "Creates a newsletter subscription for the authenticated consumer's site. Reuses the same validation and duplicate-email guard as the public newsletter form: an invalid field or an already-subscribed email returns 400 invalid_request.",
        "operationId": "subscribeNewsletter",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewsletterRequest"
              },
              "example": {
                "firstname": "Ana",
                "lastname": "Gomez",
                "email": "ana@example.com",
                "destination": "EUROPA"
              }
            }
          }
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/NewsletterCreated"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products": {
      "get": {
        "summary": "List public products",
        "description": "Returns active public products visible to the authenticated API consumer. Product rows start the reservation/contact flow: save the product id, then use can_buy and effective can_deposit to decide which checkout actions can be shown before loading product departures.",
        "operationId": "listProducts",
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/IdProducts"
          },
          {
            "$ref": "#/components/parameters/IdDestination"
          },
          {
            "$ref": "#/components/parameters/DestinationScope"
          },
          {
            "$ref": "#/components/parameters/IdCategory"
          },
          {
            "$ref": "#/components/parameters/CategoryScope"
          },
          {
            "$ref": "#/components/parameters/Month"
          },
          {
            "$ref": "#/components/parameters/Year"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductsSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      },
      "post": {
        "summary": "Search public products",
        "description": "Returns active public products using the same filters as GET, supplied as a JSON object. Use the returned product id for detail and departure calls; use can_buy and effective can_deposit to decide whether buy, deposit, or contact-only actions are valid.",
        "operationId": "searchProducts",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductSearchRequest"
              },
              "example": {
                "limit": 2,
                "page": 1,
                "id_destination": 410,
                "id_category": 154,
                "month": 6,
                "year": 2026
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductsSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/product-groups": {
      "get": {
        "summary": "Group public products",
        "description": "Returns category or destination groups with public product totals and optional top-ranked product previews.",
        "operationId": "listProductGroups",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductGroupBy"
          },
          {
            "$ref": "#/components/parameters/ProductGroup"
          },
          {
            "$ref": "#/components/parameters/IncludeTopRanked"
          },
          {
            "$ref": "#/components/parameters/TopRankedLimit"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductGroupsSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/destinations": {
      "get": {
        "summary": "List public destinations",
        "description": "Returns active destinations visible to the authenticated API consumer.",
        "operationId": "listDestinations",
        "parameters": [
          {
            "$ref": "#/components/parameters/DestinationLimit"
          },
          {
            "$ref": "#/components/parameters/Page"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DestinationsSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/destinations/{id}": {
      "get": {
        "summary": "Get one public destination",
        "description": "Returns one active destination visible to the authenticated API consumer.",
        "operationId": "getDestination",
        "parameters": [
          {
            "$ref": "#/components/parameters/DestinationId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/DestinationSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/categories": {
      "get": {
        "summary": "List public categories",
        "description": "Returns website-visible categories for the authenticated API consumer.",
        "operationId": "listCategories",
        "parameters": [
          {
            "$ref": "#/components/parameters/CategoryLimit"
          },
          {
            "$ref": "#/components/parameters/Page"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/CategoriesSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/categories/{id}": {
      "get": {
        "summary": "Get one public category",
        "description": "Returns one website-visible category for the authenticated API consumer.",
        "operationId": "getCategory",
        "parameters": [
          {
            "$ref": "#/components/parameters/CategoryId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/CategorySuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products/{id}": {
      "get": {
        "summary": "Get one public product",
        "description": "Returns one active public product visible to the authenticated API consumer.",
        "operationId": "getProduct",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products/{id}/departures": {
      "get": {
        "summary": "List public product departures",
        "description": "Returns active future departures and filters for one active public product visible to the authenticated API consumer. Present departures as the user's date-selection step: dates, duration, remaining seats, lowest display price, origin city, hotel stars, luggage, route, and flight inventory hints when present. Filters describe the full matching departure set; results are paginated. Call departure detail before selecting id_price.",
        "operationId": "listProductDepartures",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductId"
          },
          {
            "$ref": "#/components/parameters/ProductDepartureLimit"
          },
          {
            "$ref": "#/components/parameters/Page"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductDeparturesSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products/{product_id}/departures/{departure_id}": {
      "get": {
        "summary": "Get one public product departure",
        "description": "Returns the selected active, web-visible, priced departure detail payload for one active public product visible to the authenticated API consumer. Use prices[].id as id_price for contact or reservation creation. Selected room types must be available in the chosen price's amounts list, and travel details such as flight.flight_legs, luggage, included services, and flexible options should be shown before checkout.",
        "operationId": "getProductDeparture",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductDepartureProductId"
          },
          {
            "$ref": "#/components/parameters/ProductDepartureId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductDepartureDetailSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products/{product_id}/departures/{departure_id}/price-preview": {
      "post": {
        "summary": "Preview a selected product departure price",
        "description": "Returns the server-computed total for one selected price and rooms map before creating a contact or reservation. Send coupon_code to validate and apply one public coupon code; invalid, inactive, expired, cross-site, out-of-scope, or ambiguous coupons return 400 invalid_request with message El cup\u00f3n no existe. Suggested default codes may be returned as default_code but are never applied unless sent back as coupon_code.",
        "operationId": "previewProductDeparturePrice",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductDepartureProductId"
          },
          {
            "$ref": "#/components/parameters/ProductDepartureId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductDeparturePricePreviewRequest"
              },
              "example": {
                "id_price": 4567,
                "rooms": {
                  "double": 1
                },
                "coupon_code": "HOTSALE10"
              }
            }
          }
        },
        "responses": {
          "200": {
            "$ref": "#/components/responses/ProductDeparturePricePreviewSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products/{product_id}/departures/{departure_id}/contacts": {
      "post": {
        "summary": "Create a product departure contact",
        "description": "Creates a lead for one selected active, web-visible, priced product departure visible to the authenticated API consumer. Use this endpoint when the user wants information, WhatsApp, or a call instead of completing a reservation. The id_price must come from the selected departure detail response. API leads use the same contact submission semantics as the public product form and are persisted with channel PUBLIC_API. origin=whatsapp and origin=call are accepted only while advisors are currently available for that action; otherwise the endpoint returns 400 invalid_request and the consumer should offer origin=contact.",
        "operationId": "createProductDepartureContact",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductDepartureProductId"
          },
          {
            "$ref": "#/components/parameters/ProductDepartureId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductDepartureContactRequest"
              },
              "example": {
                "firstname": "Ana",
                "lastname": "Gomez",
                "email": "ana@example.com",
                "phone": "1155550000",
                "origin": "contact",
                "id_price": 4567,
                "rooms": {
                  "double": 1
                }
              }
            }
          }
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/ProductDepartureContactCreated"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/products/{product_id}/departures/{departure_id}/reservations": {
      "post": {
        "summary": "Create a product departure reservation",
        "description": "Creates an operational reservation for one selected active, web-visible, priced product departure visible to the authenticated API consumer. Use payment_option=buy only when the product supports can_buy, and payment_option=deposit only when the product supports effective can_deposit and the selected departure price has deposit values. Passenger count must match the pax count implied by rooms, for example rooms.double=1 means two passengers. API reservations are persisted with channel and origin PUBLIC_API, ownership from the authenticated API key, transfer payment selection, reservation pax rows, sale rows, sale details, and confirmed flight seat usage when applicable.",
        "operationId": "createProductDepartureReservation",
        "parameters": [
          {
            "$ref": "#/components/parameters/ProductDepartureProductId"
          },
          {
            "$ref": "#/components/parameters/ProductDepartureId"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductDepartureReservationRequest"
              },
              "example": {
                "id_price": 4567,
                "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"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "201": {
            "$ref": "#/components/responses/ProductDepartureReservationCreated"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/contacts/{id}": {
      "get": {
        "summary": "Get one API-created contact receipt",
        "description": "Returns the receipt for one contact created by the authenticated API consumer. Contacts owned by another consumer, outside the authenticated entity/site, or created outside the public API return 404.",
        "operationId": "getContact",
        "parameters": [
          {
            "$ref": "#/components/parameters/ContactId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ContactSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/reservations/{id}": {
      "get": {
        "summary": "Get one API-created reservation receipt",
        "description": "Returns the persisted receipt for one reservation created by the authenticated API consumer. Reservations owned by another consumer, outside the authenticated entity/site, or created outside the public API return 404. The read-back receipt does not include id_price or payment_option because those are creation-request fields, not persisted reservation fields.",
        "operationId": "getReservation",
        "parameters": [
          {
            "$ref": "#/components/parameters/ReservationId"
          }
        ],
        "responses": {
          "200": {
            "$ref": "#/components/responses/ReservationSuccess"
          },
          "400": {
            "$ref": "#/components/responses/InvalidRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      }
    },
    "parameters": {
      "HomeTypeFilter": {
        "name": "type",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string",
          "enum": [
            "slider",
            "list",
            "popup",
            "banners"
          ]
        },
        "description": "Required home section selector. Each request targets one section: slider, list and popup return that block type; banners returns the banner strip. There is no combined response; call once per section."
      },
      "ProductId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Product id."
      },
      "ProductDepartureProductId": {
        "name": "product_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Product id."
      },
      "ProductDepartureId": {
        "name": "departure_id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Departure id."
      },
      "DestinationId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Destination id."
      },
      "CategoryId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Category id."
      },
      "ContactId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Contact id returned by product departure contact creation."
      },
      "ReservationId": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Reservation id returned by product departure reservation creation."
      },
      "Limit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 100
        },
        "description": "Maximum number of products to return. Defaults to 100 and is capped at 100."
      },
      "DestinationLimit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 100
        },
        "description": "Maximum number of destinations to return. Defaults to 100 and is capped at 100."
      },
      "CategoryLimit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 100
        },
        "description": "Maximum number of categories to return. Defaults to 100 and is capped at 100."
      },
      "ProductDepartureLimit": {
        "name": "limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 100
        },
        "description": "Maximum number of departures to return. Defaults to 100 and is capped at 100."
      },
      "Page": {
        "name": "page",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "1-based page number. page=1 is the first page."
      },
      "IdProducts": {
        "name": "id_products",
        "in": "query",
        "required": false,
        "style": "form",
        "explode": false,
        "schema": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 1
          },
          "minItems": 1,
          "maxItems": 100,
          "uniqueItems": true
        },
        "description": "Exact product ids. Use a comma-separated value in GET. The request fails if any id is not visible to the API consumer. Do not combine with listing filters or pagination."
      },
      "IdDestination": {
        "name": "id_destination",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Destination id. Child destinations are included by default."
      },
      "DestinationScope": {
        "name": "destination_scope",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "enum": [
            "tree",
            "linked"
          ],
          "default": "tree"
        },
        "description": "Use tree to include child destinations, or linked to match only direct ProductDestination rows."
      },
      "IdCategory": {
        "name": "id_category",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Category id. Child categories are included by default."
      },
      "CategoryScope": {
        "name": "category_scope",
        "in": "query",
        "required": false,
        "schema": {
          "type": "string",
          "enum": [
            "tree",
            "linked"
          ],
          "default": "tree"
        },
        "description": "Use tree to include child categories, or linked to match only direct ProductCategory rows."
      },
      "Month": {
        "name": "month",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 12
        },
        "description": "Departure month from 1 to 12."
      },
      "Year": {
        "name": "year",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1
        },
        "description": "Departure year. Use with month to filter a specific month in a specific year."
      },
      "ProductGroupBy": {
        "name": "by",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string",
          "enum": [
            "destination",
            "category"
          ]
        },
        "description": "Tree dimension to group by."
      },
      "ProductGroup": {
        "name": "group",
        "in": "query",
        "required": true,
        "schema": {
          "type": "string",
          "enum": [
            "continent",
            "country",
            "root",
            "linked_parent",
            "linked"
          ]
        },
        "description": "Grouping level. Destination supports continent, country, and linked. Category supports root, linked_parent, and linked. Category linked_parent means exactly one level above the exact linked category, not a fixed tree depth. For linked_parent the group total is exact, but its products_url drill-down uses tree scope and may include more deeply nested products than the count."
      },
      "IncludeTopRanked": {
        "name": "include_top_ranked",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "enum": [
            0,
            1
          ],
          "default": 0
        },
        "description": "Set to 1 to include compact top-ranked product previews for each group."
      },
      "TopRankedLimit": {
        "name": "top_ranked_limit",
        "in": "query",
        "required": false,
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 3,
          "default": 3
        },
        "description": "Maximum number of top-ranked previews per group when include_top_ranked=1."
      }
    },
    "responses": {
      "HomeSuccess": {
        "description": "Home page composition response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/HomeResponse"
            }
          }
        }
      },
      "SiteSuccess": {
        "description": "Public site and footer metadata response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/SiteResponse"
            }
          }
        }
      },
      "NewsletterCreated": {
        "description": "Newsletter subscription receipt.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/NewsletterResponse"
            }
          }
        }
      },
      "DestinationSuccess": {
        "description": "Destination detail response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DestinationResponse"
            }
          }
        }
      },
      "DestinationsSuccess": {
        "description": "Destination listing response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DestinationsResponse"
            }
          }
        }
      },
      "CategorySuccess": {
        "description": "Category detail response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/CategoryResponse"
            }
          }
        }
      },
      "CategoriesSuccess": {
        "description": "Category listing response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/CategoriesResponse"
            }
          }
        }
      },
      "ProductSuccess": {
        "description": "Product detail response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductResponse"
            }
          }
        }
      },
      "ProductsSuccess": {
        "description": "Product listing response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductsResponse"
            }
          }
        }
      },
      "ProductDeparturesSuccess": {
        "description": "Product departures listing response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductDeparturesResponse"
            }
          }
        }
      },
      "ProductDepartureDetailSuccess": {
        "description": "Product departure detail response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductDepartureDetailResponse"
            }
          }
        }
      },
      "ProductDeparturePricePreviewSuccess": {
        "description": "Product departure selected price preview response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductDeparturePricePreviewResponse"
            }
          }
        }
      },
      "ProductDepartureContactCreated": {
        "description": "Product departure contact lead receipt.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductDepartureContactResponse"
            }
          }
        }
      },
      "ProductDepartureReservationCreated": {
        "description": "Product departure reservation receipt.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductDepartureReservationResponse"
            }
          }
        }
      },
      "ContactSuccess": {
        "description": "API-created contact receipt.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ContactResponse"
            }
          }
        }
      },
      "ReservationSuccess": {
        "description": "API-created reservation receipt.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ReservationResponse"
            }
          }
        }
      },
      "ProductGroupsSuccess": {
        "description": "Product groups response.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ProductGroupsResponse"
            }
          }
        }
      },
      "InvalidRequest": {
        "description": "Invalid request values.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "success": 0,
              "error": "invalid_request",
              "message": "month must be between 1 and 12"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing or invalid API key. The message is intentionally generic and never reveals which key or reason failed.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "success": 0,
              "error": "unauthorized",
              "message": "missing or invalid API key"
            }
          }
        }
      },
      "NotFound": {
        "description": "The requested resource does not exist or is not visible to the authenticated API consumer. The message names which resource was not found, for example product, departure, price, destination, category, contact, or reservation.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "success": 0,
              "error": "not_found",
              "message": "price not found"
            }
          }
        }
      },
      "RateLimited": {
        "description": "The API consumer exceeded its configured request rate limit. The message is intentionally generic.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "success": 0,
              "error": "rate_limited",
              "message": "rate limit exceeded"
            }
          }
        }
      }
    },
    "schemas": {
      "HomeProductCard": {
        "type": "object",
        "description": "Compact product card for home sliders and lists. Contains only what a home tile renders; use /products/{id} for full product detail.",
        "required": [
          "id",
          "title",
          "url",
          "image",
          "discount",
          "transport",
          "meal_plan",
          "nights",
          "has_hotel",
          "has_transfer",
          "has_assistance",
          "has_tour",
          "price_from_ars",
          "price_from_usd",
          "deposit_from_ars",
          "deposit_from_usd",
          "num_of_payments"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "image": {
            "type": [
              "string",
              "null"
            ],
            "description": "Primary product image filename, if any."
          },
          "discount": {
            "type": [
              "integer",
              "null"
            ]
          },
          "transport": {
            "type": [
              "string",
              "null"
            ],
            "description": "Transport label (for example A\u00e9reos)."
          },
          "meal_plan": {
            "type": [
              "string",
              "null"
            ],
            "description": "Meal plan label (for example All Inclusive)."
          },
          "nights": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "integer"
            }
          },
          "has_hotel": {
            "type": "boolean"
          },
          "has_transfer": {
            "type": "boolean"
          },
          "has_assistance": {
            "type": "boolean"
          },
          "has_tour": {
            "type": "boolean"
          },
          "price_from_ars": {
            "type": [
              "integer",
              "null"
            ]
          },
          "price_from_usd": {
            "type": [
              "integer",
              "null"
            ]
          },
          "deposit_from_ars": {
            "type": [
              "integer",
              "null"
            ]
          },
          "deposit_from_usd": {
            "type": [
              "integer",
              "null"
            ]
          },
          "num_of_payments": {
            "type": [
              "integer",
              "null"
            ]
          }
        }
      },
      "HomeResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/HomeData"
          }
        }
      },
      "HomeData": {
        "type": "object",
        "additionalProperties": false,
        "description": "One home section. slider/list/popup return blocks; banners returns banners. Exactly one of blocks or banners is present, matching the requested type.",
        "properties": {
          "blocks": {
            "type": "array",
            "description": "Configured home blocks. Present unless type=banners.",
            "items": {
              "$ref": "#/components/schemas/HomeBlock"
            }
          },
          "banners": {
            "type": "array",
            "description": "Home banner strip: up to two banners ordered by their configured order. Present in the unfiltered response and when type=banners.",
            "items": {
              "$ref": "#/components/schemas/HomeBanner"
            }
          }
        }
      },
      "HomeBlock": {
        "type": "object",
        "required": [
          "id",
          "type",
          "order",
          "link",
          "show_text",
          "image_name",
          "resource_type",
          "resource"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer",
            "description": "Home configuration row id."
          },
          "type": {
            "type": "string",
            "enum": [
              "slider",
              "list",
              "popup"
            ]
          },
          "order": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Display order within the block type."
          },
          "link": {
            "type": "boolean",
            "description": "Whether the block links to its resource."
          },
          "show_text": {
            "type": "boolean",
            "description": "Whether the block shows its text overlay."
          },
          "image_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Block image filename, if configured."
          },
          "resource_type": {
            "type": "string",
            "enum": [
              "product",
              "category",
              "destination"
            ]
          },
          "resource": {
            "description": "The referenced resource. For resource_type=product this is a compact product card (enough to render a home tile); load /products/{id} for the full product. For category and destination it is a compact tile summary.",
            "oneOf": [
              {
                "$ref": "#/components/schemas/HomeProductCard"
              },
              {
                "$ref": "#/components/schemas/HomeResourceSummary"
              }
            ]
          },
          "products": {
            "type": "array",
            "description": "Present only for LIST blocks: the category's products as compact home cards, capped at 20 for the slider. For the full list use /products?id_category=<id>; for one product's full detail use /products/{id}.",
            "items": {
              "$ref": "#/components/schemas/HomeProductCard"
            }
          }
        }
      },
      "HomeResourceSummary": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url",
          "image"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "image": {
            "type": [
              "string",
              "null"
            ],
            "description": "Default image filename, if any."
          }
        }
      },
      "HomeBanner": {
        "type": "object",
        "required": [
          "name",
          "description",
          "link"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "description": "Banner image filename."
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "link": {
            "type": [
              "string",
              "null"
            ],
            "description": "Destination URL for the banner."
          }
        }
      },
      "SiteResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/SiteData"
          }
        }
      },
      "SiteData": {
        "type": "object",
        "required": [
          "id_site",
          "name",
          "site_name",
          "phone",
          "email",
          "working_hours",
          "address",
          "address_link",
          "address2",
          "address2_link",
          "legal_info",
          "social",
          "offices"
        ],
        "additionalProperties": false,
        "properties": {
          "id_site": {
            "type": "integer"
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public display name of the site."
          },
          "site_name": {
            "type": "string",
            "description": "Internal site label."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "working_hours": {
            "type": [
              "string",
              "null"
            ]
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "address_link": {
            "type": [
              "string",
              "null"
            ]
          },
          "address2": {
            "type": [
              "string",
              "null"
            ]
          },
          "address2_link": {
            "type": [
              "string",
              "null"
            ]
          },
          "legal_info": {
            "type": [
              "string",
              "null"
            ]
          },
          "social": {
            "type": "object",
            "required": [
              "facebook",
              "twitter",
              "instagram"
            ],
            "additionalProperties": false,
            "properties": {
              "facebook": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "twitter": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "instagram": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "offices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Office"
            }
          }
        }
      },
      "Office": {
        "type": "object",
        "required": [
          "id",
          "label",
          "address",
          "working_hours",
          "map_url",
          "image"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "label": {
            "type": "string"
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "working_hours": {
            "type": [
              "string",
              "null"
            ]
          },
          "map_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "image": {
            "type": [
              "string",
              "null"
            ],
            "description": "Office footer image filename, if any."
          }
        }
      },
      "NewsletterRequest": {
        "type": "object",
        "required": [
          "firstname",
          "email"
        ],
        "additionalProperties": false,
        "properties": {
          "firstname": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "lastname": {
            "type": "string",
            "maxLength": 60
          },
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 5,
            "maxLength": 145
          },
          "destination": {
            "type": "string",
            "enum": [
              "OTRO",
              "CARIBE",
              "EUROPA",
              "SUDAMERICA",
              "MUNDO"
            ],
            "default": "OTRO"
          }
        }
      },
      "NewsletterResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "type": "object",
            "required": [
              "id_newsletter",
              "email",
              "destination",
              "creation_date"
            ],
            "additionalProperties": false,
            "properties": {
              "id_newsletter": {
                "type": "integer"
              },
              "email": {
                "type": "string"
              },
              "destination": {
                "type": "string"
              },
              "creation_date": {
                "type": "string",
                "description": "Subscription timestamp, YYYY-MM-DD HH:MM:SS in the API account timezone."
              }
            }
          }
        }
      },
      "DestinationResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/Destination"
          }
        }
      },
      "DestinationsResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/DestinationsData"
          }
        }
      },
      "DestinationsData": {
        "type": "object",
        "required": [
          "total",
          "results"
        ],
        "additionalProperties": false,
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Destination"
            }
          }
        }
      },
      "Destination": {
        "type": "object",
        "required": [
          "id",
          "name",
          "parent_id",
          "url",
          "active",
          "parent",
          "children"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "parent_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "active": {
            "$ref": "#/components/schemas/Flag"
          },
          "parent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RelationSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelationSummary"
            }
          }
        }
      },
      "CategoryResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/Category"
          }
        }
      },
      "CategoriesResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/CategoriesData"
          }
        }
      },
      "CategoriesData": {
        "type": "object",
        "required": [
          "total",
          "results"
        ],
        "additionalProperties": false,
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Category"
            }
          }
        }
      },
      "Category": {
        "type": "object",
        "required": [
          "id",
          "name",
          "parent_id",
          "url",
          "image",
          "active",
          "parent",
          "children"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "parent_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "active": {
            "$ref": "#/components/schemas/Flag"
          },
          "parent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RelationSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelationSummary"
            }
          }
        }
      },
      "ProductResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/ProductDetail"
          }
        }
      },
      "ProductSearchRequest": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100
          },
          "page": {
            "type": "integer",
            "minimum": 1
          },
          "id_products": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1
            },
            "minItems": 1,
            "maxItems": 100,
            "uniqueItems": true,
            "description": "Exact product ids. The request fails if any id is not visible to the API consumer. Do not combine with listing filters or pagination."
          },
          "id_destination": {
            "type": "integer",
            "minimum": 1
          },
          "destination_scope": {
            "type": "string",
            "enum": [
              "tree",
              "linked"
            ],
            "default": "tree"
          },
          "id_category": {
            "type": "integer",
            "minimum": 1
          },
          "category_scope": {
            "type": "string",
            "enum": [
              "tree",
              "linked"
            ],
            "default": "tree"
          },
          "month": {
            "type": "integer",
            "minimum": 1,
            "maximum": 12
          },
          "year": {
            "type": "integer",
            "minimum": 1
          }
        }
      },
      "ProductGroupsResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/ProductGroupsData"
          }
        }
      },
      "ProductGroupsData": {
        "type": "object",
        "required": [
          "by",
          "group",
          "groups"
        ],
        "additionalProperties": false,
        "properties": {
          "by": {
            "type": "string",
            "enum": [
              "destination",
              "category"
            ]
          },
          "group": {
            "type": "string"
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductGroupRow"
            }
          }
        }
      },
      "ProductGroupRow": {
        "type": "object",
        "required": [
          "id",
          "name",
          "parent_id",
          "url",
          "total",
          "products_url"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "parent_id": {
            "type": [
              "integer",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "total": {
            "type": "integer",
            "minimum": 1
          },
          "products_url": {
            "type": "string"
          },
          "top_ranked": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TopRankedProduct"
            }
          }
        }
      },
      "TopRankedProduct": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url",
          "image",
          "price_from_ars",
          "price_from_usd",
          "currency"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "price_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount in ARS, without currency symbol or thousands separator."
          },
          "price_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount in USD, without currency symbol or thousands separator. For site 1 this is the USD cash alternative when available; for site 2 this is the primary display price."
          },
          "currency": {
            "type": "string",
            "enum": [
              "ARS",
              "USD"
            ],
            "description": "Package base currency used by this product's prices."
          }
        }
      },
      "ProductsResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/ProductsData"
          }
        }
      },
      "ProductsData": {
        "type": "object",
        "required": [
          "total",
          "results"
        ],
        "additionalProperties": false,
        "properties": {
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          }
        }
      },
      "Product": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url",
          "price_from_ars",
          "price_from_usd",
          "currency",
          "discount",
          "transport",
          "meal_plan",
          "deposit_from_ars",
          "deposit_from_usd",
          "num_of_payments",
          "destinations",
          "categories"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "subtitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string"
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "discount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Informational package-level discount percentage."
          },
          "transport": {
            "type": "string",
            "description": "Public transport label for the package."
          },
          "meal_plan": {
            "type": "string",
            "description": "Public meal-plan/regimen label for the package."
          },
          "price_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount in ARS, without currency symbol or thousands separator."
          },
          "price_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount in USD, without currency symbol or thousands separator. For site 1 this is the USD cash alternative when available; for site 2 this is the primary display price."
          },
          "currency": {
            "type": "string",
            "enum": [
              "ARS",
              "USD"
            ],
            "description": "Package base currency used by this product's prices."
          },
          "has_hotel": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_transfer": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_assistance": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_tour": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_tax": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_double_shared": {
            "$ref": "#/components/schemas/Flag"
          },
          "kids_age": {
            "type": [
              "integer",
              "null"
            ]
          },
          "nights": {
            "description": "Display durations in nights available for the product.",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "integer"
            }
          },
          "can_deposit": {
            "$ref": "#/components/schemas/Flag",
            "description": "True when the product can effectively support a deposit reservation. This is false when deposit is configured internally but installments do not apply. The selected departure price must also include deposit values before using payment_option=deposit."
          },
          "can_buy": {
            "$ref": "#/components/schemas/Flag",
            "description": "True when the product can support a full-payment reservation with payment_option=buy."
          },
          "deposit_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer ARS deposit preview based on the product price_from departure when show_payments applies; null otherwise. This is not a configured product amount and must not be sent in reservation requests. Use departure detail prices[].amounts[] for the selected price deposit."
          },
          "deposit_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer USD deposit preview when available. For site 1 this is the USD cash alternative; for site 2 this is the primary display-currency deposit."
          },
          "num_of_payments": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Installment count used to calculate the product-level deposit preview, when available. Calculated from the departure payment plan, including show_payments, departure date, final-payment deadline, and increase rules."
          },
          "destinations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelationSummary"
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelationSummary"
            }
          }
        }
      },
      "ProductDetail": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url",
          "price_from_ars",
          "price_from_usd",
          "currency",
          "discount",
          "transport",
          "meal_plan",
          "deposit_from_ars",
          "deposit_from_usd",
          "num_of_payments",
          "destinations",
          "categories",
          "images",
          "payment_options"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "subtitle": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": "string"
          },
          "discount": {
            "type": [
              "number",
              "null"
            ],
            "description": "Informational package-level discount percentage."
          },
          "transport": {
            "type": "string",
            "description": "Public transport label for the package."
          },
          "meal_plan": {
            "type": "string",
            "description": "Public meal-plan/regimen label for the package."
          },
          "price_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount in ARS, without currency symbol or thousands separator."
          },
          "price_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount in USD, without currency symbol or thousands separator. For site 1 this is the USD cash alternative when available; for site 2 this is the primary display price."
          },
          "currency": {
            "type": "string",
            "enum": [
              "ARS",
              "USD"
            ],
            "description": "Package base currency used by this product's prices."
          },
          "has_hotel": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_transfer": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_assistance": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_tour": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_tax": {
            "$ref": "#/components/schemas/Flag"
          },
          "has_double_shared": {
            "$ref": "#/components/schemas/Flag"
          },
          "kids_age": {
            "type": [
              "integer",
              "null"
            ]
          },
          "nights": {
            "description": "Display durations in nights available for the product.",
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "integer"
            }
          },
          "can_deposit": {
            "$ref": "#/components/schemas/Flag",
            "description": "True when the product can effectively support a deposit reservation. This is false when deposit is configured internally but installments do not apply. The selected departure price must also include deposit values before using payment_option=deposit."
          },
          "can_buy": {
            "$ref": "#/components/schemas/Flag",
            "description": "True when the product can support a full-payment reservation with payment_option=buy."
          },
          "deposit_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer ARS deposit preview based on the product price_from departure when show_payments applies; null otherwise. This is not a configured product amount and must not be sent in reservation requests. Use departure detail prices[].amounts[] for the selected price deposit."
          },
          "deposit_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer USD deposit preview when available. For site 1 this is the USD cash alternative; for site 2 this is the primary display-currency deposit."
          },
          "num_of_payments": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Installment count used to calculate the product-level deposit preview, when available. Calculated from the departure payment plan, including show_payments, departure date, final-payment deadline, and increase rules."
          },
          "destinations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelationSummary"
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RelationSummary"
            }
          },
          "images": {
            "type": "array",
            "description": "Ordered product gallery, sorted by the admin image order.",
            "items": {
              "$ref": "#/components/schemas/ProductImage"
            }
          },
          "payment_options": {
            "$ref": "#/components/schemas/ProductPaymentOptions"
          }
        }
      },
      "ProductImage": {
        "type": "object",
        "required": [
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          }
        }
      },
      "ProductPaymentOptions": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "buy": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductPaymentOption"
            }
          },
          "deposit": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductPaymentOption"
            }
          }
        }
      },
      "ProductPaymentOption": {
        "type": "object",
        "required": [
          "name",
          "title",
          "description"
        ],
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "RelationSummary": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "ProductDeparturesResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/ProductDeparturesData"
          }
        }
      },
      "ProductDeparturesData": {
        "type": "object",
        "required": [
          "product_id",
          "currency",
          "total",
          "filters",
          "results"
        ],
        "additionalProperties": false,
        "properties": {
          "product_id": {
            "type": "integer"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Package base currency used by this product's departure prices."
          },
          "total": {
            "type": "integer",
            "minimum": 0
          },
          "filters": {
            "$ref": "#/components/schemas/ProductDepartureFilters"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDeparture"
            }
          }
        }
      },
      "ProductDepartureFilters": {
        "type": "object",
        "required": [
          "price",
          "stars",
          "months",
          "itinerary_days",
          "luggage",
          "route"
        ],
        "additionalProperties": false,
        "properties": {
          "price": {
            "type": "object",
            "required": [
              "min",
              "max"
            ],
            "additionalProperties": false,
            "properties": {
              "min": {
                "type": "integer",
                "minimum": 0
              },
              "max": {
                "type": "integer",
                "minimum": 0
              }
            }
          },
          "stars": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "months": {
            "type": "array",
            "description": "Departure start months available across all matching departures.",
            "items": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}$"
            }
          },
          "itinerary_days": {
            "type": "array",
            "items": {
              "type": "integer"
            }
          },
          "luggage": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "route": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "ProductDeparture": {
        "type": "object",
        "required": [
          "id",
          "start_date",
          "end_date",
          "nights",
          "itinerary_days",
          "assistance_days",
          "available_prices_count",
          "inventory_type",
          "available_seats",
          "price_from_ars",
          "price_from_usd",
          "deposit_from_ars",
          "deposit_from_usd",
          "num_of_payments",
          "is_hook",
          "hotel_stars",
          "flexible"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "start_date": {
            "type": "string",
            "format": "date"
          },
          "end_date": {
            "type": "string",
            "format": "date"
          },
          "nights": {
            "type": [
              "integer",
              "null"
            ]
          },
          "itinerary_days": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Passenger-facing itinerary duration in days."
          },
          "assistance_days": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Coverage duration in days used for assistance and ViajeFlex calculations."
          },
          "last_seats": {
            "type": [
              "integer",
              "null"
            ]
          },
          "available_prices_count": {
            "type": "integer",
            "minimum": 1,
            "description": "Number of available price rows for this departure. This counts enabled price options, not room amounts."
          },
          "inventory_type": {
            "type": "string",
            "enum": [
              "allotment",
              "regular",
              "no_flight"
            ],
            "description": "Commercial inventory type for this departure: allotment means confirmed flight seats, regular means regular flight departures, and no_flight means no flight is attached."
          },
          "available_seats": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Remaining seats for confirmed flight inventory. Null for regular flight and no-flight departures."
          },
          "price_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer departure starting price amount in ARS, without currency symbol or thousands separator."
          },
          "price_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer departure starting price amount in USD, without currency symbol or thousands separator. For site 1 this is the USD cash alternative when available; for site 2 this is the primary display price."
          },
          "deposit_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer calculated ARS payment-plan deposit preview for this departure, when available."
          },
          "deposit_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer calculated USD deposit preview for this departure, when available."
          },
          "num_of_payments": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Installment count used to calculate the departure deposit preview, when available. Calculated from the departure payment plan, including show_payments, departure date, final-payment deadline, and increase rules."
          },
          "city_from": {
            "type": [
              "string",
              "null"
            ]
          },
          "is_hook": {
            "$ref": "#/components/schemas/Flag"
          },
          "hotel_stars": {
            "type": "array",
            "description": "Aggregate hotel star values across all available price options for this departure. Read prices[].hotels[].stars in departure detail for the exact hotels attached to each price.",
            "items": {
              "type": "integer"
            }
          },
          "luggage": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "route": {
            "type": [
              "string",
              "null"
            ]
          },
          "flexible": {
            "$ref": "#/components/schemas/Flag"
          }
        }
      },
      "ProductDepartureDetailResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "$ref": "#/components/schemas/ProductDepartureDetail"
          }
        }
      },
      "ProductDepartureDetail": {
        "type": "object",
        "required": [
          "product_id",
          "currency",
          "description",
          "prices",
          "has_amounts",
          "price_from_type",
          "discount",
          "kids_age",
          "start_date",
          "end_date",
          "nights",
          "itinerary_days",
          "assistance_days",
          "flight",
          "id_departure"
        ],
        "additionalProperties": false,
        "properties": {
          "product_id": {
            "type": "integer"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Package base currency for this product departure detail payload."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Departure description when present, otherwise the product description_html value."
          },
          "prices": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDeparturePrice"
            }
          },
          "has_amounts": {
            "$ref": "#/components/schemas/Flag"
          },
          "price_from_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "discount": {
            "type": [
              "number",
              "null"
            ]
          },
          "kids_age": {
            "type": [
              "integer",
              "number",
              "null"
            ]
          },
          "start_date": {
            "type": "string",
            "format": "date"
          },
          "end_date": {
            "type": "string",
            "format": "date"
          },
          "nights": {
            "type": [
              "integer",
              "null"
            ]
          },
          "itinerary_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "assistance_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "flight": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProductDepartureFlight"
              },
              {
                "type": "null"
              }
            ]
          },
          "id_departure": {
            "type": "integer"
          }
        }
      },
      "ProductDeparturePricePreviewRequest": {
        "type": "object",
        "required": [
          "id_price",
          "rooms"
        ],
        "additionalProperties": false,
        "properties": {
          "id_price": {
            "type": "integer",
            "minimum": 1,
            "description": "Selected price id from the departure detail prices list."
          },
          "rooms": {
            "type": "object",
            "additionalProperties": false,
            "minProperties": 1,
            "description": "Room selection as a map of room type to the number of rooms of that type, for example {\"double\": 1}. At least one room count must be greater than zero, and every selected room type must appear in the selected price's amounts list.",
            "properties": {
              "single": { "type": "integer", "minimum": 0 },
              "double": { "type": "integer", "minimum": 0 },
              "double_shared": { "type": "integer", "minimum": 0 },
              "triple": { "type": "integer", "minimum": 0 },
              "quadruple": { "type": "integer", "minimum": 0 },
              "sextuple": { "type": "integer", "minimum": 0 },
              "family_1": { "type": "integer", "minimum": 0 },
              "family_2": { "type": "integer", "minimum": 0 }
            }
          },
          "coupon_code": {
            "type": "string",
            "description": "Optional alphanumeric coupon code resolved with the coupon rules engine. Suggested default codes are not applied unless sent here."
          }
        }
      },
      "ProductDeparturePricePreviewResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "type": "object",
            "required": [
              "pax_count",
              "default_code",
              "applied",
              "total_ars",
              "total_usd",
              "new_total_ars",
              "new_total_usd"
            ],
            "additionalProperties": false,
            "properties": {
              "pax_count": {
                "type": "integer",
                "description": "Passenger count implied by rooms."
              },
              "default_code": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Suggested coupon code for this product when one applies and no coupon was applied in this request; null when applied is true. It is informational and not applied unless submitted as coupon_code."
              },
              "applied": {
                "type": "boolean",
                "description": "True only when coupon_code was submitted and successfully applied."
              },
              "total_ars": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded selected total in ARS before coupon, without currency symbol or separators."
              },
              "total_usd": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded selected total in USD before coupon, without currency symbol or separators."
              },
              "new_total_ars": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded selected total in ARS after coupon when applied; otherwise equal to total_ars."
              },
              "new_total_usd": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded selected total in USD after coupon when applied; otherwise equal to total_usd."
              },
              "code": {
                "type": "string",
                "description": "Applied coupon code. Present only when applied is true."
              },
              "original_total_ars": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded ARS total before the applied coupon. Present only when applied is true."
              },
              "original_total_usd": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded USD total before the applied coupon. Present only when applied is true."
              },
              "amount_discount_ars": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded ARS discount amount. Present only when applied is true."
              },
              "amount_discount_usd": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Rounded USD discount amount. Present only when applied is true."
              },
              "discount_type": {
                "type": "string",
                "enum": [
                  "amount",
                  "percent"
                ],
                "description": "Applied coupon discount type. Present only when applied is true."
              },
              "configured_value": {
                "type": "number",
                "description": "Configured coupon amount or percent value. Present only when applied is true."
              }
            }
          }
        }
      },
      "ProductDepartureContactRequest": {
        "type": "object",
        "required": [
          "firstname",
          "email",
          "phone",
          "origin",
          "id_price",
          "rooms"
        ],
        "additionalProperties": false,
        "properties": {
          "firstname": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "lastname": {
            "type": "string",
            "maxLength": 60
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 145
          },
          "phone": {
            "type": "string",
            "maxLength": 100
          },
          "origin": {
            "type": "string",
            "enum": [
              "contact",
              "whatsapp",
              "call"
            ],
            "description": "Selected contact action. whatsapp and call require current advisor availability; when unavailable, use contact for the fallback lead."
          },
          "id_price": {
            "type": "integer",
            "minimum": 1,
            "description": "Selected price id from the departure detail prices list."
          },
          "rooms": {
            "type": "object",
            "additionalProperties": false,
            "minProperties": 1,
            "description": "Room selection as a map of room type to the number of rooms of that type, for example {\"double\": 1}. At least one room count must be greater than zero, and every selected room type must appear in the selected price's amounts list.",
            "properties": {
              "single": { "type": "integer", "minimum": 0 },
              "double": { "type": "integer", "minimum": 0 },
              "double_shared": { "type": "integer", "minimum": 0 },
              "triple": { "type": "integer", "minimum": 0 },
              "quadruple": { "type": "integer", "minimum": 0 },
              "sextuple": { "type": "integer", "minimum": 0 },
              "family_1": { "type": "integer", "minimum": 0 },
              "family_2": { "type": "integer", "minimum": 0 }
            }
          },
          "coupon_code": {
            "type": "string",
            "description": "Optional alphanumeric coupon code resolved with the coupon rules engine."
          },
          "consumer": {
            "type": "string",
            "description": "Ignored. Contact ownership is derived from the authenticated API key, never from the request body."
          }
        }
      },
      "ProductDepartureContactResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "type": "object",
            "required": [
              "id_contact",
              "id_seller",
              "creation_date",
              "status",
              "channel",
              "id_product",
              "id_departure",
              "id_price"
            ],
            "additionalProperties": false,
            "properties": {
              "id_contact": {
                "type": "integer"
              },
              "id_seller": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Assigned seller id for the contact. It is null when the lead was not assigned to a seller, for example call-origin or spam contacts."
              },
              "creation_date": {
                "type": "string",
                "description": "Contact creation timestamp in the API account timezone, formatted as YYYY-MM-DD HH:MM:SS.",
                "example": "2026-06-03 18:59:05"
              },
              "status": {
                "type": "string",
                "enum": [
                  "PENDING",
                  "SPAM"
                ]
              },
              "channel": {
                "type": "string",
                "const": "PUBLIC_API"
              },
              "id_product": {
                "type": "integer"
              },
              "id_departure": {
                "type": "integer"
              },
              "id_price": {
                "type": "integer"
              }
            }
          }
        }
      },
      "ProductDepartureReservationRequest": {
        "type": "object",
        "required": [
          "id_price",
          "payment_option",
          "rooms",
          "customer",
          "passengers"
        ],
        "additionalProperties": false,
        "properties": {
          "id_price": {
            "type": "integer",
            "minimum": 1,
            "description": "Selected price id from the departure detail prices list."
          },
          "payment_option": {
            "type": "string",
            "enum": [
              "buy",
              "deposit"
            ],
            "description": "Reservation payment option. The selected product must support the requested option."
          },
          "rooms": {
            "type": "object",
            "additionalProperties": false,
            "minProperties": 1,
            "description": "Room selection as a map of room type to the number of rooms of that type, for example {\"double\": 1}. At least one room count must be greater than zero, and every selected room type must appear in the selected price's amounts list.",
            "properties": {
              "single": { "type": "integer", "minimum": 0 },
              "double": { "type": "integer", "minimum": 0 },
              "double_shared": { "type": "integer", "minimum": 0 },
              "triple": { "type": "integer", "minimum": 0 },
              "quadruple": { "type": "integer", "minimum": 0 },
              "sextuple": { "type": "integer", "minimum": 0 },
              "family_1": { "type": "integer", "minimum": 0 },
              "family_2": { "type": "integer", "minimum": 0 }
            }
          },
          "customer": {
            "type": "object",
            "required": [
              "firstname",
              "lastname",
              "email",
              "phone",
              "cuil"
            ],
            "additionalProperties": false,
            "properties": {
              "firstname": { "type": "string", "minLength": 1, "maxLength": 60 },
              "lastname": { "type": "string", "minLength": 1, "maxLength": 60 },
              "email": { "type": "string", "format": "email", "maxLength": 145 },
              "email2": { "type": "string", "format": "email", "maxLength": 145 },
              "area_code": { "type": "string", "maxLength": 20 },
              "phone": { "type": "string", "maxLength": 100 },
              "cuil": { "type": "string", "description": "Customer CUIL used to resolve or create the linked client." },
              "foreign_pax": { "type": "string" }
            }
          },
          "passengers": {
            "type": "array",
            "minItems": 1,
            "description": "One passenger object per room occupant. Passenger count must match the selected rooms pax count.",
            "items": {
              "type": "object",
              "required": [
                "firstname",
                "lastname",
                "document",
                "nationality",
                "birth_date"
              ],
              "additionalProperties": false,
              "properties": {
                "firstname": { "type": "string", "minLength": 1, "maxLength": 60 },
                "lastname": { "type": "string", "minLength": 1, "maxLength": 60 },
                "document": { "type": "string", "minLength": 1 },
                "nationality": { "type": "string", "minLength": 1 },
                "birth_date": {
                  "type": "string",
                  "format": "date",
                  "description": "Passenger birth date in YYYY-MM-DD format."
                }
              }
            }
          },
          "coupon_code": {
            "type": "string",
            "description": "Optional alphanumeric coupon code resolved with the coupon rules engine."
          },
          "viajeflex_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Optional ViajeFlex service id for flexible confirmed-flight departures. The id must be available for the selected price and room selection."
          },
          "consumer": {
            "type": "string",
            "description": "Ignored. Reservation ownership is derived from the authenticated API key, never from the request body."
          }
        }
      },
      "ProductDepartureReservationResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "type": "object",
            "required": [
              "id_reservation",
              "creation_date",
              "status",
              "channel",
              "origin",
              "id_product",
              "id_departure",
              "id_price",
              "payment_option",
              "payment_selection",
              "price_ars",
              "price_usd",
              "deposit_ars",
              "deposit_usd",
              "currency_to"
            ],
            "additionalProperties": false,
            "properties": {
              "id_reservation": { "type": "integer" },
              "creation_date": {
                "type": "string",
                "description": "Reservation creation timestamp in the API account timezone, formatted as YYYY-MM-DD HH:MM:SS.",
                "example": "2026-06-03 18:59:05"
              },
              "status": { "type": "string" },
              "channel": { "type": "string", "const": "PUBLIC_API" },
              "origin": { "type": "string", "const": "PUBLIC_API" },
              "id_product": { "type": "integer" },
              "id_departure": { "type": "integer" },
              "id_price": { "type": "integer" },
              "payment_option": {
                "type": "string",
                "enum": [
                  "buy",
                  "deposit"
                ]
              },
              "payment_selection": { "type": "string", "const": "TRANSFER" },
              "price_ars": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted reservation price in ARS, without currency symbol or thousands separator."
              },
              "price_usd": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted reservation price in USD, without currency symbol or thousands separator. For ARS reservations this is the USD cash alternative when available."
              },
              "deposit_ars": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted ARS deposit amount for the reservation receipt."
              },
              "deposit_usd": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted USD deposit amount for the reservation receipt."
              },
              "currency_to": { "type": "string" }
            }
          }
        }
      },
      "ReservationResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "type": "object",
            "required": [
              "id_reservation",
              "creation_date",
              "status",
              "channel",
              "origin",
              "id_product",
              "id_departure",
              "payment_selection",
              "price_ars",
              "price_usd",
              "deposit_ars",
              "deposit_usd",
              "currency_to"
            ],
            "additionalProperties": false,
            "properties": {
              "id_reservation": { "type": "integer" },
              "creation_date": {
                "type": "string",
                "description": "Reservation creation timestamp in the API account timezone, formatted as YYYY-MM-DD HH:MM:SS.",
                "example": "2026-06-03 19:11:02"
              },
              "status": {
                "type": "string",
                "description": "Current reservation workflow status. This can change after the reservation is created."
              },
              "channel": { "type": "string", "const": "PUBLIC_API" },
              "origin": { "type": "string", "const": "PUBLIC_API" },
              "id_product": { "type": "integer" },
              "id_departure": { "type": "integer" },
              "payment_selection": { "type": "string", "const": "TRANSFER" },
              "price_ars": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted reservation price in ARS, without currency symbol or thousands separator."
              },
              "price_usd": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted reservation price in USD, without currency symbol or thousands separator. For ARS reservations this is the USD cash alternative when available."
              },
              "deposit_ars": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted ARS deposit amount for the reservation receipt."
              },
              "deposit_usd": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Rounded integer server-computed persisted USD deposit amount for the reservation receipt."
              },
              "currency_to": { "type": "string" }
            }
          }
        }
      },
      "ContactResponse": {
        "type": "object",
        "required": [
          "success",
          "data"
        ],
        "additionalProperties": false,
        "properties": {
          "success": {
            "type": "integer",
            "const": 1
          },
          "data": {
            "type": "object",
            "required": [
              "id_contact",
              "id_seller",
              "creation_date",
              "status",
              "channel",
              "id_product",
              "id_departure",
              "id_price"
            ],
            "additionalProperties": false,
            "properties": {
              "id_contact": {
                "type": "integer"
              },
              "id_seller": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Assigned seller id for the contact. It is null when the lead is not assigned to a seller."
              },
              "creation_date": {
                "type": "string",
                "description": "Contact creation timestamp in the API account timezone, formatted as YYYY-MM-DD HH:MM:SS.",
                "example": "2026-06-03 18:59:05"
              },
              "status": {
                "type": "string",
                "description": "Current contact workflow status. This can change after the lead is created.",
                "enum": [
                  "PENDING",
                  "RECONTACT",
                  "INITIAL_CALL",
                  "QUOTE",
                  "FOLLOW",
                  "FOLLOW_2",
                  "FOLLOW_3",
                  "ANSWER",
                  "RESERVED",
                  "UNANSWERED",
                  "SPAM"
                ]
              },
              "channel": {
                "type": "string",
                "const": "PUBLIC_API"
              },
              "id_product": {
                "type": "integer"
              },
              "id_departure": {
                "type": "integer"
              },
              "id_price": {
                "type": "integer"
              }
            }
          }
        }
      },
      "ProductDeparturePrice": {
        "type": "object",
        "required": [
          "id",
          "amounts",
          "hotels",
          "circuits",
          "transfers",
          "assistances",
          "count",
          "price_from_ars",
          "price_from_usd",
          "price_from_type"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "amounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDepartureAmount"
            }
          },
          "hotels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDepartureIncludedHotel"
            }
          },
          "circuits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDepartureIncludedCircuit"
            }
          },
          "transfers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDepartureIncludedTransfer"
            }
          },
          "assistances": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDepartureIncludedAssistance"
            }
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "price_from_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount for this price row in ARS, without currency symbol or thousands separator."
          },
          "price_from_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer starting price amount for this price row in USD, without currency symbol or thousands separator. For site 1 this is the USD cash alternative when available; for site 2 this is the primary display price."
          },
          "price_from_type": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ProductDepartureAmount": {
        "type": "object",
        "required": [
          "name",
          "price_ars",
          "price_usd",
          "max_pax",
          "room_type",
          "has_kids",
          "viajeflex_options",
          "deposit_ars",
          "deposit_usd",
          "num_of_payments"
        ],
        "additionalProperties": false,
        "properties": {
          "price_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer selectable room price amount in ARS, without currency symbol or thousands separator."
          },
          "name": {
            "type": "string"
          },
          "price_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer selectable room price amount in USD, without currency symbol or thousands separator. For site 1 this is the USD cash alternative when available; for site 2 this is the primary display price."
          },
          "max_pax": {
            "type": [
              "integer",
              "null"
            ]
          },
          "room_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "has_kids": {
            "$ref": "#/components/schemas/Flag"
          },
          "viajeflex_options": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ProductDepartureViajeflexOption"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "deposit_ars": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer calculated ARS deposit value for this room amount, departure date, and payment-plan installment count."
          },
          "deposit_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "Rounded integer calculated USD deposit value for this room amount, when available."
          },
          "num_of_payments": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Installment count used to calculate this room amount deposit, when available. Calculated from the departure payment plan, including show_payments, departure date, final-payment deadline, and increase rules."
          }
        }
      },
      "ProductDepartureViajeflexOption": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "additional": {
            "type": "number"
          },
          "max": {
            "type": [
              "number",
              "null"
            ]
          },
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "ProductDepartureMealPlan": {
        "type": "object",
        "required": [
          "code",
          "label"
        ],
        "additionalProperties": false,
        "properties": {
          "code": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        }
      },
      "ProductDepartureIncludedHotel": {
        "type": "object",
        "required": [
          "id",
          "name",
          "stars",
          "destination",
          "image",
          "nights",
          "check_in_date",
          "check_out_date",
          "meal_plan"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "stars": {
            "type": [
              "integer",
              "number",
              "null"
            ]
          },
          "destination": {
            "type": [
              "string",
              "null"
            ]
          },
          "image": {
            "type": [
              "string",
              "null"
            ]
          },
          "nights": {
            "type": [
              "integer",
              "number",
              "null"
            ]
          },
          "check_in_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "check_out_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "meal_plan": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProductDepartureMealPlan"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ProductDepartureIncludedCircuit": {
        "type": "object",
        "required": [
          "id",
          "name",
          "nights",
          "start_date",
          "end_date",
          "meal_plan"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "nights": {
            "type": [
              "integer",
              "number",
              "null"
            ]
          },
          "start_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "end_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "meal_plan": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProductDepartureMealPlan"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "ProductDepartureIncludedTransfer": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        }
      },
      "ProductDepartureIncludedAssistance": {
        "type": "object",
        "required": [
          "id",
          "name",
          "days",
          "source",
          "included_by_operator"
        ],
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "MANUAL",
              "AUTOMATIC",
              "OPERATOR_INCLUDED"
            ]
          },
          "included_by_operator": {
            "$ref": "#/components/schemas/Flag"
          }
        }
      },
      "ProductDepartureFlight": {
        "type": "object",
        "required": [
          "inventory_type",
          "available_seats",
          "last_seats",
          "route",
          "luggage",
          "departure_date",
          "arrival_date",
          "flight_legs"
        ],
        "additionalProperties": false,
        "properties": {
          "inventory_type": {
            "type": "string",
            "enum": [
              "ALLOTMENT",
              "REGULAR"
            ],
            "description": "ALLOTMENT means confirmed seat inventory that consumes available seats; REGULAR means a regular flight without API seat consumption."
          },
          "available_seats": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Remaining seats only for ALLOTMENT flights. Null for REGULAR flights."
          },
          "last_seats": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Remaining seats when ALLOTMENT inventory is low, otherwise null."
          },
          "route": {
            "type": [
              "string",
              "null"
            ]
          },
          "luggage": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "departure_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "arrival_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "flight_legs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProductDepartureFlightLeg"
            }
          }
        }
      },
      "ProductDepartureFlightLeg": {
        "type": "object",
        "required": [
          "leg_type",
          "airport_from",
          "city_from",
          "airport_to",
          "city_to",
          "airline_name",
          "flight_number",
          "departure_date",
          "arrival_date"
        ],
        "additionalProperties": false,
        "properties": {
          "leg_type": {
            "type": "string",
            "enum": [
              "OUTBOUND",
              "CONNECTION",
              "RETURN"
            ]
          },
          "airport_from": {
            "type": [
              "string",
              "null"
            ]
          },
          "city_from": {
            "type": [
              "string",
              "null"
            ]
          },
          "airport_to": {
            "type": [
              "string",
              "null"
            ]
          },
          "city_to": {
            "type": [
              "string",
              "null"
            ]
          },
          "airline_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "flight_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "departure_date": {
            "type": [
              "string",
              "null"
            ]
          },
          "arrival_date": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Flag": {
        "type": "boolean"
      },
      "ErrorResponse": {
        "type": "object",
        "required": [
          "success",
          "error"
        ],
        "properties": {
          "success": {
            "type": "integer",
            "const": 0
          },
          "error": {
            "type": "string",
            "enum": [
              "unauthorized",
              "invalid_request",
              "not_found",
              "rate_limited"
            ]
          },
          "message": {
            "type": "string"
          }
        }
      }
    }
  }
}
