Loading page content.
Loading page content.
Travel data
Airline and hotel pricing is point-of-sale dependent, session-bound and heavily defended. Collecting comparable fares means fixing the point of sale, holding the session, and spreading the search load across many exits.
The problem
An airfare depends on the point of sale as well as the itinerary. The same flight quoted to a browser in Germany, in euros, on a German point of sale can differ materially from the fare quoted to the same itinerary from a US address in dollars — different fare buckets are filed for different markets, and currency conversion is the smallest part of the gap. A collector that ignores point of sale produces a price list that is internally inconsistent.
Search is also expensive for the supplier. Every availability query hits a global distribution system or a supplier's own inventory service, and each one costs the supplier real money, which is why look-to-book ratios are monitored and aggressive searching is throttled hard. Defences here are among the most sophisticated on the public web: behavioural analysis, session validation, and per-address search budgets measured in the low tens.
Finally, the flow is stateful. A search establishes a session, results reference it, and a fare quote is only valid within it. An exit that changes mid-flow invalidates the quote and the collector records a failure that looks like unavailability.
Why proxies
This workload needs both halves of a rotating pool. Breadth spreads the search budget: with each search leaving from a different residential address, no address approaches the per-IP throttle, and the fleet's total throughput becomes a function of pool size rather than of one supplier's patience.
Stickiness holds a single search together. Appending a session token to the proxy username pins one exit for up to 30 minutes, which is more than enough for search, results, fare rules and a price quote to complete on one identity. Dropping the token between searches returns the fleet to a fresh identity per query.
Recommended product
A fresh residential IP on every request, or one held for 30 minutes
from $3.40/GB
Airline and hotel mobile apps, and the mobile-web fares that sometimes differ from desktop, need a carrier exit to be observed as an app user sees them.
from $1.20/GB
Schedule data, airport metadata, seat maps and other low-defence endpoints do not need residential egress and cost roughly half as much per gigabyte.
Worked example
The session token is a segment of the username. Generating a new one per search gives each search its own exit while keeping every request within that search on the same address — which is precisely the shape a fare flow needs.
import uuid
import requests
USER = "fp_8s2k4d19"
PASSWORD = "Xk7mQ2pTz9vRn4Ls"
def session_for(country: str) -> requests.Session:
# One token per search. Every request carrying this token leaves from the
# same exit for up to 30 minutes; a new token means a new address.
token = uuid.uuid4().hex[:12]
username = f"{USER}-country-{country}-session-{token}"
proxy = f"http://{username}:{PASSWORD}@gate.fleetproxy.com:8080"
session = requests.Session()
session.proxies = {"http": proxy, "https": proxy}
session.headers.update({"Accept-Language": "de-DE,de;q=0.9"})
return session
def search_fares(origin: str, destination: str, date: str, point_of_sale: str = "de"):
session = session_for(point_of_sale)
# Step 1 opens the search; the supplier binds a session to this exit.
start = session.post(
"https://airline.example/api/search",
json={"from": origin, "to": destination, "date": date},
timeout=(10, 45),
)
start.raise_for_status()
search_id = start.json()["searchId"]
# Step 2 polls it. Same session, same exit — a different address here
# invalidates the quote and looks like an availability failure.
results = session.get(
f"https://airline.example/api/search/{search_id}/results",
timeout=(10, 45),
)
results.raise_for_status()
return {
"point_of_sale": point_of_sale,
"currency": results.json()["currency"],
"offers": results.json()["offers"],
}
print(search_fares("FRA", "JFK", "2026-11-14"))Replace the credential with the one in your dashboard. The gateway host, port and username format are the same across every product.
Pitfalls
Each of these is common, cheap to fix, and expensive to leave in place. They are listed in roughly the order teams hit them.
A German point-of-sale fare in euros and a US point-of-sale fare in dollars are different products, not a currency conversion apart. Store the point of sale as a first-class field and never aggregate across it without saying so explicitly.
Changing exit between the search request and the results poll invalidates the supplier's session and returns an error that looks like sold-out inventory. Pin the session for the whole flow, then drop it.
A full route × date matrix is mostly stable and mostly uninteresting. Prioritise routes with volatile pricing and dates inside the booking window, and let the long tail refresh on a slower cadence. This cuts both cost and defensive attention.
A headline fare without bags, seats and payment-method fees is not the price a traveller pays, and a comparison built on it will be wrong in the direction of whichever carrier unbundles the most. Capture the ancillary structure with the fare.
Questions
Start on 50MB of free residential bandwidth, measure your own targets, and scale into volume tiers that step the rate down as the job grows. Unused bandwidth never expires.
No card required for the trial. Cancel or downgrade at any time.