# Skiddle Scraper (`mrdoe/skiddle-scraper`) Actor

- **URL**: https://apify.com/mrdoe/skiddle-scraper.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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

Scrape UK club nights, gigs, festivals, comedy, and live events from **Skiddle** - browse events by city and pull full event details including venue, dates, lineup, and ticket pricing.

### What it does

This Actor turns Skiddle's city event listings into structured, exportable data. Give it a UK city and it returns the events happening there - club nights, gigs, festivals, comedy, theatre, and more - with dates, venue, and pricing. Give it a specific event URL and it returns the full picture: complete description, opening times, lineup, genres, and per-ticket-type pricing and availability.

Two operations, one Actor:

- **Search events by city** - browse what's on in a UK city, optionally narrowed to one category (clubs, gigs, festivals, comedy, theatre, experiences, or dating).
- **Get event details** - fetch the complete record for one or more specific event pages, including fields the city listing doesn't carry (full description, doors/opening times, genres, and per-ticket-type pricing).

### Why use it

- Build a UK nightlife, festival, or gig calendar for a site, app, or newsletter
- Track ticket pricing and availability for club nights and festivals you care about
- Monitor lineup announcements and venue changes for an upcoming event
- Feed structured event data into a research, marketing, or aggregation pipeline

### What makes this different

Skiddle is a leading UK platform for club nights, festivals, and live music discovery - a nightlife and festival calendar that general ticketing platforms don't cover as deeply. This Actor is purpose-built around that: a city-based `search` that mirrors how people actually browse Skiddle (by city and category, not just keyword), and an `eventDetails` operation that pulls the doors/opening times, genre tags, and per-ticket-type pricing that matter most for planning a night out - not just a listing snippet.

### Data returned

| Category | Fields                                                                          |
| -------- | ------------------------------------------------------------------------------- |
| Event    | Name, category, start/end date, doors open/close, minimum age, description      |
| Venue    | Name, address, city, postcode, venue type, coordinates                          |
| Lineup   | Performer / artist names and profile links, genre tags                          |
| Tickets  | Minimum/maximum price, currency, per-ticket-type breakdown, availability status |
| Media    | Cover image                                                                     |
| Metadata | Event ID, direct URL, city, category, scrape timestamp                          |

### How to use

