# TicketSwap Listings Scraper ($2/1K) (`carabain-digital/ticketswap-listings`) Actor

Scrape resale ticket listings from TicketSwap: price per ticket with and without fees, face value, quantity, seats, seller note, ticket type, event, date, venue and city. Event, ticket-type or city URLs; available, reserved and sold listings; any currency.

- **URL**: https://apify.com/carabain-digital/ticketswap-listings.md
- **Developed by:** [Carabain Digital](https://apify.com/carabain-digital) (community)
- **Categories:** E-commerce, Other
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

#### What is TicketSwap Listings Scraper?

**TicketSwap Listings Scraper** scrapes **resale ticket listings from TicketSwap ([ticketswap.com](https://www.ticketswap.com))**, the fan-to-fan ticket marketplace for concerts, festivals, club nights and sports in Europe. You get clean, flat listing data as JSON, CSV, Excel, XML or HTML: the **price per ticket with and without fees, the face value, how many tickets, seat numbers, the seller's note, ticket type, event, date, venue and city**. Paste event pages, ticket-type pages or city pages; collect available, reserved and recently **sold** listings, in any currency TicketSwap offers. Prefilled example: 10 listings each for 2 events on the Amsterdam page. Costs **$2.00 per 1,000 listings** (plus a small start fee).

- 🎟 **Every ticket type**: an event URL opens all its ticket types (regular, seats, VIP, festival days ...); a ticket-type URL opens just that one
- 🏙 **Discover events**: paste a city page (`/city/amsterdam/3`, `/city/berlin/2`) and the Actor opens the events it shows first
- 💶 **Full price picture**: buyer price with fees, seller price, face value, and the price in the seller's own currency
- ✅ **Sold prices too**: switch on `sold` to see what tickets actually went for
- 💱 **Any currency**: EUR by default, or GBP, USD, DKK and the other currencies in TicketSwap's menu
- 🔌 **Connect anywhere**: API, schedules, webhooks, Google Sheets, Make, Zapier, MCP / AI agents

#### What data can I extract from TicketSwap?

<table>
<tr><td>🆔 Stable listing ID and URL</td><td>🟢 Status: available, reserved, sold</td></tr>
<tr><td>🎤 Event name, category and URL</td><td>📅 Event date and time</td></tr>
<tr><td>📍 Venue, city, country</td><td>🎟 Ticket type and group (e.g. festival day)</td></tr>
<tr><td>💶 Price per ticket incl. fees</td><td>🧾 Seller price per ticket</td></tr>
<tr><td>🏷 Face value</td><td>🌍 Price in the seller's currency</td></tr>
<tr><td>🔢 Tickets available / in listing</td><td>💺 Section, row and seat</td></tr>
<tr><td>📝 Seller's note</td><td>📊 Tickets available and sold per ticket type</td></tr>
</table>

Fields TicketSwap does not show for a listing stay `null` (`description` when the seller wrote nothing); `seating` is an empty list for standing tickets. No seller names or profile pictures are collected.

#### How do I scrape TicketSwap listings?

1. [Create a free Apify account](https://console.apify.com/sign-up) and open this Actor.
2. Paste one or more **Start URLs**: an event page, a ticket-type page, or a city page from ticketswap.com.
3. Choose the **Listing status** (available by default; add sold and reserved if you want them), **Max listings per event** and, for city pages, **Max events**.
4. Optionally set a **Currency** such as `GBP`.
5. Click **Start**, then download the listings from the **Output** tab as JSON, CSV, Excel, XML or HTML.

#### How much does it cost to scrape TicketSwap?

You pay per listing that ends up in your dataset: **$2.00 per 1,000 listings**, plus a small start fee of $0.025 per GB of run memory (the Actor needs a real browser; the default 2 GB run costs $0.05 to start). No subscription. The monthly credit of Apify's Free plan ($5) covers roughly 2,000 listings. Paid plans get volume discounts. Failed runs and events without listings cost nothing apart from the start fee; you can cap spending with **Maximum cost per run** in the run options. See the **Pricing** tab for the current prices.

#### ⬇️ Input

| Field | Description |
|---|---|
| **Start URLs** (`startUrls`) | Event pages, ticket-type pages, or city / category pages of ticketswap.com |
| **Listing status** (`statuses`) | `available` (default), `reserved`, `sold`, any combination |
| **Max listings per event** (`limit`) | Stop an event after this many listings (default 50) |
| **Max events per city / category page** (`maxEvents`) | How many events of such a page to open (default 10) |
| **Currency** (`currency`) | 3-letter code from TicketSwap's currency menu; empty = EUR |
| **Proxy** (`proxyConfiguration`) | Apify datacenter proxy (default) |

```json
{
    "startUrls": [
        "https://www.ticketswap.com/city/amsterdam/3",
        "https://www.ticketswap.com/concert-tickets/muse-amsterdam-ziggo-dome-2026-11-30-Cby6zngFKckmfBWkYEuk6"
    ],
    "statuses": ["available", "sold"],
    "limit": 50,
    "maxEvents": 10,
    "currency": "EUR",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
```

Which URL to use:

- **Event page** (`/concert-tickets/<event>-<id>`): all ticket types of the event, in the site's order, until `limit`.
- **Ticket-type page** (`/<event path>/<type>/<number>`, the page you get when you click a ticket type): only that type.
- **City page** (`/city/amsterdam/3`, `/city/berlin/2`): the first `maxEvents` events on it, soonest first. Country and category pages (`/netherlands`, `/concert-tickets`) show events *near the proxy's location* (a US datacenter IP gets US events), so prefer city pages.
- Events that already started are closed for trading on TicketSwap and return no listings.

Within a ticket type, available listings come cheapest first, as on the site. TicketSwap shows only the **3 most recent reserved and sold listings per ticket type**, so sold prices are a sample, not the full sales history.

#### ⬆️ Output

Listings are stored in the default dataset. View them as a table in the **Output** tab or export JSON, CSV, Excel, XML or HTML.

```json
{
    "id": "ticketswap:22611584",
    "source": "ticketswap",
    "url": "https://www.ticketswap.com/listing/jungle-with-special-guests-rio-kosta/22611584/f7b994767f",
    "status": "available",
    "event_name": "Jungle With Special Guests RIO KOSTA",
    "event_url": "https://www.ticketswap.com/concert-tickets/jungle-amsterdam-ziggo-dome-2026-11-03-CZPKdMhgGJiHBaZBfS4t4",
    "event_date": "2026-11-03T20:00:00+01:00",
    "event_category": "concerts",
    "venue": "Ziggo Dome",
    "city": "Amsterdam",
    "country": "NL",
    "ticket_type": "Seats",
    "ticket_type_group": null,
    "ticket_type_url": "https://www.ticketswap.com/concert-tickets/jungle-amsterdam-ziggo-dome-2026-11-03-CZPKdMhgGJiHBaZBfS4t4/seats-tickets/5914162",
    "price_per_ticket": 55.11,
    "seller_price_per_ticket": 50.0,
    "price_currency": "EUR",
    "face_value_per_ticket": 70.0,
    "face_value_currency": "EUR",
    "seller_currency_price_per_ticket": 55.11,
    "seller_currency": "EUR",
    "tickets_available": 2,
    "tickets_in_listing": 2,
    "description": "nice front row seats for the concert tomorrow! enjoy :)",
    "seating": [
        {"entrance": null, "section": "1", "row": "205", "seat": "126"},
        {"entrance": null, "section": "1", "row": "205", "seat": "127"}
    ],
    "type_available_tickets": 49,
    "type_sold_tickets": 420,
    "scraped_at": "2026-11-02T20:36:31+00:00"
}
```

- `price_per_ticket` is what a buyer pays per ticket, TicketSwap's fees included; `seller_price_per_ticket` is what the seller asks. Both are in `price_currency` (the currency you chose).
- `face_value_per_ticket` is the original ticket price the seller entered, in `face_value_currency`. TicketSwap caps resale prices relative to it.
- A sold listing has `status` `sold` and `tickets_available` 0.

#### What can I do with TicketSwap data?

- 📈 **Resale price tracking**: follow prices per event and ticket type as the date gets closer
- 🎯 **Demand research**: see which shows and festival days sell out and what tickets go for
- 🔔 **Alerts**: send new cheap listings for an event to Slack, Telegram or e-mail
- 🧠 **Analytics and AI**: compare resale against face value across cities, venues and genres

#### Tips for best results

- For one event you care about, paste its event URL and schedule the run every hour or day.
- For a market overview, paste several city pages and raise **Max events**.
- Big events have many ticket types; `limit` caps the listings per event, so raise it to cover them all.
- Leave **Currency** empty for euro; any other currency costs a few seconds extra once per run.

#### Frequently asked questions

##### Can I use TicketSwap Listings Scraper with the Apify API?

Yes. Every run has a dataset you can read through the [Apify API](https://docs.apify.com/api/v2). Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("carabain-digital/ticketswap-listings").call(run_input={
    "startUrls": ["https://www.ticketswap.com/city/amsterdam/3"],
    "limit": 50,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["event_name"], listing["ticket_type"], listing["price_per_ticket"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('carabain-digital/ticketswap-listings').call({
    startUrls: ['https://www.ticketswap.com/city/amsterdam/3'],
    limit: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, 'listings');
```

##### Can I use TicketSwap Listings Scraper through an MCP server or with AI agents?

Yes. Add it to an AI agent through the [Apify MCP server](https://mcp.apify.com) (`https://mcp.apify.com?tools=carabain-digital/ticketswap-listings`), or let the agent find it with `search-actors` and run it with `call-actor`. The prefilled example (2 events, 10 listings each) takes about 30 to 60 seconds because it starts a real browser, so the agent polls the run and then reads the small, flat items with `get-dataset-items`. Example prompt: *"Use TicketSwap Listings Scraper on this event URL and tell me the cheapest seated ticket and how it compares to face value."*

##### Can I integrate TicketSwap data with other apps?

Yes: Google Sheets, Slack, Make, Zapier, n8n, Airtable or your own webhook, through Apify [integrations](https://apify.com/integrations) and [webhooks](https://docs.apify.com/platform/integrations/webhooks). Schedule runs to keep the prices fresh.

##### Why do I get fewer sold listings than the event page says were sold?

TicketSwap only shows the 3 most recent reserved and sold listings per ticket type, and one listing can hold several tickets. The per-type totals are in `type_available_tickets` and `type_sold_tickets`.

##### Why does a run take a minute, and which proxy do I need?

TicketSwap checks every visitor with a JavaScript challenge, so the Actor runs a real (stealth) browser and opens each ticket-type page like a visitor: about 2 to 10 seconds per page, roughly 10 to 40 seconds per event. The Apify datacenter proxy (the default) passed the check in our tests; switch to RESIDENTIAL only if your runs get blocked.

##### Is it legal to scrape TicketSwap?

The Actor only collects publicly visible listing data, the same information anyone sees on ticketswap.com, and leaves out seller names and pictures. A seller's note can still contain personal data, and rules such as GDPR may apply to how you store and use it. Check your use case with a lawyer. More background: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

##### TicketSwap Listings Scraper not working? Feedback

Open an issue on the **Issues** tab of this Actor with the run link and we will look at it. Feature ideas are welcome there too.

⭐ **Does it work well for you?** A review on the Store page helps others find this Actor and helps us keep it maintained.

# Actor input Schema

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

TicketSwap URLs: an event page (all ticket types), a ticket-type page (only that type), or a city / category page to pick up the events it shows first. Example: `https://www.ticketswap.com/concert-tickets/muse-amsterdam-ziggo-dome-2026-11-30-Cby6zngFKckmfBWkYEuk6` or `https://www.ticketswap.com/city/amsterdam/3`.

## `statuses` (type: `array`):

Which listings to collect. Example: `["available", "sold"]`. TicketSwap shows all available listings but only the 3 most recent reserved and sold listings per ticket type.

## `limit` (type: `integer`):

Stop collecting an event after this many listings. Ticket types are opened in the site's order; within a type the listings come cheapest first. Example: `50`.

## `maxEvents` (type: `integer`):

For city or category start URLs: how many of the events shown on that page to open. Event and ticket-type URLs are always opened. Example: `10`.

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

Show prices in this currency, as a 3-letter code TicketSwap offers in its currency menu. Example: `GBP`, `USD`, `DKK`. Empty = the site's default (EUR). The seller's own currency and price are always included too.

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

Apify datacenter proxy (the default) passes TicketSwap's browser check. Switch to RESIDENTIAL only if runs get blocked.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.ticketswap.com/city/amsterdam/3"
  ],
  "statuses": [
    "available"
  ],
  "limit": 10,
  "maxEvents": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped resale listings, one item per listing.

# 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": [
        "https://www.ticketswap.com/city/amsterdam/3"
    ],
    "limit": 10,
    "maxEvents": 2,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("carabain-digital/ticketswap-listings").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": ["https://www.ticketswap.com/city/amsterdam/3"],
    "limit": 10,
    "maxEvents": 2,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("carabain-digital/ticketswap-listings").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": [
    "https://www.ticketswap.com/city/amsterdam/3"
  ],
  "limit": 10,
  "maxEvents": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call carabain-digital/ticketswap-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,carabain-digital/ticketswap-listings"
        }
    }
}
```

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/VCJXjdQYJMOPN3qP1/builds/6mXelH8U9xGVYhGDM/openapi.json
