Partner API v1
Search and book hotels, flights and FD fares from your own system, paid from your Idea Holiday agent wallet.
Get access
Verify your business PAN in the agent portal, then apply under Help > API Access.
Create a sandbox key at once and build against it.
After approval and the one-time setup fee, create live keys and lock them to your server IPs.
Keys and sandbox
Send your key in the x-api-key header on every request. Each key is enabled for some products; a key without access gets 403 SCOPE_NOT_ALLOWED, and a key locked to IPs gets 403 IP_NOT_ALLOWED from any other address.
ih_test_…Sandbox. Hotels: every call against demo hotels. Flights: search and fare-quote. FD fares: availability and search. No money moves.
ih_live_…Live. Real bookings paid from your agent wallet (balance + credit limit). Needs a verified business PAN.
curl 'https://b2b.ideaholiday.com/api/v1/partner/wallet' \
--header 'x-api-key: ih_test_<YOUR_KEY>'Responses and booking safety
Every response uses one envelope. On an error status is "error" and errors holds { code, message }. Quote request_id (also the X-Request-Id header) to support.
{
"request_id": "6f1c…",
"status": "ok",
"data": { },
"errors": [],
"meta": { "currency": "INR" }
}Every booking needs a unique Idempotency-Key header: sending it again returns the first answer and never books twice. After a timeout, read the booking status before trying again. If the price changed since the quote, re-quote and confirm the new price.
Endpoints
Paths are relative to the base URL. Request and response shapes are in the OpenAPI file.
Loading endpoints…
Webhooks
Set one https URL under Help > API Access > Webhook and choose your events. We POST an event when a booking you made through the API changes later, and when your wallet runs low.
booking.confirmedA hotel is confirmed, or a flight or FD booking has its PNR.
booking.ticketedA flight ticket is issued.
booking.failedA booking failed.
booking.cancelledA booking is cancelled.
booking.pnr_changedThe airline changed an FD booking's PNR; data.previousPnr holds the old one.
wallet.lowAvailable funds fell below the amount you set (default Rs.10,000). At most once a day.
{
"id": "delivery id",
"event": "booking.pnr_changed",
"sandbox": false,
"createdAt": "2026-10-02T10:15:00.000Z",
"data": { "product": "FD", "previousPnr": "OLD123", "booking": { "booking_id": "…", "pnr": "NEW456" } }
}Headers: X-IH-Event, X-IH-Delivery (drop duplicates by it) and X-IH-Signature: t=<unix seconds>,v1=<hex>. Check it with HMAC-SHA256 of <t>.<raw body> using your signing secret and reject events older than 5 minutes. Answer with any 2xx; failures are retried after 1, 5, 30, 120 and 720 minutes.
Errors
API_KEY_REQUIRED, INVALID_API_KEY, API_KEY_INACTIVE, API_KEY_EXPIRED
SCOPE_NOT_ALLOWED, IP_NOT_ALLOWED, ACCOUNT_INACTIVE, KYB_REQUIRED, SANDBOX_NOT_SUPPORTED
VALIDATION_ERROR, IDEMPOTENCY_KEY_REQUIRED
INSUFFICIENT_FUNDS, PAYMENT_FAILED
PREBOOK_FAILED, PREBOOK_EXPIRED, BOOKING_FAILED, BOOKING_IN_PROGRESS, NOT_CANCELLABLE, CANCEL_FAILED, STATUS_UNAVAILABLE
IDEMPOTENCY_KEY_REUSED
RATE_LIMITED (Retry-After header), SEARCH_QUOTA_EXCEEDED
SUPPLIER_ERROR, INTERNAL_ERROR: check the booking status before booking again