1. Overview
The Skyloom Travel Partner API v1 is a REST/JSON API that lets you search,
book and ticket flights end-to-end on your own site. You search for flights,
create the booking, and receive the PNR and ticket number — all over the API. There is
no redirect to skyloomtravel.uk; your travellers stay on your own website
throughout. Bookings are paid from your prepaid balance with Skyloom.
End-to-end flow
Search --> POST /v1/flights/search --> offers, each with an offer_id (valid 30 min)
Book --> POST /v1/flights/book --> booking_ref_no + pnr (+ ticket_number)
Status --> GET /v1/flights/booking/{ref} --> poll until ticket_number appears
- Search for flights and read back a list of offers.
- Take an
offer_idfrom an offer (valid for 30 minutes). - Book with that
offer_idplus your passenger details. - Poll the booking until the
ticket_numberappears.
What you build
You present search results, collect passenger and contact details, and confirm the booking on your own site. Each booking is paid from your prepaid balance with Skyloom, so there is no per-transaction card handling on your side.
Conventions
- Base URL:
https://skyloomtravel.uk/api/v1/ - Auth:
Authorization: Bearer <YOUR_API_KEY>header (see below). - Request body:
application/x-www-form-urlencoded. - Responses: JSON, wrapped in a standard envelope (see Errors).
2. Authentication
Every request is authenticated with a Bearer token sent in the
Authorization header:
Authorization: Bearer YOUR_API_KEY
- The key is only accepted in the
Authorizationheader. It is never sent in the URL or in the request body. - Your key is delivered once, out of band, via a one-time secret link. Store it securely — it is shown only once and cannot be retrieved again.
- An optional IP allow-list can be configured for your account on request, so the key is only valid from your servers.
Verify your key first
Call POST /v1/ping to confirm your key works and to
see your account capabilities before integrating the search and booking calls.
3. Endpoints
All endpoints require the Authorization: Bearer header.
| Method | Path | Purpose | Auth |
|---|---|---|---|
| POST | /v1/ping | Verify your key and capabilities | Bearer |
| POST | /v1/flights/search | Search flights, return offers | Bearer |
| POST | /v1/flights/book | Book an offer end-to-end | Bearer |
| GET | /v1/flights/booking/{booking_ref_no} | Read / poll a booking's status | Bearer |
4. Ping — verify your key
POST /v1/ping confirms your key is valid and returns your account
capabilities. Use it as a connectivity and credential check.
curl -X POST https://skyloomtravel.uk/api/v1/ping \
-H "Authorization: Bearer $KEY"
{
"status": true,
"message": "pong",
"data": { "partner": "Your Company", "partner_id": 2, "can_book": true }
}
5. Search
POST /v1/flights/search returns a list of offers. Each
offer carries an offer_id that you pass to the booking call. Prices already
include Skyloom's fare; the offer total is the amount the booking will cost
in the currency you requested.
Request parameters
| Field | Required | Example | Notes |
|---|---|---|---|
origin | yes | IST | IATA code |
destination | yes | ASB | IATA code |
departure_date | yes | 2026-07-15 | YYYY-MM-DD |
type | no | oneway | oneway (default) or round |
return_date | cond. | 2026-07-22 | required when type=round (YYYY-MM-DD) |
adults | yes | 1 | integer ≥ 1 |
children | no | 0 | integer (default 0) |
infants | no | 0 | integer (default 0) |
currency | no | USD | ISO code, default USD. See Currencies below. |
class_type | no | economy | economy (default), business, first |
Example request
curl -X POST https://skyloomtravel.uk/api/v1/flights/search \
-H "Authorization: Bearer $KEY" \
--data-urlencode "origin=IST" \
--data-urlencode "destination=ASB" \
--data-urlencode "departure_date=2026-07-15" \
--data-urlencode "type=oneway" \
--data-urlencode "adults=1" \
--data-urlencode "children=0" \
--data-urlencode "infants=0" \
--data-urlencode "currency=USD" \
--data-urlencode "class_type=economy"
Example response
For a one-way search, data is an array of offers. For a round trip,
data is an object { "outbound": [...], "return": [...] }. Each
offer carries its own offer_id and total.
{
"status": true,
"message": "OK",
"data": [
{
"offer_id": "OFR-46d2eadfb2-IST-ASB",
"airline": "T5",
"flight_number": "924",
"class_type": "economy",
"available_seats": 9,
"total": 409.20,
"currency": "USD",
"per_passenger": { "adult": 409.20, "child": 0.00, "infant": 0.00 },
"segments": [
{
"origin": "IST",
"destination": "ASB",
"departure": "2026-07-15T06:30:00+05:00",
"arrival": "2026-07-15T12:30:00+05:00",
"duration_minutes": 240,
"airline": "T5",
"flight_number": "924",
"aircraft": "B737-800",
"cabin_class": "economy",
"baggage_allowance": "20 KG"
}
]
}
]
}
offer_idis required to book and is valid for 30 minutes. After that, search again to refresh the price.totalis the final price for the searched passengers, in the requested currency.- When no flights match, the call returns the
NO_RESULTScode (HTTP200); see Errors.
Currencies
The supported currency codes are USD,
EUR and GBP. Offer prices and the booking
total are returned in the currency you request. An unsupported code is
rejected with INVALID_PARAMS.
Need another currency?
Additional currencies (for example VND) can be enabled by Skyloom for
your account with no change required on your side — the same request
parameter simply starts accepting the new code.
6. Book
POST /v1/flights/book creates a booking from an offer_id you
received from search. The price is re-validated server-side, and the booking is paid from
your prepaid balance with Skyloom.
Request parameters
| Field | Required | Notes |
|---|---|---|
offer_id | yes | From a recent search (≤ 30 min old, not already used). |
passengers | yes | JSON array of passenger objects (see below). At least one adult. |
contact_email | recommended | Booking contact email. |
contact_phone | recommended | Booking contact phone. |
issue_ticket | no | 1 (default) issues the ticket now; 0 confirms the booking + PNR and holds it without ticketing. |
Passenger object
| Field | Example | Notes |
|---|---|---|
type | adult | adult, child or infant |
title | Mr | e.g. Mr / Mrs / Ms |
first_name | John | as in passport |
last_name | Doe | as in passport |
dob | 1990-05-20 | date of birth, YYYY-MM-DD |
gender | M | M or F |
nationality | GB | ISO country code |
passport_number | 123456789 | travel document number |
passport_expiry | 2031-01-01 | YYYY-MM-DD |
Example request
curl -X POST https://skyloomtravel.uk/api/v1/flights/book \
-H "Authorization: Bearer $KEY" \
--data-urlencode "offer_id=OFR-46d2eadfb2-IST-ASB" \
--data-urlencode "contact_email=ops@partner.com" \
--data-urlencode "contact_phone=+441234567890" \
--data-urlencode "issue_ticket=1" \
--data-urlencode 'passengers=[{"type":"adult","title":"Mr","first_name":"John","last_name":"Doe","dob":"1990-05-20","gender":"M","nationality":"GB","passport_number":"123456789","passport_expiry":"2031-01-01"}]'
Example response
{
"status": true,
"message": "Ticket issued",
"data": {
"booking_ref_no": "1718999999",
"pnr": "ABC123",
"ticket_number": "2351234567890",
"status": "ticketed",
"total": 409.20,
"currency": "USD"
}
}
status: "ticketed"— the ticket has been issued andticket_numberis in the response.status: "ticketing_pending"— the booking and PNR are confirmed and the ticket is being issued;ticket_numberisnullfor now. PollGET /v1/flights/booking/{booking_ref_no}until it appears.status: "held"— returned whenissue_ticket=0: the booking and PNR exist but no ticket has been issued.
Insufficient balance
If your prepaid balance cannot cover the booking, the call returns
402 INSUFFICIENT_DEPOSIT and no booking is made. Top up
your balance with Skyloom and retry.
7. Booking status
GET /v1/flights/booking/{booking_ref_no} reads one of your bookings. Use
it to poll until the ticket_number appears — the ticket is
issued automatically at booking time, or shortly after by Skyloom.
curl -H "Authorization: Bearer $KEY" \
https://skyloomtravel.uk/api/v1/flights/booking/1718999999
{
"status": true,
"message": "OK",
"data": {
"booking_ref_no": "1718999999",
"pnr": "ABC123",
"ticket_number": "2351234567890",
"status": "ticketed",
"total": 409.20,
"currency": "USD",
"booked_at": "2026-06-24"
}
}
Status values
| Status | Meaning |
|---|---|
ticketed | Ticket issued; ticket_number is present. |
ticketing_pending | PNR confirmed; the ticket is on the way. Keep polling. |
cancelled | The booking has been cancelled. |
You can only read your own bookings; an unknown reference returns
INVALID_PARAMS.
8. Errors
Successful responses use the envelope
{ "status": true, "message": "OK", "data": { ... } }. Errors use:
{
"status": false,
"error": { "code": "INVALID_PARAMS", "message": "human readable" }
}
Error codes
| Code | HTTP | Meaning |
|---|---|---|
AUTH_MISSING_KEY | 401 | No Authorization: Bearer header. |
AUTH_INVALID_KEY | 401 | Unknown or disabled key, or IP not allowed. |
INVALID_PARAMS | 400 | Missing/invalid parameter, or unknown/used offer_id. |
NO_RESULTS | 200 | Valid search, but no flights found. |
OFFER_EXPIRED | 410 | The offer is older than its 30-minute validity window — search again. |
INSUFFICIENT_DEPOSIT | 402 | Your prepaid balance is too low for this booking. |
RATE_LIMIT | 429 | Too many requests; see Rate limiting. Includes a Retry-After header. |
SUPPLIER_TIMEOUT | 504 | Upstream timed out — retry. |
SUPPLIER_ERROR | 502 | Upstream error. |
9. Rate limiting
The default limit is 300 requests per minute per key (sliding minute
window). When you exceed it, the API responds with HTTP 429 and code
RATE_LIMIT, including a Retry-After header (seconds) indicating
when to retry.
10. Downloads
Machine-readable artifacts for the v1 contract:
- Postman collection: https://documentation.skyloomtravel.uk/Skyloom_Partner_API.postman_collection.json
- OpenAPI spec: https://documentation.skyloomtravel.uk/openapi.json
In Postman, choose Import → Link and paste the collection URL. Open
the collection's Variables tab and set the api_key variable
to the key Skyloom issued you, then run Ping → Search → Book → Booking status.
The OpenAPI spec can be imported into Postman, Swagger or Stoplight, or used to generate a
client.