Scraper · OTA

Paytm Flights

Live flight pricing from Paytm (INR, India region) — the same job-based /scrape/ contract as Google Flights, MakeMyTrip and Cleartrip, selected with "source": "paytm". Search, fare families and review detail (fare breakup including Paytm's convenience fee, refundability, cancellation windows, add-ons) are all available, and every call is read-only.

POST/api/v1/flight-scraper/scrape/— submit
GET/api/v1/flight-scraper/scrape/{job_id}/— poll

Base URL: https://api.scrapeguys.com · Auth: X-API-Key: fsk_… with the paytm scope · See the Overview.

Shared endpoint. Endpoints, headers, auth, quotas and the job lifecycle are exactly those in the Overview; this page covers only what differs for Paytm. Omit source on /scrape/ or /batch/ and you get google_flights, as before.
Your key needs the paytm scope. Without it every call returns 403 This API key does not have the 'paytm' scope. The same scope governs polling those jobs. There is no wildcard and existing keys are not granted it automatically — ask your ScrapeGuys contact to add it.

The three stages

Paytm uses the same L1 / L2 / L3 vocabulary as the other flight sources. Each stage is an ordinary job — submit, get a job_id, poll — and each later stage takes a flight_index from the search it came from.

This is not the Paytm app's own numbering. The Paytm app calls its reprice step "L2" and its ancillaries "L3". Here, L2 is fare families and L3 is the review page.
StageEndpointAnswers
L1 searchPOST /scrape/ · /batch/What flies DEL→BOM on the date, and the cheapest fare per flight.
L2 fare familiesPOST /scrape/fares/The fare options sold on one flight (for example SME, regular, corporate), and the convenience-fee-inclusive total for the selected one.
L3 reviewPOST /scrape/review/Fare split and convenience fee, refundability and cancellation windows, and optionally baggage, meals, seats and promo codes.

Paytm's convenience fee — the amount that turns a listed fare into what a traveller actually pays — is available at review with no extra steps on your side. grand_total is the fee-inclusive figure.

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-11-18",
       "adults":1,"cabin_class":"economy","currency":"INR",
       "source":"paytm"}'
