# Resident Advisor Scraper (`normdata/resident-advisor-scraper`) Actor

Scrape Resident Advisor (ra.co) events in any city, country or worldwide, past or upcoming: lineup, artists, venue, GPS, tickets, prices, attendance, promoters, socials. Or get artists with booking emails, venues and promoters. Filter by genre, date, price, keyword.

- **URL**: https://apify.com/normdata/resident-advisor-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Categories:** Lead generation, Automation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.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.
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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🎧 Resident Advisor Scraper

Extract events from **Resident Advisor (ra.co)** in any city, country or the whole world, upcoming or years back, or from any club, promoter or artist. Each event comes with local and UTC times, the full **lineup with every artist's Instagram, SoundCloud, Facebook, X, Bandcamp and Discogs**, venue with address, GPS, phone, website and capacity, **every ticket tier with price and sale status**, people attending, genres, flyers, promoters with their socials, and the description. Filter by genre, keyword, date, price, tickets on sale, attendance, festivals and RA Picks. Or switch the output to **artists (with booking emails)**, **venues** or **promoters**.

### 🎯 Who uses it?

#### 🎤 Booking agents, labels and managers

Find the artists playing your scene with their booking contact, bio, followers and socials, and see who books which clubs.

#### 🍾 Promoters, clubs and festivals

Map every competing night in your city and dates, ticket prices and how fast they sell out, and who is headlining where.

#### 🗓️ Event apps, newsletters and city guides

Fill "what's on this weekend" pages with fresh nights, flyers, lineups, prices and ticket links.

#### 📊 Music industry analysts

Track genres, cities, ticket prices and attendance over time with years of archive.

### ✨ What it does

- **Any place.** A city ("Berlin"), "City, Country", a country ("Germany"), **Worldwide**, or "latitude, longitude". Several in one run.
- **Your radius.** Search 10 km or 200 km around a city or point instead of its Resident Advisor area.
- **Any link.** Clubs (ra.co/clubs/…), promoters, artists (ra.co/dj/…), city pages (ra.co/events/de/berlin) or single events. Turn on **Past events** for a club's, promoter's or artist's history.
- **Past and future.** Set a start date in the past to read the archive: every night in Amsterdam in June 2024, for example.
- **Filters:** 70 genres (Techno, House, Drum & Bass, Amapiano...), keywords over title, lineup, artists, venue and promoters, date range (exact or "+30 days"), free or paid, min and max price, tickets on sale now, min people attending, festivals only or no festivals, RA Picks only.
- **Four outputs.** Events, or one row per **artist** (booking email, booking details, bio, home city, followers, socials), **venue** (address, phone, website, capacity, events this year) or **promoter** (website and socials), each with the events found and their next one.

### 🏆 Why this scraper

- **Fast.** 1,000 events in about 12 seconds, 2,000 worldwide in about 20.
- **Complete.** Resident Advisor stops listing after 10,000 results per search; this Actor splits big searches into shorter date ranges, so a whole country or the whole world comes back in full, multi-day events once.
- **Lead-ready.** Artist booking emails, venue phones and websites, promoter and artist socials as clean links (broken links and tracking tails removed).
- **Clean data.** Times in local and UTC, ISO country codes, prices as numbers with currency, ticket tiers with sale status, HTML turned into plain text.
- **No proxy needed.** Nothing extra to set up or pay for.

### ⚖️ How it compares

Based on each Actor's public input options (October 2026).

