Developer Docs

Travapi Agency API — Integration

Hotel, tour and cruise search + booking from your own system. Below: authentication, request/response formats and examples.

Basics

Base URL
https://api.entatil.com
Content type
application/json
Auth
All requests except /v1/auth/token require a Bearer JWT
Interactive explorer (Swagger)
api.entatil.com → "Acente API v1"

Quick start

  1. 1Register on the portal and generate your own sandbox key + secret (test). Live keys are enabled after Woxx approval.
  2. 2Exchange your key for a 1-hour token via POST /v1/auth/token.
  3. 3Send the token in the Authorization: Bearer header and search/book.
# 1) Token
curl -X POST https://api.entatil.com/v1/auth/token \
  -H "Content-Type: application/json" \
  -d '{"apiKey":"pk_sb_...","secret":"sk_sb_..."}'

# 2) Search hotels
curl -X POST https://api.entatil.com/v1/hotels/search \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"checkIn":"2026-08-08","checkOut":"2026-08-12","adults":2,"destinationId":1176,"currency":"EUR"}'

Authentication

API key + secret → short-lived JWT (1 hour). Reuse the token, refresh before it expires.

{
  "token": "eyJhbGciOiJ...",
  "token_type": "Bearer",
  "expires_in": 3599,
  "environment": "sandbox",
  "scopes": "hotel,tour,cruise"
}

Token lifetime is 1 hour; refresh based on expires_in (seconds).

Endpoints

MethodPathDescription
POST/v1/auth/tokenAPI key → JWT
GET/v1/meToken identity (whoami)
GET/v1/destinationsDestination lookup
POST/v1/hotels/searchHotel search
GET/v1/hotels/{id}Hotel static content
POST/v1/tours/searchTour search
POST/v1/cruises/searchCruise search
POST/v1/bookingsCreate booking
GET/v1/bookings/{reference}Booking status
POST/v1/bookings/{reference}/cancelCancellation request

Response envelope

The successful response of read endpoints has a single shape — always read response.data.

{ "data": <content>, "meta": { "requestId": "...", "environment": "sandbox" } }

Example — hotel search

Request

POST /v1/hotels/search
{
  "checkIn": "2026-08-08", "checkOut": "2026-08-12",
  "adults": 2, "destinationId": 1176,
  "currency": "EUR", "sourceCountryCode": "TR"
}

Response (truncated)

{
  "data": {
    "count": 1,
    "hotelData": [{
      "hotelId": 2007482, "name": "Rixos Beldibi", "stars": 5,
      "rooms": [{ "name": "CLASSIC ROOM", "rates": [{
        "rateKey": "2007482|866|...|1786147200|1786406400",
        "net": "24036.77", "boardName": "ALL INCLUSIVE", "currencyCode": "TRY"
      }] }]
    }]
  },
  "meta": { "requestId": "...", "environment": "sandbox" }
}

rateKey is the anchor of the booking — it carries the selected room/board/date combination and is used in the booking request.

Sandbox and Live

  • SandboxSandbox: test — booking is mock (no real record, returns an SBX- reference).
  • LiveLive: real sales — currently closed; opens after pilot approval (payment via the agency current/credit account).

Error codes

HTTPcodeMeaning
400invalid_request · unsupported_type · idempotency_key_requiredBad / missing request
401invalid_key · invalid_secret · key_revoked · invalid_tokenIdentity
403forbidden_scope · live_booking_unavailable · quota_exceeded · ip_not_allowedAuthorization / quota / IP
404not_found · sandbox_ephemeralNot found / out of scope
409in_progress · cancellation_already_requestedIdempotency / concurrency
429rate_limitedRate limit / brute-force
502gateway_error · booking_errorUpstream unreachable

Full documentation

For real request/response examples of every endpoint, webhook signature verification and error handling, request the detailed developer guide from the Woxx team.

[email protected]