# {"job_id":"9f2b...","status":"pending","poll_url":"/api/v1/flight-scraper/scrape/9f2b.../"}
FieldPaytmNotes
origin, destinationSupported3-letter IATA codes.
departure_dateSupportedYYYY-MM-DD.
return_datedesktop onlySend "platform": "desktop" to price a round trip. The default app client is one-way and refuses a return_date at submit — see Round trips.
adults, childrenSupported
infants_in_seat, infants_on_lapSupported, summedPaytm carries one infant count. The sum is capped at adults.
cabin_classSupportedeconomy, premium_economy, business, first.
max_stopsSupportedApplied after the search.
currencyINR onlyAny other value is refused, not relabelled. Omitting it defaults to INR.
regionin onlyAny other value is refused; use source=google_flights for other markets.
include_calendar, calendar_days, calendar_days_beforeNot supportedRefused with a 400 whenever sent, whatever the value.
per_leg_faresNot supportedRefused with a 400.
include_cheapestNot supportedGoogle Flights only.
platformOptionalPaytm has two clients: app (default, one-way) or desktop (Paytm's web funnel, the only one that prices a round trip) — which one prices the job. Echoed on the polled job. Rejected with a 400 on sources that have only one client.
include_price_lock, price_coupons, include_coupon_breakupsNot supportedMakeMyTrip options. Refused with a 400 on /scrape/, /batch/ and their expansions.
include_nearby_airportsNot supportedCleartrip-only. Paytm needs no switch: substituted airports are always reported separately — see Substituted airports.
Rejected at submit, not silently ignored. Every unsupported option above is refused with a 400 whose message names the remedy — never accepted and quietly dropped.

Round trips — send platform=desktop

On platform=desktop a return_date prices a round trip, domestic or international, as sellable combinations (an onward + return pair) rather than two leg fares added together:

{"source": "paytm", "platform": "desktop", "origin": "DEL", "destination": "BOM",
 "departure_date": "2026-11-18", "return_date": "2026-11-22"}

On the default app client a return_date is refused at submit rather than run as a one-way, which would drop the leg you asked to price and return a result that looks complete. An omitted platform is app, so an unqualified round trip is refused too:

{"return_date": ["Paytm's app client prices one-way only. Send platform=desktop to price a round trip on Paytm's web funnel, or use source=google_flights."]}

A round trip returns both directions and the sellable pairs from the original search, so /scrape/return/ does not apply to Paytm. per_leg_fares is refused on both clients: a round trip is quoted as one combination, and the pair price is the pair's.

Availability. platform=desktop is enabled per deployment. Where it is not enabled, a new desktop search is refused at submit and no job is created; a fare-families or review call on a desktop search fails as a job instead. A desktop job is never silently run on the app client.

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. flights is sorted cheapest first. Paytm adds:

{
  "flights": [{
    "airlines": ["IndiGo"], "carrier_code": "6E", "flight_numbers": ["2134"],
    "origin": "DEL", "destination": "BOM",
    "departure_time": "06:10", "arrival_time": "08:25",
    "departure_date": "2026-11-18",
    "duration": "2h 15m", "stops": 0, "layover_airports": [],
    "price": 5421, "total_price": 5421, "currency": "INR",
    "refundable": "Refundable", "bookable": true,
    "segments": [ ... ], "layovers": [ ... ],
    "paytm_ids": { "provider": "...", "flightid": "...", "solution_id": "...", "fare_options": [ ... ] }
  }],
  "return_flights": [],
  "nearby_airport_options": [ ... ],
  "search_context": {
    "source": "paytm", "platform": "app", "no_results": false,
    "trip_type": "one_way", "applied_currency": "INR",
    "requestid": "...", "stops_filtered_out": 0
  },
  "search_metadata": {
    "source": "paytm", "retrieved_at": "2026-11-10T09:30:12+00:00",
    "total_options": 60, "nearby_airport_count": 12
  },
  "error": null, "error_category": ""
}

An empty route is not an error

A route Paytm does not sell comes back status: "completed", error: null and search_context.no_results: true. Check no_results, not error.

Substituted airports — nearby_airport_options

Paytm answers some route searches with flights that do not fly the route you asked for. A DEL → BOM search comes back with HDO → BOM and DXN → BOM rows (Hindon and Noida standing in for Delhi) and DEL → NMI rows (Navi Mumbai standing in for Mumbai). Paytm flags each of these itself.

Not the same as Google Flights' search_context.nearby_airports. That is a suggestion list shown only when a search finds zero flights. nearby_airport_options holds real priced itineraries removed from an otherwise successful listing.

Batch scraping

POST /api/v1/flight-scraper/batch/ and /batch/results/ accept "source": "paytm" with the same rules as /scrape/. GET /usage/ is unchanged.

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 Paytm parent and you get 400 Fare families was asked for MakeMyTrip but job <id> is Paytm.
EndpointPaytm
POST /scrape/fares/Supported — fare families, convenience fee on the selected one
POST /scrape/review/Supported, read-only — fare breakup, refundability, add-ons
POST /scrape/return/Not applicable — Google Flights only
POST /scrape/checkout/, /farelock/, /booking/Not available for Paytm

The search context and its TTL

Expansions resume the search 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". 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":"9f2b...","flight_index":0,"source":"paytm"}'
# 202, then poll the returned job

Paytm lists a flight's fare options with the search itself, so result.fare_families[] is built from the stored search — no new search is run. Each family carries name, per_adult, total and refundable.

Review

POST /scrape/review/ returns the fare breakdown, the cancellation and modification rules, and (by default) the add-on catalogue for one itinerary. Same request shape as fares: job_id, flight_index, "source": "paytm".

Review is read-only on Paytm. It creates nothing on Paytm's side — no booking draft, no held inventory — so it is safe to call for as many itineraries as you need. Checkout and payment are not part of this API.

What a review returns

The add-on catalogue can be withheld without failing the review. Paytm declines to return it for some itineraries (more often on international ones), or its own supplier fails to produce it. The job still completes: result.review and result.minirules are published, result.ancillaries is {}, and result.warnings carries one line naming Paytm's code for what was withheld. An empty ancillaries alongside that warning means "not available right now", not "none offered". Re-request the review later if you need the catalogue.
Do not compare totalfare with a fee-inclusive total from another source. totalfare excludes Paytm's convenience fee; grand_total includes it.

Errors on this source

The same vocabulary as every other source, so existing dashboards and retry logic work unchanged.

error_categoryMeaning on PaytmWhat to do
""Success. An empty route is here too — check search_context.no_results.—
blockedThe request was refused at the edge after retries.Resubmit later.
transientA 429, 5xx, or a network/timeout failure, or Paytm's own internal error. Resubmitting is the remedy.Retry.
invalid_searchPaytm read the request and refused it, or the chosen flight has no sellable fare.Change the request. Retrying returns the same answer.
invalid_inputA stale or missing search context (including Paytm reporting the search session as invalid or expired), or a bad parameter.Re-run the search, or fix the input.
rotationA response arrived that the parser does not understand.Nothing to do on your side; contact us.
errorConfiguration or an unexpected failure. The message names it.Contact us.

Not supported on this source

Next: Google Flights · MakeMyTrip Flights · Cleartrip Flights