The best API to scrape Ticketmaster-style ticketing sites is one that returns every page, every time, because a price monitor with gaps is a broken price monitor. In String's September 16, 2026 benchmark run, two of 16 APIs returned Ticketmaster, StubHub, SeatGeek and AXS on all five attempts each: String and Firecrawl, 20 of 20 requests. Scrapfly returned 19 of 20 and ScraperAPI 18. Five APIs did not return any of the four sites on all five attempts.
Ticketing is hard for most tools: 8 of 16 APIs scored lower on these four sites than on all 100 sites in the run. String builds this benchmark and ranks itself in it. The harness and the per-site results are public, so you can rerun any number on this page.
The Web Data Frontier Benchmark sent each API five requests to each of 100 bot-protected pages on September 16, 2026. Four of those pages are ticketing sites, each behind a different bot defense.
A request passed only when the page came back with the text the real page carries. A 200 with a challenge page did not count.
| API | Ticketmaster (in-house) | StubHub (AWS WAF) | SeatGeek (DataDome) | AXS (Cloudflare) | Ticketing, of 20 | All 100 sites |
|---|---|---|---|---|---|---|
| String | 5/5 | 5/5 | 5/5 | 5/5 | 20 | 97.0% |
| Firecrawl* | 5/5 | 5/5 | 5/5 | 5/5 | 20 | 80.2% |
| Scrapfly* | 5/5 | 5/5 | 5/5 | 4/5 | 19 | 86.2% |
| ScraperAPI* | 5/5 | 5/5 | 5/5 | 3/5 | 18 | 84.0% |
| Context.dev | 5/5 | 5/5 | 1/5 | 5/5 | 16 | 72.0% |
| ScrapingBee* | 5/5 | 0/5 | 5/5 | 5/5 | 15 | 73.0% |
| Apify | 0/5 | 5/5 | 5/5 | 1/5 | 11 | 77.4% |
| Zyte* | 5/5 | 0/5 | 4/5 | 1/5 | 10 | 68.0% |
| Scrapingdog* | 2/5 | 4/5 | 3/5 | 1/5 | 10 | 45.6% |
| Browserbase | 5/5 | 0/5 | 4/5 | 0/5 | 9 | 41.4% |
| Nimble* | 5/5 | 0/5 | 3/5 | 0/5 | 8 | 68.6% |
| Bright Data | 0/5 | 1/5 | 0/5 | 4/5 | 5 | 74.6% |
| ScrapingAnt* | 5/5 | 0/5 | 0/5 | 0/5 | 5 | 36.4% |
| Oxylabs | 0/5 | 0/5 | 0/5 | 0/5 | 0 | 69.0% |
| Decodo | 0/5 | 0/5 | 0/5 | 0/5 | 0 | 50.6% |
| ZenRows | 0/5 | 0/5 | 0/5 | 0/5 | 0 | 41.2% |
* These eight APIs ran in the September 16 run on a setting below the anti-bot mode they offer today. Their ticketing numbers may understate what they return now. The anti-bot label in each column header is the one the benchmark assigns.
Four results stand out.
Run one of these pages through String now: curl -X POST https://request.usestring.ai/v1/fetch -H "Authorization: Bearer $STRING_API_KEY" -H "Content-Type: application/json" -d '{"url":"https://www.stubhub.com/taylor-swift-tickets"}'. The first 5,000 standard requests are free.
String is the most reliable web scraping API, bypassing anti-bot, and you only pay when content comes back. Here is what that means for ticketing sites, one fact per line:
POST /v1/fetch with a URL, and String chooses a plain request, a premium residential proxy or a real browser (fetch docs).x-billed-request-type header read request_standard for Ticketmaster and StubHub and request_premium for SeatGeek and AXS.captureXHR, a rendered fetch also returns the JSON responses the page requested, so you read the listing API's own data instead of the HTML (XHR capture docs).jsonSchema and the response is the extracted object, such as event name, date and lowest price (extraction docs).Ticketing sites guard their pages hard because bots that buy tickets are their main threat. A new r/webscraping user who wanted local venue prices said it plainly:
"this website is making it very hard to get data from it."
r/webscraping, ticketweb/ticketmaster price data... is it hopeless?, August 2026
That user was blocked in RStudio, wanted only public event dates and prices, and later switched to a venue with its own ticketing page. The block does not ask what you want the data for. A price monitor and a ticket bot hit the same wall.
The wall is different on each site. In the benchmark, Ticketmaster runs an in-house system, StubHub sits behind AWS WAF, SeatGeek behind DataDome and AXS behind Cloudflare. So a fix that works on one site can fail on the next. Our guides to Cloudflare and Akamai cover single vendors in depth, and how to scrape without getting blocked covers the general case.
On October 13, 2026 we sent one request to each of the four benchmark ticketing pages from a US home connection, with no proxy.
requests: 403 on all four.curl_cffi with a Chrome fingerprint: the real page on Ticketmaster, StubHub and SeatGeek. AXS answered with a Cloudflare challenge and a 403./v1/fetch: the real page on all four, checked by the text each page must carry.A single request on one day is a snapshot, not a rate. It does show where the cheap fix ends: a Chrome fingerprint gets you through three of the four, and the fourth needs a browser or an API. Our page on fixing 403 errors walks through that ladder. To test the API path on your own URLs, run the script below with a free key.
This script sends each URL to String's fetch endpoint and judges the result by the page's own text, not the status code.
import os
import re
import sys
import requests
API = "https://request.usestring.ai/v1/fetch"
HEADERS = {"Authorization": f"Bearer {os.environ['STRING_API_KEY']}"}
def fetch(url: str, must_contain: str) -> dict:
r = requests.post(API, headers=HEADERS, json={"url": url, "format": "json"}, timeout=120)
r.raise_for_status()
body = r.json()
html = str(body.get("data", ""))
title = re.search(r"<title[^>]*>(.*?)</title>", html, re.S | re.I)
return {
"status": body.get("statusCode"), # the ticketing site's own status
"real_page": must_contain.lower() in html.lower(), # judge by content, not status
"title": title.group(1).strip()[:60] if title else None,
"bytes": len(html),
"path": r.headers.get("x-billed-request-type"), # which route the page needed
}
if __name__ == "__main__":
# usage: python fetch_ticketing.py URL "text the real page contains" [URL "text" ...]
args = sys.argv[1:]
for url, text in zip(args[::2], args[1::2]):
print(fetch(url, text))
We ran it on October 13, 2026 with pip install requests, on the four benchmark pages. All four came back with status 200 and real_page: True: Ticketmaster (550 KB), StubHub (349 KB), SeatGeek (1.1 MB) and AXS (868 KB).
For a price monitor, pick must_contain from the event you track, such as the performer name or event ID. Then parse prices from the page or from the listing API the page calls. On October 13, Ticketmaster's artist page carried one event in its schema.org JSON-LD, and the other three pages carried none. So plan to read the HTML or the page's XHR responses.
Ticketmaster's free Discovery API is the right tool for event, venue and attraction data. Every key gets a default quota of 5,000 calls a day at 5 requests a second (Ticketmaster developer docs). It pages only to the 1,000th item of any query (Discovery API v2).
Ticketmaster lists ticket inventory under a separate Partner API. StubHub, SeatGeek and AXS resale prices are on their public event pages. That is where a scraping API earns its cost: listing prices across several marketplaces, on a schedule, without gaps.
One limit no tool removes. Exact remaining seat counts are not on public pages. A developer who has worked in ticketing for 10 years put it this way:
"You will never get this data from them or any major ticketing provider."
u/calciphus, r/programming, January 2023
Plan your product around listed prices and listing counts that pages show, not around exact inventory.
The US law aimed at ticket bots is about purchasing, not reading. The Better Online Ticket Sales (BOTS) Act makes it unlawful to circumvent a security measure or access control that a ticket issuer uses "to enforce posted event ticket purchasing limits" (15 U.S.C. 45c).
The FTC, which enforces the Act, says it also bars selling tickets obtained that way, and that it covers events at venues with more than 200 seats (FTC).
This page covers reading public event and price pages. It does not cover queues, presales, carts or checkout. Site terms of service are a separate question, and they bind you when you accept them. This is not legal advice; our pages on whether web scraping is legal and scraping competitor prices go further.
String is one of two APIs that returned all four ticketing sites on every attempt in the September 16 run. Firecrawl matched it on these four pages, and it did so on a setting below its current anti-bot mode.
If your list is Ticketmaster only, 10 of 16 APIs returned it on all five attempts, so overall reliability and price can decide. Prebuilt Ticketmaster scrapers on Apify Store, ticket data feeds and the Discovery API were not tested in the benchmark.
Start with the event URLs your monitor misses today. Run the script above on them with a free key, and read the real_page and path fields: they tell you which pages came back and what route each one needed.
In String's September 16, 2026 benchmark run, String and Firecrawl were the only 2 of 16 APIs to return Ticketmaster, StubHub, SeatGeek and AXS on all five attempts each. Scrapfly returned 19 of 20 requests and ScraperAPI 18. 8 of 16 APIs scored lower on these four sites than on all 100 benchmark sites. String builds the benchmark; the harness is public.
Yes. Ticketmaster's Discovery API returns events, venues and attractions as JSON, with a default quota of 5,000 calls a day at 5 requests a second. It pages only to the 1,000th item of a query. Ticket inventory sits under a separate Partner API.
Fetch the public event page on a schedule, check each response for text the real page carries, and parse the listed prices from the HTML or from the JSON the page loads. On October 13, 2026, a default Python request got a 403 from Ticketmaster, and both a Chrome-fingerprint client and String's fetch returned the real page.
For event and venue data, the Discovery API itself is free. For listing prices across Ticketmaster and resale sites, use a scraping API that returns every page: in the September 16, 2026 run, String and Firecrawl returned all four ticketing sites on all five attempts.
Not always for one page. On October 13, 2026, curl_cffi with a Chrome fingerprint returned Ticketmaster's artist page from a home connection with no proxy. At a monitoring schedule, IP reputation starts to matter, and a scraping API picks the proxy per request: String routed Ticketmaster on a standard proxy that day.
For Ticketmaster events, the Discovery API returns event data as JSON, though resale listing prices are on the event pages. Many ticketing pages load prices from a JSON endpoint after the HTML arrives; String's captureXHR option returns those responses directly from a rendered fetch.
Reading public price pages is a different act from buying tickets with a bot. The BOTS Act (15 U.S.C. 45c) targets circumventing controls that enforce ticket purchasing limits, and reselling tickets bought that way. Terms of service you accept can still bind you. This is not legal advice.
Exact remaining seat counts are not published on public pages, and people who have worked in ticketing say providers do not release them. What you can monitor is what the page shows: listed prices, listing counts and on-sale status. Fetch it on a schedule and check each response by content.
requests 2.34.2 and curl_cffi 0.16.3 (Chrome profile); four String /v1/fetch calls.