Viagogo Resale Prices & Market Depth
Pricing
from $12.00 / 1,000 event market snapshots
Viagogo Resale Prices & Market Depth
Full resale snapshot for any viagogo event: price distribution, cheapest listings with fee-inclusive totals and listing age, per-zone prices and demand signals.
Pricing
from $12.00 / 1,000 event market snapshots
Rating
0.0
(0)
Developer
Soldout
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Most viagogo scrapers give you a "from €X" headline. This one gives you the state of the resale market: how long each listing has been sitting unsold, the full price distribution, what a pair of tickets actually totals to, and demand signals — per seating zone.
All of it comes from a single page load. No extra requests, no extra cost.
What you get
{"url": "https://www.viagogo.fr/Concert-Billets/Pop-Rock/Katseye-Billets/E-161141960","eventId": "161141960","scrapedAt": "2026-08-14T09:14:22.481Z","price": 153,"currency": "EUR","listings": 63,"availableTickets": 403,"daysToEvent": 26,"viewsLastHour": 51,"venue": { "name": "Accor Arena", "city": "Paris", "countryCode": "FR" },"histogram": [{ "startPrice": 153, "endPrice": 238.5, "count": 4 },{ "startPrice": 239.5,"endPrice": 325, "count": 8 },{ "startPrice": 326, "endPrice": 411.5, "count": 13 },{ "startPrice": 412.5,"endPrice": 498, "count": 3 }],"cheapestListings": [{ "section": "Placement Libre", "sectionId": 895401, "ticketClassName": "Gradin Supérieur","row": null, "price": 260, "totalPrice": 520, "faceValue": 89.5,"quantity": 2, "availableQuantities": [1, 2], "maxQuantity": 2,"activeSince": "il y a 13 heures", "createdAt": "2026-08-13T20:11:04.000Z" },{ "section": "Lower Tier N", "sectionId": 895412, "ticketClassName": "Gradins inférieurs","row": "8", "price": 549, "totalPrice": 1098, "faceValue": 140,"quantity": 8, "availableQuantities": [2, 4, 6, 8], "maxQuantity": 8,"activeSince": "il y a 9 jours", "createdAt": "2026-08-05T09:02:47.000Z" },{ "section": "Lower Tier U", "sectionId": 895418, "ticketClassName": "Gradins inférieurs","row": "9", "price": 645, "totalPrice": 1290, "faceValue": 111,"quantity": 2, "availableQuantities": [2], "maxQuantity": 2,"activeSince": "il y a 54 jours", "createdAt": "2026-06-21T14:38:20.000Z" }],"zones": [{ "ticketClassId": 265, "label": "Gradins inférieurs", "price": 162, "faceValue": 100,"listings": 16, "isSoldOut": false, "isSellingFast": false, "isSellingOutSoon": false },{ "ticketClassId": 267, "label": "Gradin Supérieur", "price": 153, "faceValue": 80,"listings": 9, "isSoldOut": false, "isSellingFast": false, "isSellingOutSoon": false },{ "ticketClassId": 24628,"label": "Cat Or", "price": 767, "faceValue": 139,"listings": 1, "isSoldOut": false, "isSellingFast": false, "isSellingOutSoon": false,"cheapestListings": [{ "section": "Cat Or 3", "row": "2", "price": 767, "faceValue": 139,"quantity": 4, "availableQuantities": [2, 4], "maxQuantity": 4,"activeSince": "il y a 21 jours", "createdAt": "2026-07-24T11:24:03.000Z" }] }]}
Why this beats a headline price
activeSince tells you what is actually moving. A €645 seat listed for 54 days is not a market price — it is a seller's wish. A €260 seat posted 13 hours ago is. This is the field to come here for: no other ticket dataset publishes how long a listing has been sitting unsold, and the usual workaround is to diff listing IDs across two runs and rebuild the history yourself. createdAt gives you the same signal as a timestamp you can sort and subtract.
availableQuantities tells you what is buyable, not just what is listed. A listing of six seats is worthless to you if the seller only splits it in pairs. quantity is the size of the lot; availableQuantities is the set of splits the seller accepts. No headline price tells you whether a single ticket can be bought at all.
totalPrice is the price for two tickets, not a fee-inclusive total. Across 2,949 listings it is exactly 2× price, at both the minimum and the maximum — viagogo defaults to a quantity of two and totals accordingly. It is not what a single buyer pays; don't use it as a fee-inclusive price.
histogram gives you depth, not a floor. Knowing the cheapest ticket is €153 tells you nothing about whether you can buy three of them. The distribution tells you how many listings sit under any threshold you care about.
faceValue per listing and per zone makes the markup computable directly: here the floor resells at 2.9× its face value while a Cat Or seat sits at 5.5×.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array | — | Viagogo event page URLs, containing E-<id>. Search and performer pages are rejected. |
includeZones | boolean | false | Adds the per-zone price breakdown. Costs one page load per zone, billed per zone. |
maxZones | integer | 12 | Caps zones priced per event. |
currency | string | EUR | Currency for every price in the output. |
proxyConfiguration | object | residential | Required. Viagogo blocks datacenter IPs. |
Leaving includeZones off still returns the histogram, the cheapest listings, the demand signals and the zone list with its sold-out flags — everything except the per-zone floor prices.
currency matters more than it looks. Viagogo converts prices to the currency of whichever IP asks, so the same event returns €153 from France and $175 from a US datacenter. This Actor pins the currency instead, which is what makes two runs comparable regardless of where they execute. Set it to the currency you report in — USD for US inventory, GBP for UK.
Use it for
- Pricing decisions — where to list, based on how many listings sit below your price
- Richer than a headline price — per-listing price, published face value, the full price distribution and a per-zone breakdown, all from one page load
- Liquidity screening — listing age separates a moving market from a stagnant one
- Markup and demand analysis — resale versus face value, views per hour, days to event
What you pay for
Two billed events, so you only pay for the work you ask for:
| Billed event | When | What it costs to produce |
|---|---|---|
event-scraped | once per event URL | one page load — the snapshot, histogram, listings and signals |
zone-priced | once per zone actually priced | one extra page load each |
Zones are billed separately because they are five times the work: a six-zone arena means seven page loads instead of one. Zones that come back empty — no inventory, or a lookup that failed — are not billed. Run with includeZones off and you pay the base rate only.
Tips
Batch your events into one run. The browser stays warm between events, so its cache is reused: the first page of a run transfers ~3.2 MB, every page after that ~330 KB. A hundred URLs in one run costs roughly a tenth of a hundred single-URL runs.
Zone prices are the only expensive part. They need one page load per zone — about 27 seconds for a six-zone arena. Everything else is one page load, full stop. That page is read in full: each zone comes back with its own cheapestListings, so the depth of a category costs no more than its floor price.
Limitations
- Works on any viagogo national domain —
viagogo.fr,viagogo.com,viagogo.de,viagogo.co.uk— and on events anywhere in the world, not only European ones. cheapestListingscovers the ten listings viagogo renders on the page;listingsand the histogram cover the full inventory.activeSinceis returned as viagogo phrases it ("il y a 9 jours");createdAtcarries the same information as an ISO 8601 timestamp, and isnullwhenever viagogo returns nothing parseable.availableQuantitiesis what a buyer can actually take, which is not the size of the lot: a listing of 6 seats whose seller refuses to strand a single seat readsquantity: 6butavailableQuantities: [2, 3, 6].- Per-zone
cheapestListingscovers the ten listings the filtered page renders, out of that zone'slistingscount. faceValueis reported only when published in the same currency as the resale price — otherwisenull, since a face value in another currency is not comparable. Expect nulls when pricing US inventory in euros, and setcurrencyaccordingly.- Zones with no listings at all are returned with a
nullprice rather than omitted. - If a page has no listings, the record carries an
errorfield and the run continues.