The three calls every booking makes, in order, against the sandbox. Bodies use only fields the contract and the API specs state; every reference shown (OF-, RP-, pay_int_) is an example value, so copy the real one from the previous response.
The same three calls for each product, with the search intent the contract types for it, in cURL, TypeScript, Python, Kotlin and Swift.
Set AIKONIC_TOKEN to a sandbox bearer token. Never put a production key in a script you share. The TypeScript samples use the published connect client.
import { createConnectClient } from "@mondee-one/connect-client";
const connect = createConnectClient({
baseUrl: "https://apiq-sandbox.tripproagencysites.com",
token: process.env.AIKONIC_TOKEN,
});POST /v1/search
POST /v1/search fans out to suppliers. Flights answer 202 with a searchRef first; poll until the status is COMPLETE. A PARTIAL answer is labelled partial: read message.suppliers before you present it as complete.
curl -X POST https://apiq-sandbox.tripproagencysites.com/v1/search \
-H "Authorization: Bearer $AIKONIC_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"context": {
"domain": "FLT",
"currency": "USD",
"clientReference": "acme-91827"
},
"message": {
"intent": {
"resultShape": "OFFERS",
"slices": [
{
"origin": "GRU",
"destination": "MIA",
"date": "2026-11-10"
}
],
"travelers": [
{
"type": "ADT"
},
{
"type": "CHD",
"age": 9
}
],
"cabin": "ECONOMY"
}
}
}'const found = await connect.request(
"/v1/search",
"post",
{
"context": {
"domain": "FLT",
"currency": "USD",
"clientReference": "acme-91827"
},
"message": {
"intent": {
"resultShape": "OFFERS",
"slices": [
{
"origin": "GRU",
"destination": "MIA",
"date": "2026-11-10"
}
],
"travelers": [
{
"type": "ADT"
},
{
"type": "CHD",
"age": 9
}
],
"cabin": "ECONOMY"
}
}
},
);
// 202 / WARMING: poll GET /v1/search/{searchRef} after message.retryAfterMs until COMPLETE.
// Prices are Money: integer MINOR units + currency. 84210 USD is 842.10 — never a float.
const offer = found.message.offers[0];
const offerRef: string = offer.offerRef;
console.log(offer.price.amount, offer.price.currency);POST /v1/reprice
POST /v1/reprice turns an offer into a firm price and mints a repriceRef. Reprice is mandatory and never cached. When priceChanged is true, show previousPrice and price side by side and get the traveller's consent before booking.
curl -X POST https://apiq-sandbox.tripproagencysites.com/v1/reprice \
-H "Authorization: Bearer $AIKONIC_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"context": {
"domain": "FLT",
"currency": "USD",
"clientReference": "acme-91827"
},
"message": {
"intent": {
"offerRef": "OF-F-3d90aa17",
"travelers": [
{
"type": "ADT"
},
{
"type": "CHD",
"age": 9
}
]
}
}
}'const firm = await connect.request(
"/v1/reprice",
"post",
{
"context": {
"domain": "FLT",
"currency": "USD",
"clientReference": "acme-91827"
},
"message": {
"intent": {
"offerRef": offerRef,
"travelers": [
{
"type": "ADT"
},
{
"type": "CHD",
"age": 9
}
]
}
}
},
);
// priceChanged === true: show previousPrice and price side by side and get consent
// before booking. The server states both figures; do not compute the difference.
const repriceRef: string = firm.message.repriceRef;POST /v1/orders
POST /v1/orders commits the repriceRef. It sends no price and never re-quotes: the amount is the one the reprice fixed. Obtain paymentRef from the payment-intent call first; no card data ever goes in this request.
curl -X POST https://apiq-sandbox.tripproagencysites.com/v1/orders \
-H "Authorization: Bearer $AIKONIC_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"context": {
"domain": "FLT",
"clientReference": "acme-91827"
},
"message": {
"intent": {
"repriceRef": "RP-F-6b02c1",
"clientReference": "acme-91827",
"travelers": [
{
"firstName": "Ana",
"lastName": "Souza",
"email": "[email protected]",
"phoneNumber": "+5511998877665"
}
],
"requiredInfoAnswers": {
"traveler[0].dateOfBirth": "1990-04-02"
},
"payment": {
"mode": "PSP_TOKEN",
"paymentRef": "pay_int_91aa"
}
}
}
}'const order = await connect.request(
"/v1/orders",
"post",
{
"context": {
"domain": "FLT",
"clientReference": "acme-91827"
},
"message": {
"intent": {
"repriceRef": repriceRef,
"clientReference": "acme-91827",
"travelers": [
{
"firstName": "Ana",
"lastName": "Souza",
"email": "[email protected]",
"phoneNumber": "+5511998877665"
}
],
"requiredInfoAnswers": {
"traveler[0].dateOfBirth": "1990-04-02"
},
"payment": {
"mode": "PSP_TOKEN",
"paymentRef": "pay_int_91aa"
}
}
}
},
{ idempotencyKey: crypto.randomUUID() },
);
// The body carries the reprice ref and no price: book never re-quotes. A retry after a
// timeout reuses the SAME key (replay), it does not mint a new one.
console.log(order.message.orderRef, order.message.state);5662646410aba3d66d6fefe5…7e3e103495971820488349da…ef5712134b28f198f4c8331e…SHA256SUMSCheck a download with sha256sum -c SHA256SUMS.
Quickstarts for every vertical in five languages, the SDK packages, the Postman collection and a try-it console that runs against the sandbox with a sandbox key are all linked from here. The OpenAPI document below generates a client in any other language.
Next: browse every operation in the API reference