OrbTop

StubHub Ticket Resale Scraper

ECOMMERCESPORTS

StubHub Ticket Resale Scraper

Scrapes seller-level ticket listings from StubHub — concerts, sports, theater. Returns section, row, seat range, quantity, price, fees, face value and ticket class for every listing on an event, plus an event record with venue, date and lowest price.

Not the ten listings the page shows you. All of them.


StubHub Ticket Resale Scraper Features

  • Returns every listing on an event, not the curated handful the page renders. One Los Angeles Dodgers game came back with 552 listings across 58 pages.
  • Extracts 30+ fields per listing — section, row, seat range, available quantity, raw price, fees, face value, ticket class, plus StubHub's own star rating, deal score and seat-quality score.
  • Stable listing_id per seller listing, so you can diff two runs and see exactly what moved.
  • Discovers events from any performer, team or venue page. Point it at /new-york-yankees-tickets and it finds the schedule itself.
  • eventsOnly mode returns just the event rows with lowest price. Much cheaper when you only want to know what is on sale and roughly what it costs.
  • Works across every category. Concerts, MLB, NFL, theater — the extraction does not care what you point it at.
  • Fails loudly on an empty result instead of billing you for a run that returned nothing.

What Can You Do With StubHub Listing Data?

  • Ticket resellers — Watch an event's inventory and pricing across runs, and see which sections are thinning out before the price moves.
  • Price monitors — Diff listing_id between runs to catch new listings, price drops and sold-out sections without re-reading the whole market.
  • Market analysts — Compare face value against asking price by section to measure markup across venue, category or day of week.
  • Event aggregators — Pull a performer's schedule and lowest price with eventsOnly, then drill into the events that matter.
  • Venue and promoter analysts — Track secondary-market depth for your own events, which is the number nobody hands you.

Two jobs show up in how people actually use ticket scrapers, and this one is built for both. Some run a single event on a schedule and want every listing — that is monitoring, and it needs full inventory and a stable id to diff on. Others run once across many events and only want the headline price — that is research, and it needs eventsOnly and a small bill.


How StubHub Ticket Resale Scraper Works

StubHub does not put its inventory in the page source. The event HTML carries event metadata and a lowest price; the listings arrive separately once the page is running, behind AWS WAF and DataDome.

So the scraper runs a real browser, clears the challenge, then walks the listing grid page by page from inside that cleared session. Ten listings per page, however many pages the event has. It stops when the event runs out, not when the page stops scrolling.

Residential mobile egress, because that is what the site's bot protection lets through. If an exit gets refused it draws a fresh one and carries on.


Input

Field Type Default Description
maxItems integer 50 Maximum records to return, counting both event and listing rows.
discoverUrl string Performer, team or venue page to pull events from. Example: https://www.stubhub.com/new-york-yankees-tickets
eventUrls array Specific StubHub event URLs. Overrides discoverUrl when set.
quantity integer 1 Only return listings that can sell this many tickets together.
eventsOnly boolean false Return event rows without their listings. The cheap way to browse what is on sale.

Supply either discoverUrl or eventUrls. Supplying neither is the one way to make it complain immediately.


StubHub Ticket Resale Scraper Output Fields

Every row carries record_typeevent for an event summary, listing for a seller listing.

Event rows

Field Type Description
record_type string Always event on these rows
event_id string StubHub event id
event_url string Canonical event page URL
event_title string Event name, e.g. Seattle Mariners at Los Angeles Dodgers
event_date_utc string Start date and time, ISO 8601
venue_name string Venue name
venue_city string Venue city
venue_state string State or region
venue_country string Country
category string StubHub category for the event
lowest_price number Lowest advertised price across the event
price_currency string Currency of lowest_price
availability string schema.org availability
category_id string StubHub numeric category id

Listing rows

Field Type Description
record_type string Always listing on these rows
listing_id string Unique per seller listing. This is the one you diff on.
section string Seating section label, e.g. 30RS
section_id integer Numeric section id
section_map_name string Section name as shown on the seat map
row string Row within the section
seat_from string First seat number
seat_to string Last seat number
available_tickets integer Tickets available in this listing
available_quantities string Quantities the seller will split to, e.g. 1,2,4
max_quantity integer Largest purchasable quantity
price number Raw per-ticket price
formatted_price string Per-ticket price as displayed
formatted_total_price string Total price as displayed
formatted_fees string Fees, when broken out
face_value number Face value, when the seller discloses it
listing_currency string Currency the listing is priced in
ticket_class string Ticket class, e.g. Infield Reserve
ticket_type string Ticket type name
listing_notes string Seller and site notes, e.g. Clear view
star_rating integer StubHub star rating
deal_score string StubHub deal score
seat_quality_score string StubHub seat quality score
is_seated_together boolean Whether the seats are together
is_zone_ticket boolean Zone seating rather than specific seats
is_cheapest boolean Flagged as the cheapest listing
is_better_value boolean Flagged as better value
is_sponsored boolean Promoted listing
listing_url string Deep link to the listing
scraped_at string ISO 8601 scrape timestamp

Listing rows repeat event_id, event_title, event_date_utc, venue_name and venue_city, so a listing stands on its own without a join.


FAQ

How many listings does it actually return?

However many the event has. A single Los Angeles Dodgers game returned 552 unique listings across 58 pages. The event page itself shows ten, which is where most tools stop.

Can I track price changes over time?

Yes, and that is what listing_id is for. Run it on a schedule, keep the results, and diff on listing_id — new ids are new listings, missing ids have sold or been pulled, and a changed price on the same id is a repricing.

What is the difference between price and face_value?

price is what the seller is asking per ticket. face_value is what was originally printed on it, when the seller discloses it — often they do not. The gap between the two is the markup, which is usually the interesting part.

Why do some listings have no seat numbers?

Zone listings. When is_zone_ticket is true the seller is selling into a general area rather than specific seats, so seat_from and seat_to are empty and section is the granularity you get.

Can I scrape an event that has already happened?

No, and neither can anyone else. StubHub delists past events, so there is nothing on the page to scrape. The actor says so rather than handing back an empty dataset.


Need More Features?

Open a request at orbtop.com — extra filters, new discovery entry points, and scheduled delivery are all on the table. Specifics help more than "it should do more".


Why Use StubHub Ticket Resale Scraper?

  • Full inventory, not a sample — 552 listings on an event whose page renders ten. If you are pricing against the market, you need the market.
  • Seat-level detail — Section, row, seat range and quantity, plus face value and StubHub's own deal and seat-quality scores.
  • Built for repeat runs — A stable listing_id makes diffing two runs trivial, which is what monitoring actually requires.
  • A cheap mode that is genuinely cheapeventsOnly skips the listing walk entirely when you only need the schedule and the headline price.
  • Honest failures — A run that returns nothing raises an error explaining why, instead of handing you an empty dataset and a bill.