| Capability | This actor | crawlerbros | logiover | whatsup | scrapesage | bovi | parsebird |
|---|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| Search by city | **yes** | yes | yes | yes | yes | yes | yes |
| Several places in one run | **yes** | no | yes | yes | yes | no | no |
| Worldwide in one run | **yes** | no | no | no | no | no | no |
| Radius or "latitude, longitude" | **yes** | no | no | no | no | no | no |
| Club, promoter and artist links | **all three** | artist, venue | no | no | all three | no | artist, venue |
| Date range | **yes** | yes | yes | yes | yes | yes | yes |
| Genre filter | **70 genres** | no | no | no | yes | no | no |
| Keyword filter | **yes** | no | no | no | yes | no | no |
| Free / paid, min and max price | **yes** | no | no | no | no | no | no |
| Tickets on sale only | **yes** | no | no | no | no | no | no |
| Min people attending | **yes** | no | no | no | no | no | no |
| Festivals only / no festivals | **both** | no | no | no | only | no | no |
| RA Picks only | **yes** | no | no | no | no | no | no |
| Artist / venue / promoter rows | **all three** | artist, venue | no | no | all three | no | artist, venue |

### 📦 What data you get

| Field | Description |
| --- | --- |
| `eventId`, `title`, `url` | Resident Advisor ID, title and event page. |
| `startLocal`, `endLocal`, `timezone` | Start and end in the event's local time ("2026-10-04 23:00") and its time zone. |
| `startAt`, `endAt` | Start and end in UTC. |
| `isFestival`, `isTicketed`, `minimumAge` | Festival or club night, tickets sold on Resident Advisor, age limit. |
| `attending`, `interested` | People attending on Resident Advisor. |
| `cost`, `isFree`, `price`, `maxPrice`, `currency` | The price as listed ("£10-£25"), and the cheapest and dearest ticket as numbers. |
| `onSale`, `soldOut`, `tickets` | Whether tickets are on sale or sold out, and each tier: `name`, `price`, `bookingFee`, `currency`, `status` (`on_sale`, `sold_out`, `not_on_sale_yet`, `off_sale`), `onSaleFrom`, `onSaleUntil`. |
| `genres`, `lineup` | Genres and the full lineup as text. |
| `artists` | `artistId`, `name`, `url`, `countryCode`, `followers`, `instagram`, `soundcloud`, `facebook`, `twitter`, `website`, `bandcamp`, `discogs` of each artist. |
| `venueId`, `venueName`, `venueUrl`, `address`, `city`, `country`, `countryCode`, `latitude`, `longitude` | Where it happens (empty for secret venues). |
| `venuePhone`, `venueWebsite`, `venueCapacity`, `venueFollowers`, `secretVenue` | Venue contacts and size. |
| `promoters` | `promoterId`, `name`, `url`, `followers`, `website`, `instagram`, `facebook`, `twitter`, `soundcloud`, `youtube`, `tiktok`, `bandcamp` of each promoter. |
| `flyer`, `flyerBack`, `raPick`, `description` | Flyer images, the RA Pick blurb, and the full description. |
| `datePosted`, `dateUpdated` | When the listing was posted and last changed. |
| `searchLocation` | Which of your places or links found it. |
| `scrapedAt` | When the row was collected (UTC). |

With **Artists** output, each row is an artist: `artistId`, `name`, `url`, `bookingEmail`, `emails`, `bookingDetails`, `bio`, `countryCode`, `country`, `residentCountry`, `homeArea`, `aliases`, `followers`, `upcomingEvents`, `website`, `instagram`, `facebook`, `twitter`, `soundcloud`, `bandcamp`, `discogs`, `image`, `eventsFound`, `venuesFound`, `citiesFound`, `genres`, `nextEventTitle`, `nextEventAt`, `nextEventUrl`, `searchLocation`, `scrapedAt`.

With **Venues** output: `venueId`, `name`, `url`, `address`, `city`, `country`, `countryCode`, `latitude`, `longitude`, `phone`, `website`, `capacity`, `followers`, `eventsThisYear`, `isClosed`, `description`, `photo`, `eventsFound`, `totalAttending`, `genres`, `nextEventTitle`, `nextEventAt`, `nextEventUrl`, `searchLocation`, `scrapedAt`.

With **Promoters** output: `promoterId`, `name`, `url`, `city`, `country`, `countryCode`, `isFestival`, `website`, `instagram`, `facebook`, `twitter`, `soundcloud`, `youtube`, `tiktok`, `followers`, `upcomingEvents`, `description`, `logo`, `eventsFound`, `totalAttending`, `venuesFound`, `genres`, `nextEventTitle`, `nextEventAt`, `nextEventUrl`, `searchLocation`, `scrapedAt`.

