For the complete documentation index, see llms.txt. This page is also available as Markdown.

Localization

Content available for multiple languages

Suppliers can store content in multiple languages in Ventrata. Requests should include the Accept-Language header, ideally matching the language preferences sent by the client browser or user agent.

More information about the structure of that header is available on MDN.

The API attempts to match the preferred languages against languages already translated by the supplier. The response includes a Content-Language header indicating the language returned, consistent with the HTTP standard.

Use the product operation below with the Accept-Language header to request localized content:

Get Product

get

Get details on a specific product.

Path parameters
productIdstringRequired

Product ID, for example: 94cdd032-3d32-416d-b0a4-abf8b7495b8b.

Example: e7cc8bb4-8d1c-4848-8824-5dbedb718681
Query parameters
currencystringOptional

Optional currency override. Use an ISO-4217 currency code from availableCurrencies or default.

Example: USD
offerCodestringOptional

Offer code or combination context.

Example: SUMMER25
membership[id]string · uuidOptional

Membership identifier returned by /memberships/lookup. When set, also include membership[verification] and one of membership[email], membership[mobile], or membership[reference].

Example: 89fe0192-ddcd-430a-b285-e1396a4725d2
membership[email]string · emailOptional

Membership email used during lookup.

Example: jane.doe@goldengatetours.com
membership[mobile]stringOptional

Membership mobile number used during lookup.

Example: +12025550123
membership[country]stringOptional

ISO 3166-1 alpha-2 country code used to parse membership[mobile].

Example: US
membership[reference]stringOptional

Membership reference used during lookup. Use with membership[id] and membership[verification] as one of the allowed lookup identifiers.

Example: REF-2026-001
membership[verification]stringOptional

Verification token from lookup (OTP for email/mobile, or guest name for reference). Required when membership[id] is provided.

Example: 123456
Header parameters
Accept-LanguagestringRequired

fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5

Example: en-US
Octo-CapabilitiesstringOptional

Optional comma-separated capability IDs.

Example: octo/pricing,octo/offers
Responses
200

Successful response

application/json
allowFreesalebooleanOptional

Whether allow freesale is enabled.

Example: true
availabilityRequiredbooleanOptional

Whether availability required is enabled.

Example: true
availabilityTypestring · enumOptional

Availability type value.

Example: START_TIMEPossible values:
deliveryFormatsstring[]Optional

List of delivery format values.

Example: ["PDF_URL","QRCODE"]
deliveryMethodsstring[]Optional

List of delivery methods available for this product. VOUCHER means one ticket media object per booking (booking.voucher); TICKET means one ticket media object per unit item (booking.unitItems[].ticket).

Example: ["VOUCHER","TICKET"]
fixedWeightbooleanOptional

Whether fixed weight is enabled.

Example: true
freesaleDurationAmountnumberOptional

Freesale duration amount numeric value.

Example: 220
freesaleDurationRoundupbooleanOptional

Whether freesale duration roundup is enabled.

Example: true
freesaleDurationRoundupUnitstringOptional

Freesale duration roundup unit value.

Example: HOUR
freesaleDurationUnitstringOptional

Freesale duration unit value.

Example: HOUR
idstring · uuidRequired

Unique identifier for this resource.

Example: e7cc8bb4-8d1c-4848-8824-5dbedb718681
instantConfirmationbooleanOptional

Whether instant confirmation is enabled.

Example: true
instantDeliverybooleanOptional

Whether instant delivery is enabled.

Example: true
internalNamestringRequired

Internal name value.

Example: Walking Tour of Barcelona
localestringOptional

Locale code (BCP 47).

Example: en
redemptionMethodstringOptional

Redemption method value.

Example: DIGITAL
referencestringOptional

Reference value.

Example: BRC-WALK
settlementMethodsstring[]Optional

List of settlement method values.

Example: ["DIRECT","DEFERRED"]
tagsstring[]Optional

List of tag values.

Example: ["vip","partner"]
timeZonestringOptional

IANA timezone identifier.

Example: Europe/Madrid
weightUnitstringOptional

Weight unit for the weight value.

Example: kg
availableCurrenciesstring[]Optional

From capability octo/pricing.

Example: ["USD","EUR"]
defaultCurrencystringOptional

From capability octo/pricing.

Example: USD
hidePricingFrombooleanOptional

