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
- 1Register on the portal and generate your own sandbox key + secret (test). Live keys are enabled after Woxx approval.
- 2Exchange your key for a 1-hour token via POST /v1/auth/token.
- 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
| Method | Path | Description |
|---|---|---|
| POST | /v1/auth/token | API key → JWT |
| GET | /v1/me | Token identity (whoami) |
| GET | /v1/destinations | Destination lookup |
| POST | /v1/hotels/search | Hotel search |
| GET | /v1/hotels/{id} | Hotel static content |
| POST | /v1/tours/search | Tour search |
| POST | /v1/cruises/search | Cruise search |
| POST | /v1/bookings | Create booking |
| GET | /v1/bookings/{reference} | Booking status |
| POST | /v1/bookings/{reference}/cancel | Cancellation 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
- Sandbox — Sandbox: test — booking is mock (no real record, returns an SBX- reference).
- Live — Live: real sales — currently closed; opens after pilot approval (payment via the agency current/credit account).
Error codes
| HTTP | code | Meaning |
|---|---|---|
| 400 | invalid_request · unsupported_type · idempotency_key_required | Bad / missing request |
| 401 | invalid_key · invalid_secret · key_revoked · invalid_token | Identity |
| 403 | forbidden_scope · live_booking_unavailable · quota_exceeded · ip_not_allowed | Authorization / quota / IP |
| 404 | not_found · sandbox_ephemeral | Not found / out of scope |
| 409 | in_progress · cancellation_already_requested | Idempotency / concurrency |
| 429 | rate_limited | Rate limit / brute-force |
| 502 | gateway_error · booking_error | Upstream 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]