An `error` field only appears on an artist, venue or promoter row whose profile didn't load; the rest of the row is still filled from its events.

#### Example row (trimmed)

```json
{
  "eventId": "2495803",
  "title": "Cue Drops: Colin Dale Interview + 5hr Club Set with guests",
  "url": "https://ra.co/events/2495803",
  "startLocal": "2026-10-04 14:00",
  "endLocal": "2026-10-04 22:00",
  "timezone": "Europe/London",
  "startAt": "2026-10-04T13:00:00.000Z",
  "endAt": "2026-10-04T21:00:00.000Z",
  "isFestival": false,
  "isTicketed": true,
  "minimumAge": 18,
  "attending": 97,
  "interested": 97,
  "cost": "£20.00",
  "isFree": false,
  "price": 10,
  "maxPrice": 17.5,
  "currency": "GBP",
  "onSale": true,
  "soldOut": false,
  "tickets": [
    { "name": "1st release", "price": 15, "bookingFee": 0, "currency": "GBP", "status": "sold_out", "onSaleFrom": "2026-08-03T20:30:00.000Z", "onSaleUntil": "2026-10-04T21:00:00.000Z" },
    { "name": "2nd release", "price": 17.5, "bookingFee": 0, "currency": "GBP", "status": "on_sale", "onSaleFrom": "2026-08-03T20:30:00.000Z", "onSaleUntil": "2026-10-04T21:00:00.000Z" }
  ],
  "genres": ["House", "Tech House"],
  "lineup": "KABBAGE\nColin Dale\nHEAVEN-LEE\nDerrick Patterson",
  "artists": [
    { "artistId": "17715", "name": "Colin Dale", "url": "https://ra.co/dj/colindale", "countryCode": "GB", "followers": 365, "instagram": "https://www.instagram.com/colindale", "soundcloud": "https://www.soundcloud.com/djcolindale", "facebook": "https://www.facebook.com/djcolin.dale", "twitter": null, "website": null, "bandcamp": null, "discogs": "https://www.discogs.com/artist/Colin%20Dale" }
  ],
  "venueId": "163913",
  "venueName": "The Ministry",
  "venueUrl": "https://ra.co/clubs/163913",
  "address": "79-81 Borough Rd, London SE1 1DN",
  "city": "London",
  "country": "United Kingdom",
  "countryCode": "GB",
  "latitude": 51.498994,
  "longitude": -0.098054,
  "venuePhone": "020 3968 2400",
  "venueWebsite": "https://theministry.com/?src=MAPS",
  "venueCapacity": null,
  "venueFollowers": 6,
  "secretVenue": false,
  "promoters": [
    { "promoterId": "172152", "name": "KABBAGE", "url": "https://ra.co/promoters/172152", "followers": 0, "website": null, "instagram": "https://instagram.com/kabbagemix", "facebook": null, "twitter": null, "soundcloud": "https://soundcloud.com/kabmix", "youtube": null, "tiktok": null, "bandcamp": null }
  ],
  "flyer": "https://images.ra.co/80b0a4aaa139e3cc556b6356e3dd7d028763f993.jpg",
  "flyerBack": null,
  "raPick": null,
  "description": "Cue Drops lands at The Ministry with UK dance music pioneer COLIN DALE sharing the music and stories that have defined his DJ journey so far ...",
  "datePosted": "2026-08-09T10:45:13.080Z",
  "dateUpdated": "2026-10-03T13:14:02.183Z",
  "searchLocation": "London, United Kingdom",
  "scrapedAt": "2026-10-04T05:05:04.499Z"
}
```

An artist row (trimmed):