From capability octo/pricing.

Example: true
includeTaxbooleanOptional

From capability octo/pricing.

Example: true
pricingMultipliernumberOptional

From capability octo/pricing.

Example: 10
pricingPerstring · enumOptional

From capability octo/pricing.

Example: UNITPossible values:
isPackagebooleanOptional

From capability octo/packages.

Example: true
isPackagePassbooleanOptional

From capability octo/packages.

Example: true
packageProductbooleanOptional

From capability octo/packages.

Example: true
waiverPerstring · enumOptional

From capability octo/waivers. Whether waivers are collected per booking or per unit item.

Example: UNITPossible values:
waiverRequiredbooleanOptional

From capability octo/waivers. Whether waiver completion is required before the booking can be used.

Example: true
isRentalbooleanOptional

From capability octo/rentals.

Example: true
isMembershipbooleanOptional

From capability octo/memberships.

Example: true
membershipAutoRenewbooleanOptional

From capability octo/memberships.

Example: true
get/products/{productId}
GET /octo/products/{productId} HTTP/1.1
Host: api.ventrata.com
Accept-Language: text
Accept: */*
200

Successful response

{
  "allowFreesale": true,
  "availabilityRequired": true,
  "availabilityType": "START_TIME",
  "deliveryFormats": [
    "PDF_URL",
    "QRCODE"
  ],
  "deliveryMethods": [
    "VOUCHER",
    "TICKET"
  ],
  "fixedWeight": true,
  "freesaleDurationAmount": 220,
  "freesaleDurationRoundup": true,
  "freesaleDurationRoundupUnit": "HOUR",
  "freesaleDurationUnit": "HOUR",
  "id": "e7cc8bb4-8d1c-4848-8824-5dbedb718681",
  "instantConfirmation": true,
  "instantDelivery": true,
  "internalName": "Walking Tour of Barcelona",
  "locale": "en",
  "operator": {
    "id": "e7cc8bb4-8d1c-4848-8824-5dbedb718681",
    "name": "Morning City Tour"
  },
  "options": [
    {
      "availabilityCutoff": "2026-05-14T09:00:00-04:00",
      "availabilityCutoffAmount": 2,
      "availabilityCutoffUnit": "2026-05-14T09:00:00-04:00",
      "availabilityLocalDateEnd": "2026-12-31",
      "availabilityLocalDateStart": "2026-01-01",
      "availabilityLocalStartTimes": [
        "09:00",
        "13:00"
      ],
      "availabilityNotice": "2026-05-14T09:00:00-04:00",
      "availabilityNoticeAmount": 2,
      "availabilityNoticeUnit": "2026-05-14T09:00:00-04:00",
      "cancellationCutoff": "24",
      "cancellationCutoffAmount": 2,
      "cancellationCutoffUnit": "HOUR",
      "default": true,
      "id": "f1a5d2e8-8d57-4f0b-9c3f-6a12d7a8bc90",
      "internalName": "DEFAULT",
      "reference": "REF-2026-001",
      "requiredContactFields": [
        "fullName",
        "emailAddress"
      ],
      "restrictions": {
        "minUnits": 2,
        "maxUnits": 2,
        "minPaxCount": 2,
        "maxPaxCount": 2,
        "minTotal": 2,
        "maxTotal": 2,
        "unitIds": [
          "unit_adult",
          "unit_child"
        ]
      },
      "tags": [
        "vip",
        "partner"
      ],
      "units": [
        {
          "id": "94cdd032-3d32-416d-b0a4-abf8b7495b8b",
          "internalName": "Adult",
          "reference": "adult",
          "requiredContactFields": [
            "fullName",
            "emailAddress"
          ],
          "restrictions": {
            "required": true,
            "default": true,
            "minAge": 34,
            "maxAge": 34,
            "idRequired": true,
            "minQuantity": 2,
            "maxQuantity": 2,
            "paxCount": 2,
            "accompaniedBy": [
              "accompanied_by-example"
            ],
            "notAccompaniedBy": [
              "not_accompanied_by-example"
            ],
            "accompaniedByRatio": 2,
            "accompaniedByRatioDenominator": 2
          },
          "tags": [
            "vip",
            "partner"
          ],
          "type": "ADULT",
          "visibleContactFields": [
            "fullName",
            "emailAddress"
          ],
          "pricing": {
            "currency": "USD",
            "currencyPrecision": 2,
            "net": 18000,
            "original": 22000,
            "retail": 20000,
            "includedTaxes": [
              {
                "name": "Sales Tax",
                "shortDescription": "Local sales tax",
                "original": 2000,
                "retail": 1800,
                "net": 1600
              }
            ],
            "offerDiscount": {
              "retail": 2000,
              "net": 2000,
              "includedTaxes": [
                {
                  "name": "Sales Tax",
                  "shortDescription": "Local sales tax",
                  "retail": 200,
                  "net": 200
                }
              ]
            }
          },
          "pricingFrom": {
            "currency": "USD",
            "currencyPrecision": 2,
            "net": 18000,
            "original": 22000,
            "retail": 20000,
            "includedTaxes": [
              {
                "name": "Sales Tax",
                "shortDescription": "Local sales tax",
                "original": 2000,
                "retail": 1800,
                "net": 1600
              }
            ],
            "offerDiscount": {
              "retail": 2000,
              "net": 2000,
              "includedTaxes": [
                {
                  "name": "Sales Tax",
                  "shortDescription": "Local sales tax",
                  "retail": 200,
                  "net": 200
                }
              ]
            }
          },
          "extras": [
            {
              "customRetail": true,
              "customRetailOptions": [
                500,
                1000,
                1500
              ],
              "id": "3d6f0a3a-59d4-4b16-a0c5-11d2d8a4e6b7",
              "internalName": "Guide Gratuity",
              "reference": "guide_gratuity",
              "restrictions": {
                "default": false,
                "idRequired": false,
                "maxCustomRetail": 5000,
                "maxQuantity": 1,
                "minCustomRetail": 500,
                "minQuantity": 1,
                "paxCount": 0,
                "required": false,
                "accompaniedBy": [],
                "accompaniedByRatio": null,
                "accompaniedByRatioDenominator": null,
                "notAccompaniedBy": []
              },
              "tags": [
                "gratuity",
                "optional"
              ],
              "coverImageUrl": "https://images.ventrata.com/extras/guide-gratuity.jpg",
              "duration": null,
              "durationAmount": null,
              "durationUnit": null,
              "shortDescription": "Let the guest choose how much they want to tip the guide.",
              "title": "Guide Gratuity",
              "pricing": {
                "currency": "USD",
                "currencyPrecision": 2,
                "net": 18000,
                "original": 22000,
                "retail": 20000,
                "includedTaxes": [
                  {
                    "name": "Sales Tax",
                    "shortDescription": "Local sales tax",
                    "original": 2000,
                    "retail": 1800,
                    "net": 1600
                  }
                ],
                "offerDiscount": {
                  "retail": 2000,
                  "net": 2000,
                  "includedTaxes": [
                    {
                      "name": "Sales Tax",
                      "shortDescription": "Local sales tax",
                      "retail": 200,
                      "net": 200
                    }
                  ]
                }
              },
              "pricingFrom": {
                "currency": "USD",
                "currencyPrecision": 2,
                "net": 18000,
                "original": 22000,
                "retail": 20000,
                "includedTaxes": [
                  {
                    "name": "Sales Tax",
                    "shortDescription": "Local sales tax",
                    "original": 2000,
                    "retail": 1800,
                    "net": 1600
                  }
                ],
                "offerDiscount": {
                  "retail": 2000,
                  "net": 2000,
                  "includedTaxes": [
                    {
                      "name": "Sales Tax",
                      "shortDescription": "Local sales tax",
                      "retail": 200,
                      "net": 200
                    }
                  ]
                }
              }
            }
          ],
          "questions": [
            {
              "id": "3d6f0a3a-59d4-4b16-a0c5-11d2d8a4e6b7",
              "title": "Summer Promotion",
              "required": true,
              "inputType": "select",
              "maxLength": 2,
              "selectOptions": [
                {
                  "value": "value-example",
                  "label": "label-example"
                }
              ]
            }
          ],
          "isMembership": true,
          "membershipBenefit": {
            "id": "e7cc8bb4-8d1c-4848-8824-5dbedb718681",
            "title": "Summer Promotion",
            "description": "Morning departure with central pickup included."
          }
        }
      ],
      "visibleContactFields": [
        "fullName",
        "emailAddress"
      ],
      "pricing": {
        "currency": "USD",
        "currencyPrecision": 2,
        "net": 18000,
        "original": 22000,
        "retail": 20000,
        "includedTaxes": [
          {
            "name": "Sales Tax",
            "shortDescription": "Local sales tax",
            "original": 2000,
            "retail": 1800,
            "net": 1600
          }
        ],
        "offerDiscount": {
          "retail": 2000,
          "net": 2000,
          "includedTaxes": [
            {
              "name": "Sales Tax",
              "shortDescription": "Local sales tax",
              "retail": 200,
              "net": 200
            }
          ]
        }
      },
      "pricingFrom": {
        "currency": "USD",
        "currencyPrecision": 2,
        "net": 18000,
        "original": 22000,
        "retail": 20000,
        "includedTaxes": [
          {
            "name": "Sales Tax",
            "shortDescription": "Local sales tax",
            "original": 2000,
            "retail": 1800,
            "net": 1600
          }
        ],
        "offerDiscount": {
          "retail": 2000,
          "net": 2000,
          "includedTaxes": [
            {
              "name": "Sales Tax",
              "shortDescription": "Local sales tax",
              "retail": 200,
              "net": 200
            }
          ]
        }
      },
      "itinerary": [
        {
          "name": "Morning City Tour",
          "type": "STANDARD",
          "description": "Morning departure with central pickup included.",
          "address": "123 Main St, San Francisco, CA",
          "googlePlaceId": "google_place_id-example",
          "latitude": 10,
          "longitude": 10,
          "travelTime": "15",
          "travelTimeAmount": 220,
          "travelTimeUnit": "MINUTE",
          "duration": "2",
          "durationAmount": 220,
          "durationUnit": "HOUR"
        }
      ],
      "extras": [
        {
          "customRetail": true,
          "customRetailOptions": [
            500,
            1000,
            1500
          ],
          "id": "3d6f0a3a-59d4-4b16-a0c5-11d2d8a4e6b7",
          "internalName": "Guide Gratuity",
          "reference": "guide_gratuity",
          "restrictions": {
            "default": false,
            "idRequired": false,
            "maxCustomRetail": 5000,
            "maxQuantity": 1,
            "minCustomRetail": 500,
            "minQuantity": 1,
            "paxCount": 0,
            "required": false,
            "accompaniedBy": [],
            "accompaniedByRatio": null,
            "accompaniedByRatioDenominator": null,
            "notAccompaniedBy": []
          },
          "tags": [
            "gratuity",
            "optional"
          ],
          "coverImageUrl": "https://images.ventrata.com/extras/guide-gratuity.jpg",
          "duration": null,
          "durationAmount": null,
          "durationUnit": null,
          "shortDescription": "Let the guest choose how much they want to tip the guide.",
          "title": "Guide Gratuity",
          "pricing": {
            "currency": "USD",
            "currencyPrecision": 2,
            "net": 18000,
            "original": 22000,
            "retail": 20000,
            "includedTaxes": [
              {
                "name": "Sales Tax",
                "shortDescription": "Local sales tax",
                "original": 2000,
                "retail": 1800,
                "net": 1600
              }
            ],
            "offerDiscount": {
              "retail": 2000,
              "net": 2000,
              "includedTaxes": [
                {
                  "name": "Sales Tax",
                  "shortDescription": "Local sales tax",
                  "retail": 200,
                  "net": 200
                }
              ]
            }
          },
          "pricingFrom": {
            "currency": "USD",
            "currencyPrecision": 2,
            "net": 18000,
            "original": 22000,
            "retail": 20000,
            "includedTaxes": [
              {
                "name": "Sales Tax",
                "shortDescription": "Local sales tax",
                "original": 2000,
                "retail": 1800,
                "net": 1600
              }
            ],
            "offerDiscount": {
              "retail": 2000,
              "net": 2000,
              "includedTaxes": [
                {
                  "name": "Sales Tax",
                  "shortDescription": "Local sales tax",
                  "retail": 200,
                  "net": 200
                }
              ]
            }
          }
        }
      ],
      "packageIncludes": [
        {
          "id": "89fe0192-ddcd-430a-b285-e1396a4725d2",
          "title": "Summer Promotion",
          "description": "Morning departure with central pickup included.",
          "includes": [
            "[Circular Reference]"
          ]
        }
      ],
      "dropoffAvailable": true,
      "dropoffPoints": [
        {
          "id": "1cfe2c68-4a91-4df8-8d69-4b393d469caf",
          "name": "Union Square Pickup",
          "directions": "Meet outside the main entrance beside the red awning.",
          "address": "333 O'Farrell St, San Francisco, CA 94102",
          "latitude": 37.785452,
          "longitude": -122.408058,
          "googlePlaceId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
          "street": "333 O'Farrell St",
          "postalCode": "94102",
          "locality": "San Francisco",
          "region": "California",
          "state": "CA",
          "country": "US",
          "localDateTime": "2026-05-14T08:30:00-07:00",
          "localDateTimeTo": "2026-05-14T08:45:00-07:00"
        }
      ],
      "dropoffRequired": true,
      "pickupAvailable": true,
      "pickupPoints": [
        {
          "id": "1cfe2c68-4a91-4df8-8d69-4b393d469caf",
          "name": "Union Square Pickup",
          "directions": "Meet outside the main entrance beside the red awning.",
          "address": "333 O'Farrell St, San Francisco, CA 94102",
          "latitude": 37.785452,
          "longitude": -122.408058,
          "googlePlaceId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
          "street": "333 O'Farrell St",
          "postalCode": "94102",
          "locality": "San Francisco",
          "region": "California",
          "state": "CA",
          "country": "US",
          "localDateTime": "2026-05-14T08:30:00-07:00",
          "localDateTimeTo": "2026-05-14T08:45:00-07:00"
        }
      ],
      "pickupRequired": true,
      "questions": [
        {
          "id": "3d6f0a3a-59d4-4b16-a0c5-11d2d8a4e6b7",
          "title": "Summer Promotion",
          "required": true,
          "inputType": "select",
          "maxLength": 2,
          "selectOptions": [
            {
              "value": "value-example",
              "label": "label-example"
            }
          ]
        }
      ],
      "rentalDurations": [
        {
          "id": "e7cc8bb4-8d1c-4848-8824-5dbedb718681",
          "duration": "2",
          "durationAmount": 220,
          "durationUnit": "HOUR",
          "title": "Summer Promotion",
          "description": "Morning departure with central pickup included."
        }
      ]
    }
  ],
  "redemptionMethod": "DIGITAL",
  "reference": "BRC-WALK",
  "settlementMethods": [
    "DIRECT",
    "DEFERRED"
  ],
  "tags": [
    "vip",
    "partner"
  ],
  "timeZone": "Europe/Madrid",
  "weightUnit": "kg",
  "availableCurrencies": [
    "USD",
    "EUR"
  ],
  "defaultCurrency": "USD",
  "hidePricingFrom": true,
  "includeTax": true,
  "includedTaxes": [
    {
      "name": "Sales Tax",
      "shortDescription": "Local sales tax",
      "original": 2000,
      "retail": 1800,
      "net": 1600
    }
  ],
  "pricingMultiplier": 10,
  "pricingPer": "UNIT",
  "isPackage": true,
  "isPackagePass": true,
  "packageProduct": true,
  "waiverPer": "UNIT",
  "waiverRequired": true,
  "waivers": [
    {
      "id": "6d8c49eb-d6d3-4f03-a242-6f5f95f4d56f",
      "title": "Participant Release and Assumption of Risk",
      "shortDescription": "Required before tour participation.",
      "content": "I acknowledge and accept the risks of participation.\n\n-First Name-=__\n-Email-=__(\"type\":\"email\")\n-Signature-=__(\"type\":\"signature\")\n-Country-=__(\"type\":\"country\")",
      "fields": [
        {
          "id": "first_name",
          "internalName": "First Name",
          "title": "First Name",
          "shortDescription": null,
          "required": true,
          "inputType": "signature",
          "maxLength": null,
          "selectOptions": []
        }
      ]
    }
  ],
  "isRental": true,
  "isMembership": true,
  "membershipAutoRenew": true
}

The response Content-Language reflects the resolved language (for example English when no other translation exists):

If you cache content locally, use the Octo-Available-Languages header, which lists languages translated by the supplier.

You can repeat the request with each available language to retrieve localized content.

Last updated