Search United Airlines flights between two airports for given dates and a trip type (one-way or round-trip), returning each result's times, duration, stops, flight numbers, cabin, fare brand, and price. Read-only — never books.
Automate repetitive workflows and reduce manual effort
Example: Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example: Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example: Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
Time estimate: 15-45 minutes depending on use case complexity
Prerequisites
Submit your Claude Code skill and start earning
browse install united.com/search-flights-xs5157Compatible with
Supported agents
| name | search-flights |
| title | United Airlines Flight Search |
| description | >- Search United Airlines flights between two airports for given dates and a trip type (one-way or round-trip), returning each result's times, duration, stops, flight numbers, cabin, fare brand, and price. Read-only — never books. |
| website | united.com |
| category | travel |
| tags | - travel - flights - airlines - united - read-only - akamai |
| source | 'browserbase: agent-runtime 2026-05-18' |
| updated | '2026-05-18' |
| recommended_method | browser |
| alternative_methods | - method: url-param rationale: >- The /en/us/fsr/choose-flights deep-link with f/t/d/r/tt/px/clm params is the recommended browser entry point — it bypasses the homepage typeahead form. It is NOT a standalone API path: the response is the React SPA shell with zero embedded flight data, so a real browser session is still required to harvest results. Surfaced here as a 'shortcut into the right page state', not a JSON endpoint. - method: api rationale: >- United's internal /api/flight/recentSearch returns 405 Method Not Allowed to GET and only accepts authenticated POSTs from the SPA's signed-session context. /api/airports/lookup/search returns 404. No usable out-of-band JSON surface for cash-fare search was found — don't waste time reverse-engineering. |
| verified | true |
| proxies | true |
Given an origin airport, destination airport, depart date (and optionally a return date), trip type (one-way or round-trip), and a passenger count, return the list of available United Airlines flights for those parameters — each flight's departure / arrival times, duration, stop count, flight number(s), cabin class, fare brand, and price. Read-only — never click "Select", "Continue", or any seat / fare / book button. Stop at the results page (/en/us/fsr/choose-flights).
/ual/en/us/flight-search/book-a-flight/results) and have a different fare model.The United flight-search UI is a JavaScript SPA. The cleanest path is to navigate directly to the search-results deep-link URL (/en/us/fsr/choose-flights?f=...&t=...&d=...&r=...&tt=...) instead of filling the homepage's typeahead form — this skips airport autocomplete, date-picker, and trip-type radio entirely, and avoids the typeahead-timing bugs that the form path is prone to. The page is still client-side rendered, so a real browser session is required to harvest the flight cards; the URL is just a shortcut into the right page state.
A residential-proxy + verified (Verified) Browserbase session is mandatory — the site is fronted by Akamai and a bare datacenter IP gets cookie / _abck challenges before any results render.
SID=$(browse cloud sessions create --keep-alive --verified --proxies | jq -r .id)
export BROWSE_SESSION="$SID"
Both --verified (Verified browsers) and --proxies (residential proxy pool) are required. Confirmed via browse cloud fetch evidence: _abck and bm_* Akamai cookies are set on every response, and a bare-IP session gets a challenge page in place of the SPA shell.
https://www.united.com/en/us/fsr/choose-flights
?f={ORIGIN_IATA}
&t={DEST_IATA}
&d={DEPART_YYYY-MM-DD}
&r={RETURN_YYYY-MM-DD} # omit for one-way
&tt={1|0|2} # 1=round-trip, 0=one-way, 2=multi-city
&sc=7 # search-class — keep 7 for cash fares
&px={PASSENGER_COUNT} # integer, 1–9
&taxng=1 # show all-in (taxes included) pricing
&clm=7 # cabin: 7=Economy, 6=Premium Economy, 4=Business, 3=First
&st=bestmatches # bestmatches | priceasc | departtime | arrivetime | duration
&newDateOverride=true # use new date logic — safer on cross-month dates
Examples (both validated as 200 OK via browse cloud fetch --proxies against the production host):
# Round-trip SFO → JFK, depart 2026-07-15, return 2026-07-22, 1 adult, Economy
https://www.united.com/en/us/fsr/choose-flights?f=SFO&t=JFK&d=2026-07-15&r=2026-07-22&tt=1&sc=7&px=1&taxng=1&clm=7&st=bestmatches
# One-way SFO → JFK, depart 2026-07-15, 1 adult, Economy
https://www.united.com/en/us/fsr/choose-flights?f=SFO&t=JFK&d=2026-07-15&tt=0&sc=7&px=1&taxng=1&clm=7&st=bestmatches
The URL accepts the airport as IATA code only (SFO, JFK, LAX, ORD, EWR, LHR, ...). City names, station IDs, or anything else gets coerced to a "no flights" state. If the caller hands you a city name, resolve it to an IATA code first (United's airport-lookup API at /api/airports/lookup/search returns 404 — not a usable surface — so resolve client-side from a static IATA table).
browse open "$URL" --remote
browse wait load
browse wait timeout 4000 # SPA hydrates results ~2–4s after `load`
browse snapshot
The first paint of the results grid is client-side — browse wait load alone is not sufficient; flight cards aren't in the DOM until the searchFsr XHR resolves. Empirically 3–4 seconds covers the long tail. If the snapshot returns 0 flight-card refs, sleep another 2s and retry once before declaring failure.
| Snapshot signal | Outcome |
|---|---|
| List of flight cards with depart/arrive times + price buttons | success — extract |
| "We're unable to process your request" banner | fail — error_reasoning: "site_error_banner" |
| Captcha / "verify you are a human" / Akamai 403 page | fail — error_reasoning: "akamai_challenge". Session is burned; release and create a fresh one |
| "No flights available for the dates you selected" | success with empty results: [] and no_flights_for_dates: true |
| Date-picker overlay re-appearing | The d= or r= value was rejected. Confirm the date format is YYYY-MM-DD and that it's ≥ today |
| Page header city ≠ requested route | The f / t codes were unrecognized — retry with verified IATA codes |
Each card on the results grid exposes:
08:30, in the rendered local airport time).5h 35m (or 5h 35m +1d for next-day arrivals).Nonstop, 1 stop, 2 stops. Parse to an integer.UA 232 (or UA 232, UA 7411 on multi-leg). Capture the full list.clm.$348.20* (the * indicates a Saver/award-mix fare — strip when emitting clean numbers, surface as flags: ["saver"]).For round-trip, the page renders outbound cards first; after the user selects an outbound, return cards render on a follow-up screen. To stay read-only, extract only the outbound cards and emit them as results. If the caller wants return-leg pricing too, run a second one-way search with f / t swapped and d=<return date>.
browse cloud sessions update "$SID" --status REQUEST_RELEASE
If United changes the FSR URL schema and the deep-link returns the homepage redirect or a date-picker overlay on every load, fall back to driving the homepage form:
browse open https://www.united.com/ --remotebrowse wait timeout 3000).One-way or Round-trip (default is Round-trip).SFO), wait 2000ms for the typeahead dropdown, then click the first option matching the code. Do not use browse fill — it auto-presses Enter, which submits the field before the typeahead surfaces. Use click → type → wait timeout 2000 → click <suggestion-ref>.> button, click the target day. For round-trip, the picker stays open; navigate + click the return day. Confirm with the picker's Done / Apply button.Find flights. Page navigates to /en/us/fsr/choose-flights?... with the params URL-encoded. From here continue at step 3 of the deep-link path.Form-fill is ~3× slower than the deep-link path and adds two failure modes (typeahead-race, date-picker-month-overshoot), so use only when the deep-link is confirmed broken.
Select, Continue, Book, Add to cart, or a fare-option price button — any of these starts the booking funnel and may hold inventory./ and /en/us/fsr/choose-flights?... set _abck, bm_ss, bm_s, bm_mi, and akacd_NS_AB cookies on the first response. A datacenter-IP session without Verified will be challenged on the second navigation. --verified --proxies is the minimum viable session config.browse cloud fetch of the deep-link returns the React shell HTML (~75 KB) with zero flight data embedded. There is no scraping shortcut that skips the browser; you must let the page hydrate. Verified by grepping the fetched body for searchContext|fareFamily|cabinClass|currentSearchCriteria — zero matches./api/flight/recentSearch returns 405 Method Not Allowed to GET. The endpoint exists internally but only accepts authenticated POSTs from the SPA's signed-session context. Don't waste time trying to reverse-engineer United's internal searchFsr JSON endpoint — it's behind anti-tamper headers + session cookies that aren't reproducible from an out-of-band fetch. Drive the browser instead./api/airports/lookup/search returns 404. The airport-typeahead endpoint is not at the obvious path. If you need IATA-code lookup, use a static IATA table (carry one in the skill harness) rather than trying to hit a United-side resolver.YYYY-MM-DD. The URL parser accepts 2026-07-15; anything else (07/15/2026, 15-Jul-2026, ISO with timezone) silently drops back to the date-picker overlay.tt=1 is round-trip, tt=0 is one-way, tt=2 is multi-city. Counter-intuitive direction. tt=2 requires a different param layout (f1/t1/d1, f2/t2/d2, ...) and is out of scope for this skill.taxng=1 is important. Without it, the listed prices are base-fare-only (no taxes/fees), which gives misleadingly low quotes. Always include it for "what does this cost?" queries.* on prices = Saver / mixed-cabin fare. Strip the asterisk when emitting numeric prices; surface as flags: ["saver"].success: true, results: [], no_flights_for_dates: true — not a failure.noflex=true to disable the flexible-date calendar above the grid (saves ~1s on hydration). Optional./ual/en/us/flight-search/book-a-flight/results is the award flow; do not confuse the two surfaces — they have different fare models, different cabin enums, and a different results DOM.{
"success": true,
"trip_type": "round-trip",
"origin": "SFO",
"destination": "JFK",
"depart_date": "2026-07-15",
"return_date": "2026-07-22",
"passengers": 1,
"cabin": "economy",
"results_url": "https://www.united.com/en/us/fsr/choose-flights?f=SFO&t=JFK&d=2026-07-15&r=2026-07-22&tt=1&sc=7&px=1&taxng=1&clm=7&st=bestmatches",
"results": [
{
"depart_time": "08:30",
"depart_airport": "SFO",
"arrive_time": "17:05",
"arrive_airport": "JFK",
"next_day_arrival": false,
"duration": "5h 35m",
"stops": 0,
"flight_numbers": ["UA 232"],
"cabin_class": "Economy",
"fare_brand": "Basic Economy",
"price_usd": 348.20,
"flags": []
},
{
"depart_time": "10:15",
"depart_airport": "SFO",
"arrive_time": "21:48",
"arrive_airport": "JFK",
"next_day_arrival": false,
"duration": "8h 33m",
"stops": 1,
"flight_numbers": ["UA 481", "UA 1722"],
"cabin_class": "Economy",
"fare_brand": "Economy",
"price_usd": 412.40,
"flags": ["saver"]
}
],
"no_flights_for_dates": false,
"error_reasoning": null
}
Distinct outcome shapes:
// Success — flights returned (canonical case)
{ "success": true, "results": [ /* ≥1 flight */ ], "no_flights_for_dates": false, "error_reasoning": null, ... }
// Success — no flights for the requested dates / cabin / route
{ "success": true, "results": [], "no_flights_for_dates": true, "error_reasoning": null, ... }
// Failure — Akamai challenge (session burned, retry with a fresh Verified session)
{ "success": false, "results": [], "error_reasoning": "akamai_challenge", ... }
// Failure — invalid input (unrecognized IATA, malformed date, past date)
{ "success": false, "results": [], "error_reasoning": "invalid_input: <field>=<value>", ... }
// Failure — site error banner ("We're unable to process your request")
{ "success": false, "results": [], "error_reasoning": "site_error_banner", ... }
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionsearch-flightsExecute the skills CLI command in your project's root directory to begin installation:
browse install united.com/search-flights-xs5157Fetches search-flights from united.com/search-flights-xs5157 and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
.cursor/skills/search-flights
Restart Cursor to activate search-flights. Access via /search-flightsin your agent's command palette.
Learn more:View source on GitHubSkills CLI docsAbout CursorWhat are agent skills?
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
search-hotels
booking.com/search-hotels-asq6cc · travel · 2 shared tags
add-to-cart
kmart.com.au/kmart-irwsr8 · shopping · 2 shared tags
check-interactions
drugs.com/check-interactions-0hqfnn · health · 2 shared tags
find-specialist
healthgrades.com/find-specialist-4ekjm6 · healthcare · 2 shared tags
browse-campsites
freecampsites.net/browse-campsites-qyj28m · travel · tag: travel
find-california-business
bizfileonline.sos.ca.gov/find-california-business-izbvm2 · government · tag: read-only
Registry listing for search-flights matched our evaluation — installs cleanly and behaves as described in the markdown.
I recommend search-flights for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Keeps context tight: search-flights is the kind of skill you can hand to a new teammate without a long onboarding doc.
Registry listing for search-flights matched our evaluation — installs cleanly and behaves as described in the markdown.
Keeps context tight: search-flights is the kind of skill you can hand to a new teammate without a long onboarding doc.
Useful defaults in search-flights — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
Registry listing for search-flights matched our evaluation — installs cleanly and behaves as described in the markdown.
Useful defaults in search-flights — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
I recommend search-flights for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
We added search-flights from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
showing 1-10 of 42