```json
{
  "artistId": "35624",
  "name": "East End Dubs",
  "url": "https://ra.co/dj/eastenddubs",
  "bookingEmail": "luke@nge-booking.com",
  "emails": ["luke@nge-booking.com", "tim@eastenderz.com"],
  "bookingDetails": "Worldwide\nLuke Passmore\nluke@nge-booking.com\n\nManagement\ntim@eastenderz.com",
  "countryCode": "GB",
  "residentCountry": "United Kingdom",
  "homeArea": "London",
  "followers": 17457,
  "upcomingEvents": 14,
  "website": "http://www.eastenddubs.co.uk",
  "instagram": "https://www.instagram.com/eastenddubs",
  "soundcloud": "https://www.soundcloud.com/eastenddubs",
  "discogs": "https://www.discogs.com/artist/3039433-East-End-Dubs",
  "eventsFound": 1,
  "nextEventAt": "2026-10-04 16:00",
  "nextEventUrl": "https://ra.co/events/2544057"
}
```

### 💡 Use cases

#### 📇 Booking contacts of every artist playing Berlin this month

```json
{ "locations": ["Berlin"], "output": "artists", "dateTo": "+30 days", "maxItems": null }
```

#### 🌍 Every techno festival worldwide with tickets on sale

```json
{ "locations": ["Worldwide"], "genres": ["techno"], "festivals": "only", "onSaleOnly": true, "maxItems": null }
```

#### 🗂️ A club's whole history

```json
{ "urls": ["https://ra.co/clubs/5031"], "includePast": true, "maxItems": null }
```

#### 📈 Every night in Amsterdam in summer 2024

```json
{ "locations": ["Amsterdam"], "dateFrom": "2024-06-01", "dateTo": "2024-08-31", "maxItems": null }
```

#### 🎟️ Cheap, busy nights in London this weekend

```json
{ "locations": ["London"], "dateTo": "+3 days", "maxPrice": 15, "minAttending": 100 }
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum results** and **Output** | Always first: caps the whole run, and picks events, artists, venues or promoters. Empty maximum means no limit. |
| **Where** | Places, radius, Resident Advisor links, and past events of clubs, promoters and artists. |
| **Filters** | Genres, keywords, dates, price, tickets on sale, attendance, festivals, RA Picks. |

Genre values are Resident Advisor's slugs: `techno`, `house`, `deephouse`, `techhouse`, `drumandbass`, `amapiano`, `afrohouse`, `disco`, `electro`, `ambient`, `trance`, `hardcore` and 58 more, all listed in the **Genres** picker.

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per result (event, artist, venue or promoter) saved to your dataset. The price depends on your Apify plan tier:

| Your Apify plan | Price per result |
| --- | --- |
| Free | $0.013 |
| Bronze | $0.012 |
| Silver | $0.011 |
| Gold / Platinum / Diamond | $0.010 |

Approximate total cost:

| Results collected | Free | Bronze | Silver | Gold+ |
| --- | --- | --- | --- | --- |
| 100 | $1.30 | $1.20 | $1.10 | $1.00 |
| 1,000 | $13.00 | $12.00 | $11.00 | $10.00 |
| 10,000 | $130.00 | $120.00 | $110.00 | $100.00 |

No proxy costs. New Apify accounts start with $5 in free credit. On the Free plan a run saves up to 10 results.

**Speed:** 1,000 events in about 12 seconds. Artist, venue and promoter profiles add a few seconds per hundred.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Resident Advisor Scraper.
3. Type a place (or keep the prefilled one), or paste Resident Advisor links, add filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (`run-sync-get-dataset-items`) or the ApifyClient for JavaScript and Python, and schedule it with Apify's built-in Scheduler to catch new events every day.

### 🤖 Use with AI agents (MCP)

Give an AI agent live access to Resident Advisor events through the Model Context Protocol:

```
claude mcp add --transport http apify "https://mcp.apify.com?tools=normdata/resident-advisor-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### 🔧 Troubleshooting

**A place was skipped.**
Add the country ("Valencia, Spain"), or type "latitude, longitude".

**A city gives nearby towns too.**
Resident Advisor groups some cities into regions. Set a **Radius** to search a circle around the city instead.

