
Developer hub
Every surface reads the same live availability and the same rates. Pick the one that matches your stack, get sandbox credentials, and build against bookable test inventory before anything touches production.
Trade buyers
An implementation of the OCTO specification. Product, option, unit, availability and booking, with the two-step reserve and confirm lifecycle.
https://api.vacotours.com/octoOpen referenceTrade buyers with an existing client
Field-for-field compatible with the v2 contract many agencies already integrate against. Repoint the base URL and keep your code.
https://api.vacotours.com/v2Open referenceTour operators
Publish products, push availability and prices, manage shared resources, answer quote requests and read your bookings. Everything the operator panel does.
https://api.vacotours.com/api/supplierOpen referenceGetting started
Most integrations take a day or two. The API is deliberately small; the time usually goes into mapping our products into your own taxonomy.
Your token is two halves joined by a dot. The key half is public and appears in logs. The secret half is shown once at creation and stored only as a hash, so keep it somewhere you can retrieve it. A key starting vt_test_ is a sandbox key on the same host.
curl https://api.vacotours.com/octo/whoami \ -H "Authorization: Bearer vt_test_abc123.sk_xyz789"
A bare OCTO response has no prices in it, by design. Opt into the capabilities you want and the server echoes back which ones it applied.
curl https://api.vacotours.com/octo/products \ -H "Authorization: Bearer $TOKEN" \ -H "Octo-Capabilities: octo/pricing, octo/content" \ -H "X-Currency: EUR"
Each start time that can take your party comes back priced for it, with an id. That is the availabilityIdyou quote when booking. Unit ids are on the product.
curl -X POST .../octo/availability \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"productId": "c876067e-...",
"optionId": "9e730f4b-...",
"localDate": "2026-10-07",
"units": [{"id": "0d04e5e0-...", "quantity": 2}]
}'Reserving holds seats and funds without charging, and checks every answer to the operator's questions. Take your own payment, then confirm for vouchers. If you never confirm, the hold expires and releases everything, so a failed payment costs you nothing.
POST /octo/bookings -> ON_HOLD
POST /octo/bookings/{uuid}/confirm -> CONFIRMED
POST /octo/bookings/{uuid}/cancel -> CANCELLEDSend your own uuid when creating a booking. A retried request returns the original booking rather than creating a second one, so a network timeout is never a double sale.
Subscribe once and hear about every change to your bookings, delivered with an HMAC-SHA256 signature over the body. Verify it before acting, and reject anything that does not match.
Every amount is a whole number of minor units with an explicit precision alongside it. No floats, no rounding drift, and JPY and KWD both behave correctly.
One approval gives you both. Sandbox keys book the real catalogue with every booking flagged as a test, so what you exercise in development is the code path you ship.