1. [Sign up](https://apify.com/sign-up) for a free Apify account.
2. Open this Actor and click **Try for free** (or **Start**).
3. Choose an **Operation**:
   - **Search events by city** - enter a **City** (e.g. `London`, `Manchester`, `Birmingham`) and optionally an **Event category**.
   - **Get event details** - enter one or more **Event URLs** copied from Skiddle or from this Actor's own search results.
4. Set **Max events per search** if you want fewer than the default 20 (search only - event details always returns one row per URL).
5. Click **Start** and export results as JSON, CSV, Excel, or via the API once the run finishes.

### Input

| Field                | Type    | Required | Default                   | Description                                                                                                                                                           |
| -------------------- | ------- | -------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `operation`          | string  | Yes      | `search`                  | `search` or `eventDetails`.                                                                                                                                           |
| `location`           | string  | No       | `London`                  | UK city to browse, used by the `search` operation. Use the spelling Skiddle itself uses (e.g. `Newcastle-on-Tyne`).                                                   |
| `category`           | string  | No       | `all`                     | `all`, `clubs`, `gigs`, `festivals`, `comedy`, `theatre`, `experiences`, or `dating`. `all` mixes every category.                                                     |
| `eventUrl`           | string  | No       | -                         | A single Skiddle event page URL, used by the `eventDetails` operation.                                                                                                |
| `eventUrls`          | array   | No       | -                         | Multiple event page URLs in one run. Overrides `eventUrl` when provided.                                                                                              |
| `maxItems`           | integer | No       | `20`                      | Maximum events per search. `0` = unlimited (every event on that city/category's listing page). Not applied to `eventDetails` - every requested URL is always fetched. |
| `proxyConfiguration` | object  | Yes      | Apify Proxy (Residential) | Individual event pages run bot-detection that a Residential proxy clears far more reliably than datacenter IPs.                                                       |

### Output

Every dataset item shares the same shape, whichever operation produced it (`_operation` tells them apart). Fields that don't apply to a given operation, or that a specific event page doesn't publish, are returned as `null` rather than guessed.

| Field                                                                  | Description                                                                           |
| ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| `_operation`                                                           | `"search"` or `"eventDetails"`                                                        |
| `status`                                                               | `"ok"` or `"error"` for this row                                                      |
| `errorMessage`                                                         | Set only when `status` is `"error"`                                                   |
| `eventId`                                                              | Skiddle's own numeric event ID                                                        |
| `name`                                                                 | Event name                                                                            |
| `description`, `fullDescription`                                       | Short blurb, and the full write-up (`eventDetails` only)                              |
| `url`, `ticketUrl`                                                     | Direct link to the event page                                                         |
| `image`, `largeImage`                                                  | Cover image URLs                                                                      |
| `startDate`, `endDate`                                                 | Event date/time range                                                                 |
| `displayDate`, `displayTime`                                           | Human-readable date/time as shown on the event page (`eventDetails` only)             |
| `doorsOpen`, `doorsClose`                                              | Venue opening times                                                                   |
| `minAge`                                                               | Minimum age for entry, when published                                                 |
| `eventType`                                                            | Category code (e.g. `CLUB`, `LIVE`, `COMEDY`, `FEST`)                                 |
| `genres`                                                               | Music/event genre tags (`eventDetails` only)                                          |
| `venueName`, `venueAddress`, `venueTown`, `venuePostcode`, `venueType` | Venue details                                                                         |
| `venueLatitude`, `venueLongitude`                                      | Venue coordinates                                                                     |
| `ticketsAvailable`, `ticketStatus`                                     | Whether tickets are on sale, and the current status label                             |
| `priceMin`, `priceMax`, `currency`                                     | Ticket price range                                                                    |
| `ticketTypes`                                                          | Per-ticket-type breakdown (name, price, currency, availability) (`eventDetails` only) |
| `performers`                                                           | Array of `{ name, url }` for the announced lineup                                     |
| `location`                                                             | City the event belongs to                                                             |
| `category`                                                             | The category filter used (`search` only)                                              |
| `scrapedAt`                                                            | ISO timestamp of when the item was scraped                                            |

#### Example item (search)

```json
{
    "_operation": "search",
    "status": "ok",
    "eventId": "42482664",
    "name": "Clockwork Orange - Here at Outernet - London",
    "description": "Saturday 19th September - Here at Outernet - tickets on sale NOW",
    "fullDescription": null,
    "url": "https://www.skiddle.com/whats-on/London/Outernet-Live/Clockwork-Orange---Here-at-Outernet---London/42482664/",
    "ticketUrl": "https://www.skiddle.com/whats-on/London/Outernet-Live/Clockwork-Orange---Here-at-Outernet---London/42482664/",
    "image": "https://d31fr2pwly4c4s.cloudfront.net/7/f/8/2278998_80889490_Clockwork-Orange---Here-at-Outernet---London_th.jpg",
    "largeImage": "https://d31fr2pwly4c4s.cloudfront.net/7/f/8/2278998_80889490_Clockwork-Orange---Here-at-Outernet---London.jpg",
    "startDate": "2026-09-19T13:00:00+00:00",
    "endDate": "2026-09-19T21:00:00+00:00",
    "displayDate": null,
    "displayTime": null,
    "doorsOpen": "13:00",
    "doorsClose": "21:00",
    "minAge": "18",
    "eventType": "CLUB",
    "genres": null,
    "venueName": "Outernet Live",
    "venueAddress": "Charing Cross Road London, WC2H",
    "venueTown": "London",
    "venuePostcode": "WC2H 8LH",
    "venueType": "Nightclub",
    "venueLatitude": 51.5157394,
    "venueLongitude": -0.129184,
    "ticketsAvailable": true,
    "ticketStatus": "Buy Tickets",
    "priceMin": 37.5,
    "priceMax": 37.5,
    "currency": "GBP",
    "ticketTypes": null,
    "performers": [
        { "name": "Rob Tissera", "url": null },
        { "name": "David Penn", "url": null }
    ],
    "location": "London",
    "category": "clubs",
    "scrapedAt": "2026-09-15T03:09:59.251Z",
    "errorMessage": null
}
```

#### Example item (event details)

```json
{
    "_operation": "eventDetails",
    "status": "ok",
    "eventId": "42482664",
    "name": "Clockwork Orange - Here at Outernet - London",
    "description": "Saturday 19th September - Here at Outernet - tickets on sale NOW",
    "fullDescription": "Eight hours. One room. No filler. Clockwork Orange rolls back into Outernet London for a daytime-into-dusk session...",
    "url": "https://www.skiddle.com/whats-on/London/Outernet-Live/Clockwork-Orange---Here-at-Outernet---London/42482664/",
    "ticketUrl": "https://www.skiddle.com/whats-on/London/Outernet-Live/Clockwork-Orange---Here-at-Outernet---London/42482664/",
    "image": "https://d31fr2pwly4c4s.cloudfront.net/7/f/8/2278998_80889490_Clockwork-Orange---Here-at-Outernet---London_th.jpg",
    "largeImage": "https://d31fr2pwly4c4s.cloudfront.net/7/f/8/2278998_80889490_Clockwork-Orange---Here-at-Outernet---London_1024.jpg",
    "startDate": "2026-09-19T13:00:00",
    "endDate": "2026-09-19T21:00:00",
    "displayDate": "Saturday 19th September 2026",
    "displayTime": "1:00pm til 9:00pm",
    "doorsOpen": "13:00",
    "doorsClose": "21:00",
    "minAge": "18",
    "eventType": "CLUB",
    "genres": ["House"],
    "venueName": "Outernet Live",
    "venueAddress": "Charing Cross Road London, WC2H",
    "venueTown": "London",
    "venuePostcode": "WC2H 8LH",
    "venueType": "Nightclub",
    "venueLatitude": 51.5157394,
    "venueLongitude": -0.129184,
    "ticketsAvailable": true,
    "ticketStatus": "Buy Tickets",
    "priceMin": 37.5,
    "priceMax": 37.5,
    "currency": "GBP",
    "ticketTypes": [{ "name": "General Admission", "price": 37.5, "currency": "GBP", "availability": "InStock" }],
    "performers": [
        { "name": "Rob Tissera", "url": "https://www.skiddle.com/artists/Rob-Tissera-123457208" },
        { "name": "David Penn", "url": "https://www.skiddle.com/artists/David-Penn-123462473" }
    ],
    "location": "London",
    "category": null,
    "scrapedAt": "2026-09-15T03:11:04.436Z",
    "errorMessage": null
}
```

### Usage examples

**Build a city nightlife calendar:** run `search` on a city with `category: "all"` and a generous `maxItems`, then filter by `eventType` for the categories you want.

**Track a festival's lineup and pricing:** run `eventDetails` on the same `eventUrl` on a schedule and watch `performers` and `priceMin`/`priceMax` for changes as the lineup fills out and price tiers move.

**Enrich search results:** run `search` first, then feed the returned `url` values into an `eventDetails` run to get full description, genres, and per-ticket-type pricing for the events you care about.

### Known limitations

- Each `search` run returns the events on that city/category's own listing page in one request; it does not page deeper into the full live count Skiddle reports for very large cities/categories. Narrow by `category` (or by city) to get closer to full coverage of a niche.
- The dedicated "festivals" city page isn't consistently available on Skiddle itself, so festival events are surfaced via the mixed city listing filtered to festivals - still real, current festival listings, just sourced from the combined page.
- Not every event publishes every field (minimum age, genres, or a full ticket-type breakdown) - when Skiddle itself doesn't show a field, this Actor returns `null` rather than guessing.
- `eventDetails` pages run bot-detection; a Residential proxy (the default) is what makes runs reliable at scale, and an occasional retry happens automatically.

### FAQ

**Is this legal?** This Actor only collects publicly available event listing and event-page data. It is not affiliated with or endorsed by Skiddle. Please respect the site's Terms of Service and applicable data protection laws.

**Why does it need a residential proxy?** Individual Skiddle event pages run bot-detection that blocks most non-residential traffic. A residential proxy (enabled by default) is required for reliable results.

**Can I browse just one category, like festivals or club nights?** Yes - set `category` to `clubs`, `gigs`, `festivals`, `comedy`, `theatre`, `experiences`, or `dating`, or leave it as `all` to mix every category for the city.

**Will every event have pricing and a full lineup?** No. `priceMin`/`priceMax`/`ticketTypes`/`performers` reflect exactly what the event page publishes; some events (early announcements, TBA lineups) won't have every field filled in yet.

### Legal

Only publicly available data is collected - no login, paywall, or access-control circumvention is used. This Actor is not affiliated with, endorsed by, or connected to Skiddle. Users are responsible for ensuring their use of the collected data complies with Skiddle's Terms of Service and applicable law.

Found a bug or have a feature request? Use the Issues tab on this Actor's Apify Store page.

# Actor input Schema

## `operation` (type: `string`):

"search" browses live events in a city. "eventDetails" fetches full details for specific event URLs.

## `location` (type: `string`):

UK city to browse events in (used when operation is "search"). Use the same spelling Skiddle itself uses, e.g. "London", "Manchester", "Birmingham", "Newcastle-on-Tyne".

## `category` (type: `string`):

Which kind of events to browse. "All categories" mixes every category for the city in one run.

## `eventUrl` (type: `string`):

A single Skiddle event page URL to fetch full details for (used when operation is "eventDetails"). Copy this from the Skiddle site or from this Actor's own search results.

## `eventUrls` (type: `array`):

Optional list of Skiddle event page URLs to fetch full details for in one run. Overrides "Event URL" when provided.

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

Maximum number of events to return for the search. Set to 0 for unlimited (every event Skiddle currently lists for that city/category combination). Not applied to "Get event details" - every requested URL is always fetched.

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

Proxy settings for the run. Individual event pages run bot-detection that a Residential proxy clears far more reliably than datacenter IPs, so Residential is used by default.

## Actor input object example

```json
{
  "operation": "search",
  "location": "London",
  "category": "all",
  "eventUrls": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "operation": "search",
    "location": "London",
    "category": "all",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/skiddle-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 = {
    "operation": "search",
    "location": "London",
    "category": "all",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/skiddle-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 '{
  "operation": "search",
  "location": "London",
  "category": "all",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call mrdoe/skiddle-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/skiddle-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/Na4m44PcFLpTL8DPF/builds/vKFAqDfdFvdqGn1qH/openapi.json