**Some events have no venue or address.**
The venue is secret or still to be announced (`secretVenue` is `true`). City and country are always there.

**Some artists have no booking email.**
Only artists who publish booking details on Resident Advisor have one; you still get their socials and website.

**A club, promoter or artist link was skipped.**
Check the link: the page may have been renamed or removed.

### ❓ FAQ

| Question | Answer |
| --- | --- |
| Do I need a Resident Advisor account? | No. Only public data is read. |
| Does it need a proxy? | No. |
| Can I get past events? | Yes. Set a start date in the past for any place, or turn on **Past events** for club, promoter and artist links. |
| Can I get artist emails? | Yes, when the artist publishes booking details: pick **Artists** output and read `bookingEmail` and `emails`. |
| Can I scrape a whole country or the world? | Yes. Type the country name or "Worldwide", and leave the maximum empty for every event. |
| Can I track new events and sell-outs? | Yes. Schedule the same input daily with Apify's Scheduler and compare `tickets` between runs. |

### 🛡️ Limits & responsible use

This Actor reads only public data from Resident Advisor. It never signs in and never buys tickets. Artist and promoter contacts can be personal data: handle them in line with privacy law in your country (GDPR, CAN-SPAM...), and use the data in line with Resident Advisor's terms.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

### 🧪 Local development

```powershell
bun install
bun run typecheck
bun test/qa.mjs
apify run
```

Local results are stored in `storage/datasets/default`.

# Actor input Schema

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

Stop after this many events (or artists, venues, promoters). Leave empty for no limit (everything that matches). The Apify Free plan is always capped at 10.

## `output` (type: `string`):

One row per event, or one row per artist (booking email, bio, socials), venue (phone, website, capacity) or promoter (socials, website) found in those events.

## `locations` (type: `array`):

A city ("London", "Berlin"), "City, Country" ("Valencia, Spain"), a country ("Germany"), "Worldwide", or "latitude, longitude". Cities use Resident Advisor's own city areas.

## `radiusKm` (type: `integer`):

Search this far around each city or point instead of its Resident Advisor area. Points use 25 km when empty.

## `urls` (type: `array`):

Clubs (ra.co/clubs/5031), promoters (ra.co/promoters/123), artists (ra.co/dj/name), cities (ra.co/events/de/berlin) or single events (ra.co/events/1234567).

## `includePast` (type: `boolean`):

For club, promoter and artist links, also collect their past events, newest first. For places, set a start date in the past instead (the archive goes back years).

## `genres` (type: `array`):

Keep events tagged with any of these genres. Leave empty for all.

## `searchTerms` (type: `array`):

Keep events whose title, lineup, artists, venue or promoters mention any of these words, e.g. "Boiler Room", "Ben UFO". Whole words; plurals match too.

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

A date (2026-11-20) or a relative one ("-1 year" for past events). Leave empty for today.

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

A date (2026-12-31) or a relative one ("+30 days"). Events up to this day.

## `price` (type: `string`):

Free events, paid events, or both.

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

Cheapest ticket, in the event's own currency.

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

Cheapest ticket, in the event's own currency.

## `minAttending` (type: `integer`):

Skip events with fewer people marked as attending on Resident Advisor.

## `onSaleOnly` (type: `boolean`):

Keep events with at least one Resident Advisor ticket on sale right now.

## `festivals` (type: `string`):

Festivals, club nights, or both.

## `picksOnly` (type: `boolean`):

Keep events picked by Resident Advisor's editors.

## Actor input object example

```json
{
  "maxItems": 10,
  "locations": [
    "London"
  ]
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10,
    "locations": [
        "London"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/resident-advisor-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 = {
    "maxItems": 10,
    "locations": ["London"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/resident-advisor-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 '{
  "maxItems": 10,
  "locations": [
    "London"
  ]
}' |
apify call normdata/resident-advisor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/resident-advisor-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/KCtqwIZbi9hkgrqjB/builds/5WrtMiVhTbUFr3Rbj/openapi.json
