# Dice.fm Events Scraper (`steadyscrape_juanmuller/dice-fm-events-scraper`) Actor

Scrape every upcoming Dice.fm event in a city, or at a venue, artist or promoter: lineup, venue, prices, sold-out status. Fast HTTP-only scraper. Monitoring mode returns only new or changed events.

- **URL**: https://apify.com/steadyscrape_juanmuller/dice-fm-events-scraper.md
- **Developed by:** [Juan Muller](https://apify.com/steadyscrape_juanmuller) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Dice.fm Events Scraper

**Get every upcoming Dice.fm event in a city, or at a venue, artist or promoter, with lineup, venue, ticket prices and sold-out status.**
Built for promoters, venues, ticketing and music-data teams, event apps and AI agents that need complete, fresh Dice listings.
Switch on **monitoring mode** to receive only new or changed events (new announcements, sell-outs, price changes) on every scheduled run.

### Why this scraper

- **Every event, not just the first 30.** Dice's city pages show about 30 popular events and its listings stop at roughly 24 per query. This scraper works around both limits and collects every event in your date range. In testing it found **180 of 180** London events on a busy Saturday.
- **Sold-out tracking.** Each event has its live Dice status (`on-sale`, `sold-out`, ...) and an `isSoldOut` flag.
- **Monitoring mode.** Remembers what earlier runs returned and saves only new or changed events. Unchanged events are skipped and **not charged**, and repeat runs take seconds.
- **Venues, artists and promoters.** Paste their Dice pages to get all their upcoming events, handy for tracking competitors or a roster.
- **Fast and reliable.** Plain HTTP, no browser: about 150 to 200 events per minute with full details. Requests that fail are retried with backoff, and one bad page never stops the run.

### How to use it

1. Enter one or more **cities** (for example `London`, `Berlin`, `New York`) or paste Dice **venue, artist, promoter or event URLs**.
2. Optionally set a date range or price range and a maximum number of results.
3. Run it, then download the results as JSON, CSV or Excel, or get them through the Apify API, webhooks or integrations.
4. For ongoing tracking, schedule it (for example daily) with **Only new or changed events** turned on.

### Input example

```json
{
    "cities": ["London", "Berlin"],
    "daysAhead": 30,
    "includeDetails": true,
    "onlyNewOrChanged": false,
    "maxItems": 1000
}
```

Venue, artist or promoter monitoring:

```json
{
    "startUrls": [
        { "url": "https://dice.fm/venue/barfly-camden-jqa4" },
        { "url": "https://dice.fm/promoters/camden-rocks-festival-ltd-kwbq" }
    ],
    "onlyNewOrChanged": true
}
```

| Field | What it does |
|---|---|
| `cities` | City names as Dice spells them, or a city browse URL from dice.fm. |
| `startUrls` | Dice venue, artist, promoter or event URLs. |
| `daysAhead` | Days from today to cover for city searches (default 30). The window rolls forward on scheduled runs. |
| `dateFrom`, `dateTo` | Optional fixed date range for city searches. |
| `minPrice`, `maxPrice` | Optional ticket price range, in the city's currency. |
| `includeDetails` | Adds lineup, promoter, categories, door time, description and price range (default on). |
| `onlyNewOrChanged` | Monitoring mode, see below. |
| `maxItems` | Stop after this many events (default 1,000). |

### Output example

One row per event:

```json
{
    "eventId": "6acea0ad55542e000154e64d",
    "eventUrl": "https://dice.fm/event/av87ex-camden-rocks-all-dayer-w-star-circus-more-8th-nov-barfly-camden-london-tickets",
    "name": "Camden Rocks All Dayer w/ Star Circus & more",
    "status": "on-sale",
    "isSoldOut": false,
    "categories": ["Gigs"],
    "startDate": "2026-11-08T12:30:00+00:00",
    "endDate": "2026-11-08T23:00:00+00:00",
    "doorsOpen": "2026-11-08T12:30:00+00:00",
    "timezone": "Europe/London",
    "isMultiDay": false,
    "announcedAt": "2026-10-14T17:00:00+01:00",
    "saleStartDate": "2026-10-14T17:00:00+01:00",
    "saleEndDate": "2026-11-08T11:00:00+00:00",
    "currency": "GBP",
    "minPrice": 12.2,
    "maxPrice": 12.2,
    "venueName": "Barfly Camden",
    "venueId": "12",
    "venueSpace": null,
    "venueAddress": "49 Chalk Farm Road, London NW1 8AN",
    "venueCity": "London",
    "venueCountryCode": "GB",
    "venueLatitude": 51.5431088,
    "venueLongitude": -0.149272099999962,
    "venueUrl": "https://dice.fm/venue/barfly-camden-jqa4",
    "lineup": ["Glitter Kick", "Healthy Junkies", "Bugeye", "Star Circus"],
    "artistUrls": [
        "https://dice.fm/artist/glitter-kick-bwp2g",
        "https://dice.fm/artist/healthy-junkies-xelxk",
        "https://dice.fm/artist/bugeye-eo7qo",
        "https://dice.fm/artist/star-circus-g5bp6"
    ],
    "promoterName": "Camden Rocks Festival Ltd",
    "promoterUrl": "https://dice.fm/promoters/camden-rocks-festival-ltd-kwbq",
    "presentedBy": "Presented by Camden Rocks Festival Ltd.",
    "description": "Camden Rocks return with another legendary rock ’n’ roll all-dayer at the re-launched Barfly…",
    "imageUrl": "https://dice-media.imgix.net/attachments/2026-10-13/e1d28415-e309-41bc-b3a2-4f96abe29df6.jpg?rect=0%2C750%2C3751%2C2251",
    "attendanceType": "live_only",
    "waitingListEnabled": true,
    "ticketsAtDoor": false,
    "detailsScraped": true,
    "searchCity": "London",
    "changeType": null,
    "changedFields": null,
    "sourceUrl": "https://dice.fm/browse/london-54d8a23438fe5d27d500001c",
    "scrapedAt": "2026-11-04T16:13:19.728Z"
}
```

Prices are what Dice shows to buyers, in the event's currency. Dates are ISO 8601 with the event's local time offset.

### Monitoring mode

Turn on **Only new or changed events** and schedule the scraper. The first run saves everything and remembers it. Each later run of the **same search** saves only:

- **new** events (`changeType: "new"`), for example a show announced since the last run, and
- **changed** events (`changeType: "changed"`), with `changedFields` listing what changed: `status` (for example it sold out), `price`, `startDate`, `endDate`, `venueName`, `name`, `saleStartDate` or `saleEndDate`.

Unchanged events are skipped and not charged. Use the dataset's **Changes** view for a quick diff table.

### Pricing

You pay only for events saved to your results:

- **$5.00 per 1,000 events** on the Apify Starter plan (cheaper on higher plans), plus **$0.005 per run**.
- Failed pages, duplicates and, in monitoring mode, unchanged events are **never charged**.
- Set a **maximum cost per run** in the run options and the scraper stops exactly there.

Examples: all London events for the next 7 days (about 750) cost about $3.75. A daily monitoring run that finds 40 new or changed events costs about $0.21.

### FAQ

**Which cities are supported?**
Any city Dice lists. Type the name as Dice spells it (`London`, `Paris`, `Los Angeles`, `Milan`). If a name doesn't resolve, open the city on dice.fm and paste its browse URL, for example `https://dice.fm/browse/london-54d8a23438fe5d27d500001c`. Like Dice, a city search includes nearby towns (London results include, for example, Archway and Chelmsford).

**Why is `lineup` empty for some events?**
The promoter didn't list artists on Dice. This is common for club nights, comedy, workshops and talks. The event name usually carries the billing.

**What is `detailsScraped: false`?**
The event page couldn't be read (rare), so the row has listing fields only: name, dates, venue, price and status. You're still getting a valid event.

**Do venue, artist and promoter pages respect the date and price filters?**
No. Those pages return all upcoming events Dice shows for them (up to about 30 per page). Date and price filters apply to city searches.

**How fresh is the data?**
Live. Every run reads Dice's public pages at that moment, including current sold-out status.

**Do I need a proxy?**
The default Apify datacenter proxy is enough. You don't need a residential proxy.

**Can AI agents use it?**
Yes. It runs from the Apify API and Apify's MCP server, and with no input at all it returns London events for the next 30 days.

### Public data only

This scraper collects only publicly available event information that Dice shows to any visitor without logging in: events, venues, performers and promoters. It does not log in, does not bypass CAPTCHAs and collects no personal data about ticket buyers or attendees. You are responsible for how you use the data and for complying with Dice's terms and the laws that apply to you.

# Actor input Schema

## `cities` (type: `array`):

City names as Dice spells them (for example London, Berlin, New York, Barcelona, Paris) or a city browse URL copied from dice.fm. The scraper collects every event in the date range, not just the 30 popular events Dice shows on the page.

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

Optional. Dice.fm page URLs to scrape, for example https://dice.fm/venue/silent-green-dxmg, https://dice.fm/artist/helena-deland-3eg8, https://dice.fm/promoters/puschen-el92 or a single event URL. Venue, artist and promoter pages return all their upcoming events. Date and price filters apply to city searches only.

## `daysAhead` (type: `integer`):

How many days from today to cover for city searches. Ignored if you set an end date below. Use this for scheduled runs so the window rolls forward automatically.

## `dateFrom` (type: `string`):

First day to collect events for (city searches). Leave empty to start today, in the city's local time.

## `dateTo` (type: `string`):

Last day to collect events for (city searches). Leave empty to use 'Days ahead'.

## `minPrice` (type: `integer`):

Only events whose cheapest ticket costs at least this much, in the city's local currency. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Only events whose cheapest ticket costs at most this much, in the city's local currency. Leave empty for no maximum.

## `includeDetails` (type: `boolean`):

Open each event's page to add the full lineup, promoter, categories (gig, DJ, club night...), door time, description and price range. Turn off for a faster, lighter run with listing fields only (name, dates, venue, price, status).

## `onlyNewOrChanged` (type: `boolean`):

Remembers what earlier runs of the same search returned and saves only events that are new or whose status (e.g. sold out), price, dates or venue changed. Unchanged events are skipped and not charged. Ideal for scheduled runs.

## `maxItems` (type: `integer`):

Stop after saving this many events. You are only charged for events actually saved.

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

Apify datacenter proxy is enough for Dice and is the default. Residential proxy is not needed.

## Actor input object example

```json
{
  "cities": [
    "London"
  ],
  "daysAhead": 30,
  "includeDetails": true,
  "onlyNewOrChanged": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All saved events: name, dates, venue, lineup, prices and sold-out status.

## `changes` (type: `string`):

New or changed events and what changed. Filled when 'Only new or changed events' is on.

## `summary` (type: `string`):

Counts for this run: results, new and changed events, requests, failures.

# 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 = {
    "cities": [
        "London"
    ],
    "daysAhead": 30,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape_juanmuller/dice-fm-events-scraper").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 = {
    "cities": ["London"],
    "daysAhead": 30,
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape_juanmuller/dice-fm-events-scraper").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 '{
  "cities": [
    "London"
  ],
  "daysAhead": 30,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call steadyscrape_juanmuller/dice-fm-events-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape_juanmuller/dice-fm-events-scraper"
        }
    }
}
```

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/2D6BKy54blbkUumsE/builds/MDaoefdOqfsToznEy/openapi.json
