Cleartrip Flights
Live Indian domestic flight pricing from Cleartrip — the same job-based /scrape/ contract as Google Flights and MakeMyTrip, selected with "source": "cleartrip". Search, fare families and review detail (fare breakup, cancellation windows, coupons) are all available; round trips come back as one priced combination.
/api/v1/flight-scraper/scrape/— submit/api/v1/flight-scraper/scrape/{job_id}/— pollBase URL: https://api.scrapeguys.com · Auth: X-API-Key: fsk_… with the cleartrip scope · See the Overview.
source on /scrape/ or /batch/ and you get google_flights, as before.cleartrip scope. Without it every call returns 403 This API key does not have the 'cleartrip' scope. The same scope governs polling those jobs. Existing keys are not granted it automatically — ask your ScrapeGuys contact to add it.Submit a search
curl -X POST 'https://api.scrapeguys.com/api/v1/flight-scraper/scrape/' \
-H 'Content-Type: application/json' -H 'X-API-Key: fsk_...' \
-d '{"origin":"DEL","destination":"BOM","departure_date":"2026-12-25",
"adults":1,"cabin_class":"economy","currency":"INR",
"source":"cleartrip"}'
# {"job_id":"7a1c...","status":"pending","poll_url":"/api/v1/flight-scraper/scrape/7a1c.../"}
| Field | Cleartrip | Notes |
|---|---|---|
origin, destination | Supported | 3-letter IATA codes. |
departure_date, return_date | Supported | YYYY-MM-DD. Omit return_date for one-way. |
adults, children | Supported | |
infants_in_seat, infants_on_lap | Supported, summed | Cleartrip carries one infant count. The sum is capped at adults. |
cabin_class | Supported | economy, premium_economy, business, first. |
max_stops | Supported | Applied after the search. |
currency | INR only | Any other value is refused. Omitting it defaults to INR. |
region | in only | Any other value is refused; use source=google_flights for other markets. |
include_calendar, calendar_days, calendar_days_before | Not supported | No calendar endpoint. Refused with a 400 whenever sent, whatever the value. |
per_leg_fares | Not supported | A round trip is one priced combination — see Round trips. |
include_nearby_airports | Supported | Boolean, default false. Cleartrip mixes flights from nearby airports into a search (for example NMI for BOM, GOX for GOI). They are left out by default so a search answers for the airport you asked about; set true to keep them. A city code keeps all of its airports. Refused on other sources. |
include_cheapest | Not supported | Google Flights only. |
include_price_lock, platform, price_coupons, include_coupon_breakups | Not supported | MakeMyTrip-only (platform is also accepted on Paytm). Cleartrip has a single client, so the polled job echoes platform as an empty string. price_coupons and include_coupon_breakups are refused with a 400 when true, on /scrape/, /batch/ and their expansions. |
400 whose message names the remedy — never accepted and quietly dropped.Poll for results
Poll every 1–2 seconds until status is completed or failed. The envelope is the one every source uses — flights, return_flights, search_context, error, error_category — so an existing parser needs no changes. Cleartrip adds:
{
"flights": [{
"airlines": ["SpiceJet"], "carrier_code": "SG", "flight_numbers": ["612"],
"origin": "DEL", "destination": "BOM",
"departure_time": "2026-12-25T19:20:00.000+05:30",
"arrival_time": "2026-12-25T21:40:00.000+05:30",
"duration": "2h 20m", "stops": 0,
"price": 7076.0, "total_price": 7076.0, "currency": "INR",
"bookable": true,
"segments": [ ... ], "layovers": [ ... ],
"cleartrip_ids": { "journey": "J1", "travel_option_id": "...", "fare_id": "..." }
}],
"return_flights": [],
"round_trip_combination": null,
"search_context": {
"source": "cleartrip", "no_results": false, "trip_type": "one_way",
"applied_currency": "INR", "stops_filtered_out": 0,
"include_nearby_airports": false,
"nearby_airports_hidden": {"onward": {}, "return": {}}
},
"error": null, "error_category": ""
}
priceis per adult;total_priceis the whole party.stops_filtered_outis a count, not a flag: how many bookable optionsmax_stopsexcluded.0withno_results: truemeans the route genuinely has nothing. Same name and meaning as on MakeMyTrip.nearby_airports_hiddensays what the nearby-airport rule left out, per direction, as a map of airport code to the number of options hidden — for example{"onward": {"NMI": 34}, "return": {}}. Both maps are empty ({}) when nothing was hidden or wheninclude_nearby_airportsistrue. A route flown only from a nearby airport reads as that, not as "not sold".bookable: falsemarks an option listed without a sellable fare. It prices as0and sorts first under a price sort, so skip it if you pick your own option rather than using the expansions.cleartrip_idsis what the expansions need. You never send it — they take an index.
An empty route is not an error
A route Cleartrip does not sell comes back status: "completed", error: null and search_context.no_results: true. Check no_results, not error. This includes an origin or destination airport code Cleartrip does not recognise: the job completes with no_results: true, stops_filtered_out: 0 and search_context.unknown_airports listing the offending code(s), rather than failing or being retried.
Batch scraping
POST /api/v1/flight-scraper/batch/ and /batch/results/ accept "source": "cleartrip" with the same rules as /scrape/.
Round trips — one combination, not two legs
One search returns both directions: flights is outbound, return_flights is inbound, and round_trip_combination names the pair Cleartrip itself priced:
"round_trip_combination": {
"onward_index": 0, "return_index": 2,
"onward_fare_id": "...", "return_fare_id": "...",
"price": 11480.0, "currency": "INR",
"priced_as_pair": true
}
priced_as_pair: true— the combination came from Cleartrip's own round-trip fare map.priced_as_pair: false— no priced combination matched.priceand both*_fare_idfields arenull; none is invented. The pair is still named byonward_index/return_index, each leg's own fare is on its row, and fare families quotes the real pair.
Do not add the two legs' price values and expect the combination price, and do not split the combination price back across the legs — which is why per_leg_fares is refused. Round-trip responses are also considerably larger than one-way ones.
Expansion endpoints
source is required on the expansion endpoints. It defaults to makemytrip there, so every pre-existing caller keeps working. Omit it on a Cleartrip parent and you get 400 Fare families was asked for MakeMyTrip but job <id> is Cleartrip.| Endpoint | Cleartrip |
|---|---|
POST /scrape/fares/ | Supported — fare families per cabin |
POST /scrape/review/ | Supported — fare breakup, cancellation windows, coupon list |
POST /scrape/return/ | Not applicable — Cleartrip returns both directions from one search |
POST /scrape/farelock/, /booking/ | No Cleartrip equivalent |
The search context and its TTL
Expansions resume the search funnel using values stored on the job, so you never pass them — but they expire (30 minutes by default). Past that the expansion is refused before any request is made, with error_category: "invalid_input":
{"error": "the Cleartrip search context for this job is 90 minutes old and the limit is 30; re-run the search and expand a row from the new result",
"error_category": "invalid_input"}
Retrying cannot help; re-run the search and expand a row from the new result.
Fare families
curl -X POST 'https://api.scrapeguys.com/api/v1/flight-scraper/scrape/fares/' \
-H 'Content-Type: application/json' -H 'X-API-Key: fsk_...' \
-d '{"job_id":"7a1c...","flight_index":0,"source":"cleartrip"}'
# 202, then poll the returned job
Fare families list the searched cabin first, so an economy search leads with economy fares.
Review
POST /scrape/review/ returns the fare breakup, cancellation windows and the list of applicable coupons for one itinerary. Same request shape as fares: job_id, flight_index, "source": "cleartrip".
error_category: "error" — retrying only keeps asking until the hour passes.review.price_breakup.total excludes Cleartrip's convenience fee. It covers the airline side only — base fare, taxes, any coupon, and add-ons such as Trip Protect. Do not present it as the price payable, and do not compare it against a fee-inclusive total from another source.What a review returns
The job's result.review carries:
price_breakup—rows(label and amount) andtotal.cancellation_windows— every journey's cancellation windows in one flat list: onward first, then return on a round trip. Each window hasjourney,from,to(ISO, IST),charge,permitted,refundableandbreakup(airline and Cleartrip charges).permitted: falsemeans the action is not allowed in that window;refundableisprice_breakup.totalminus the charge,0when not permitted, andnullwhen the total is unknown.date_change_windows— the same shape, for date changes.fare_rules— the same windows grouped by journey (onward/return).coupons— a flat list, one entry per coupon, each taggedapplied(truewhen the booking draft already carries it,falsewhen it is only applicable). The applied coupon carries the discountamount. Empty list when there are none.ancillariesandcomponents.
The window lists are empty, never missing, when Cleartrip quotes no rules for the fare or the read failed.
Coupons are listed on the review but not priced: price_coupons is refused on this source.
Errors on this source
The same vocabulary as every other source, so existing dashboards and retry logic work unchanged.
error_category | Meaning on Cleartrip | What to do |
|---|---|---|
"" | Success. An empty route is here too — check search_context.no_results. | — |
blocked | The request was refused at the edge after retries. | Resubmit later. |
transient | A 429, 5xx, or a network/timeout failure. | Retry. |
invalid_search | Cleartrip read the request and refused it: a 400/404, no fare family for that option, or a cabin mismatch. | Change the request. Retrying returns the same answer. |
invalid_input | A stale or missing search context, or a bad parameter. | Re-run the search, or fix the input. |
rotation | A response arrived that the parser does not understand. | Nothing to do on your side; contact us. |
error | Configuration or a cap. The message names it. | Contact us. |
A cabin mismatch is the clearest invalid_search case, and its message names the cabin to search instead:
{"error": "searched ECONOMY but Cleartrip priced only BUSINESS fares for this option. ... search in that cabin instead: cabin_class=business",
"error_category": "invalid_search"}
Not supported on this source
- Coupon pricing — coupons are listed on review but not applied or compared.
- Calendar / price-per-day — no endpoint exists.
- Currencies and regions other than INR /
in.
Next: Google Flights · MakeMyTrip Flights