# Viagogo Resale Prices by Zone (`clarily/viagogo-resale-prices`) Actor

Lowest resale price per seating zone for any viagogo event page.

- **URL**: https://apify.com/clarily/viagogo-resale-prices.md
- **Developed by:** [clarily](https://apify.com/clarily) (community)
- **Categories:** E-commerce, Travel, AI
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Viagogo Resale Prices & Market Depth

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, the price buyers actually pay once fees are added, and demand signals — per seating zone.

All of it comes from a single page load. No extra requests, no extra cost.

### What you get

```json
{
  "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", "row": null, "price": 260, "totalPrice": 520,
      "faceValue": 89.5, "quantity": 2, "activeSince": "il y a 13 heures" },
    { "section": "Lower Tier N",    "row": "8",  "price": 549, "totalPrice": 1098,
      "faceValue": 140,  "quantity": 8, "activeSince": "il y a 9 jours" },
    { "section": "Lower Tier U",    "row": "9",  "price": 645, "totalPrice": 1290,
      "faceValue": 111,  "quantity": 2, "activeSince": "il y a 54 jours" }
  ],

  "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 }
  ]
}
```

### 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.

**`totalPrice` is what the buyer actually pays.** A €260 listing bills at €520 once fees are applied. Comparing marketplaces on displayed price means comparing the wrong number.

**`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 | `true` | Adds the per-zone price breakdown. Costs one page load per zone. |
| `maxZones` | integer | `12` | Caps zones priced per event. |
| `currency` | string | `EUR` | Currency for every price in the output. |
| `proxyConfiguration` | object | none | Optional. Direct connection by default. |

Turning `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
- **Fee-aware comparison** — the only field set that exposes the real checkout price
- **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.

### 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.
- `cheapestListings` covers the ten listings viagogo renders on the page; `listings` and the histogram cover the full inventory.
- `activeSince` is returned as viagogo phrases it ("il y a 9 jours"), not as a timestamp.
- `faceValue` is reported only when published in the same currency as the resale price — otherwise `null`, since a face value in another currency is not comparable. Expect nulls when pricing US inventory in euros, and set `currency` accordingly.
- Zones with no listings at all are returned with a `null` price rather than omitted.
- If a page has no listings, the record carries an `error` field and the run continues.

# Actor input Schema

## `startUrls` (type: `array`):

Viagogo event pages to scrape. Must be full event URLs containing E-<id>, e.g. https://www.viagogo.fr/Concert-Billets/Pop-Rock/Katseye-Billets/E-161141960. Search and performer pages are not accepted.

## `includeZones` (type: `boolean`):

Scrape the lowest price for each seating zone. Adds one page load per zone. Turn off to only get the overall lowest price, which is much faster.

## `maxZones` (type: `integer`):

Caps how many seating zones are priced on a single event. Large venues can have dozens.

## `proxyConfiguration` (type: `object`):

Optional. Leave off to connect directly. Residential proxies are recommended when running large batches.

## `currency` (type: `string`):

Currency for every price in the output. Viagogo otherwise converts prices to the currency of the IP the Actor runs from, which would make results depend on where it executes. Face value is only reported when it shares this currency.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.viagogo.fr/Concert-Billets/Pop-Rock/Katseye-Billets/E-161141960"
    }
  ],
  "includeZones": true,
  "maxZones": 12,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "currency": "EUR"
}
```

# Actor output Schema

## `events` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.viagogo.fr/Concert-Billets/Pop-Rock/Katseye-Billets/E-161141960"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clarily/viagogo-resale-prices").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.viagogo.fr/Concert-Billets/Pop-Rock/Katseye-Billets/E-161141960" }] }

# Run the Actor and wait for it to finish
run = client.actor("clarily/viagogo-resale-prices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.viagogo.fr/Concert-Billets/Pop-Rock/Katseye-Billets/E-161141960"
    }
  ]
}' |
apify call clarily/viagogo-resale-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clarily/viagogo-resale-prices"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aHyokesjbPhEGjejz/builds/3GSuhGIHECPc1UrTa/openapi.json
