# Eventbrite Scraper: Events & Organizers (`tortuga/eventbrite-scraper`) Actor

Eventbrite events from any city, category, search, organizer or event URL: title, start and end time, venue address and coordinates, online flag, price range, organizer and followers, category and tags, images and ticket URL. Add full descriptions and ticket classes. JSON, CSV or Excel.

- **URL**: https://apify.com/tortuga/eventbrite-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Lead generation, Travel
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 events

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Eventbrite Scraper

Scrape Eventbrite events from any city, category, search, date or organizer page, or from single event URLs: name, start and end date with timezone, venue with full address and coordinates, price range and currency, free/paid flag, organizer, category, subcategory, format, tags, image, ticket URL, sales status and series information. Optionally open every event page for the full description, ticket classes with prices and fees, refund policy, age restriction, duration, capacity and organizer statistics.

Works on eventbrite.com and all country domains (eventbrite.co.uk, .ca, .com.au, .de, .fr, .es, .ie, .nl, .it, .pt, .com.br, .com.mx, .sg, .hk, .co.nz, ...). Plain HTTP with browser TLS fingerprinting, no headless browser, no login. Every page carries a server-rendered data blob, so the scraper reads structured JSON instead of fragile CSS selectors. You pay only for the events you get.

### What data does Eventbrite Scraper extract?

Every event from a discovery, search, category, browse or organizer page:

| Field | Description |
|---|---|
| `id` | Eventbrite event ID (the number at the end of the URL) |
| `name` | Event title |
| `url` | Clean event URL (tracking parameters removed) |
| `summary` | Short description shown on the card |
| `startDate`, `endDate` | Local start/end as ISO 8601 with UTC offset, e.g. `2026-10-30T21:00:00-05:00` |
| `timezone` | IANA timezone of the event, e.g. `America/Chicago` |
| `isOnline` | `true` for virtual events (then `venue` is `null`) |
| `venue` | `{ id, name, address, street, city, region, postalCode, country, latitude, longitude }` |
| `isFree` | `true` when every ticket is free |
| `priceMin`, `priceMax` | Lowest and highest ticket price as numbers (0 when a free tier exists), `null` if not exposed |
| `currency` | ISO code of the prices (`USD`, `GBP`, `EUR`, `AUD`, ...) |
| `organizer` | `{ id, name, url }` |
| `organizerFollowers` | Follower count of the organizer profile |
| `category`, `subcategory`, `format` | Eventbrite taxonomy, e.g. `Music` / `DJ/Dance` / `Party or Social Gathering` |
| `tags` | Organizer-set tags |
| `imageUrl` | Main image (original size) |
| `ticketUrl` | Direct checkout URL |
| `status` | `live`, `sold_out`, `cancelled`, `ended`, `not_yet_on_sale` or `unavailable` |
| `salesStatus`, `isSoldOut`, `isCancelled` | Raw sales status and flags behind `status` |
| `isSeries`, `seriesId`, `seriesUrl`, `seriesUpcomingCount`, `seriesNextDates` | Recurring-event info: parent series and the next occurrences with their IDs and UTC times |
| `language`, `publishedAt` | Listing language and publication time |
| `sourceUrl`, `scrapedAt` | Start URL that produced the item and the run timestamp |

With **Include event details** on, each item also gets:

| Field | Description |
|---|---|
| `descriptionHtml`, `descriptionText` | Full event description as HTML and as plain text |
| `images` | All images (cover gallery plus description images) |
| `ticketClasses` | List of `{ id, name, description, price, fee, tax, currency, isFree, isDonation, salesStatus, salesStart, salesEnd, minQuantity, maxQuantity, capacity, category, hidden }` |
| `ticketPriceMin`, `ticketPriceMax` | Price range computed from the ticket classes |
| `capacity` | Event capacity when the organizer shows it (otherwise `null`) |
| `refundPolicy`, `refundPolicyText` | `{ type, isRefundAllowed, validDays }` and a readable sentence such as "Refunds up to 7 days before the event" |
| `ageRestriction`, `doorTime`, `parking`, `durationMinutes`, `locationType` | "Good to know" highlights |
| `salesStatus`, `salesStart`, `salesEnd`, `availability` | Sales window |
| `organizerDescription`, `organizerVerified`, `organizerEventCount`, `organizerTotalAttendees`, `organizerHostingYears` | Organizer profile statistics as shown on the event page |
| `startDateUtc`, `endDateUtc`, `createdAt`, `durationSeconds` | Exact UTC times and event metadata |
| `collections`, `performers`, `videoUrls` | Organizer collections the event belongs to, headliners, embedded videos |
| `isSeriesParent`, `hasExternalTickets`, `hasReservedSeating`, `inventoryType` | Event flags |
| `schemaEventType`, `schemaEventStatus` | schema.org type (`SocialEvent`, `BusinessEvent`, ...) and status (`EventScheduled`, `EventCancelled`, ...) |

### How to use Eventbrite Scraper

1. Paste one or more Eventbrite URLs into **Start URLs**, or fill in **Location** (plus optional **Category**, **Keywords** and **Date range**) and let the scraper build the search for you.
2. Set **Max events** to cap the run and the cost. Discovery pages hold 20 events each and are followed automatically.
3. Switch on **Include event details** if you need descriptions, ticket classes or refund policies.
4. Click **Start**. Results appear in the **Dataset** tab; export as JSON, CSV or Excel, or read them through the API.

Supported start URLs:

- City / category pages: `https://www.eventbrite.com/d/il--chicago/music--events/`, `https://www.eventbrite.co.uk/d/united-kingdom--london/business--events/`
- Date pages: `https://www.eventbrite.com/d/ny--new-york/events--this-weekend/`, `.../d/online/events--today/`
- Search pages: `https://www.eventbrite.com/d/ca--los-angeles/all-events/?q=comedy`
- Free / paid filters: `https://www.eventbrite.com/d/online/free--events/`
- Category browse pages: `https://www.eventbrite.com.au/b/australia--sydney/food-and-drink/`
- Organizer pages: `https://www.eventbrite.com/o/nasa-30164999184` (all upcoming events of the organizer)
- Single events: `https://www.eventbrite.com/e/...-tickets-1234567890123` (always returned with details)

### Input example

```json
{
  "startUrls": [
    { "url": "https://www.eventbrite.com/d/il--chicago/music--events/" },
    { "url": "https://www.eventbrite.com/o/nasa-30164999184" }
  ],
  "location": "united-kingdom--london",
  "category": "business",
  "keywords": "startup",
  "dateRange": "this-month",
  "maxItems": 200,
  "includeDetails": false
}
```

### Output example

```json
{
  "id": "1992292634902",
  "name": "Midnite City: Indie Disco [Chicago]",
  "url": "https://www.eventbrite.com/e/midnite-city-indie-disco-chicago-tickets-1992292634902",
  "summary": "Midnight City returns to Chicago",
  "startDate": "2026-09-19T21:00:00-05:00",
  "endDate": "2026-09-20T02:00:00-05:00",
  "timezone": "America/Chicago",
  "isOnline": false,
  "venue": {
    "id": "50171316",
    "name": "Subterranean",
    "address": "2011 W. North Ave., Chicago, IL 60647",
    "street": "2011 W. North Ave.",
    "city": "Chicago",
    "region": "IL",
    "postalCode": "60647",
    "country": "US",
    "latitude": 41.910409,
    "longitude": -87.677996
  },
  "isFree": false,
  "priceMin": 14.53,
  "priceMax": 20.98,
  "currency": "USD",
  "organizer": { "id": "18677495634", "name": "ORLOVE", "url": "https://www.eventbrite.com/o/orlove-18677495634" },
  "organizerFollowers": 29601,
  "category": "Music",
  "subcategory": null,
  "format": "Concert or Performance",
  "tags": ["Chicago", "Disco", "Indie", "Rave", "Danceparty"],
  "imageUrl": "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.com%2Fimages%2F1187322893%2F290918113901%2F1%2Foriginal.20260620-172929?auto=format%2Ccompress&q=75&sharp=10&s=67c17149d4de242e589d8fcf77cbc5b0",
  "ticketUrl": "https://www.eventbrite.com/checkout-external?eid=1992292634902",
  "status": "live",
  "salesStatus": "on_sale",
  "isSoldOut": false,
  "isCancelled": false,
  "isSeries": false,
  "publishedAt": "2026-06-20T17:31:40+00:00",
  "sourceUrl": "https://www.eventbrite.com/d/il--chicago/music--events/",
  "scrapedAt": "2026-09-07T22:24:21+00:00"
}
```

With details on, the same item additionally carries for example:

```json
{
  "descriptionText": "Midnight City returns to Chicago for one night of indie anthems ...",
  "ticketClasses": [
    { "name": "Early Bird", "price": 12.0, "fee": 2.53, "currency": "USD", "isFree": false, "salesStatus": "SOLD_OUT" },
    { "name": "General Admission", "price": 18.0, "fee": 2.98, "currency": "USD", "isFree": false, "salesStatus": "AVAILABLE" }
  ],
  "refundPolicyText": "No refunds",
  "ageRestriction": "Ages 21+",
  "durationMinutes": 300,
  "capacity": null,
  "organizerEventCount": 412,
  "organizerTotalAttendees": 96210,
  "organizerHostingYears": 6
}
```

### Monitor changes on a schedule

Turn on **Only new or changed items** to watch a city, category or organizer: each run remembers what earlier runs returned and outputs only events that are new or whose date and time, status (sold out, cancelled, sales ended, not yet on sale), ticket price range or venue changed. Unchanged events are dropped before any event page is opened, so they are not charged. **Max items** then sets how many events are checked per run, so set it high enough to cover the whole search (e.g. 100 for Chicago music this weekend). Save the input as a task and add a Schedule in Apify (for example daily); give each watch its own **Monitoring key** if several schedules use the same search. Every output item has `changeType` (`new` or `changed`), and changed items have `previousValues` with the old values, e.g. `{"status": "live"}` for an event that has just sold out or `{"priceMin": 25}` after a price change.

### How much does it cost?

Pay per result: a small price per event from a listing page, plus a small extra per event when **Include event details** is on (one event page and one ticket-class lookup each). No subscription; Apify's free plan is enough to try it. Scraping 1,000 events with details costs a few dollars.

### How do I scrape all events in a city?

Use the city discovery URL (`https://www.eventbrite.com/d/<state>--<city>/all-events/`) or set **Location** to the city slug and raise **Max events**. Eventbrite serves at most 49 pages (about 1,000 events) per search, so for big cities split the run by category (`music--events`, `business--events`, ...) or by **Date range** (`this-week`, `next-week`, `this-month`, ...) and use several start URLs. Duplicates across start URLs are removed automatically.

### Can I scrape events by organizer?

Yes. Give the organizer profile URL (`https://www.eventbrite.com/o/<name>-<id>`) as a start URL. The scraper returns all upcoming events of that organizer, following the profile's "show more" pagination, and fills in prices and sales status for each of them.

### Does it return ticket prices?

Yes. Every listing item has `priceMin`, `priceMax`, `currency` and `isFree` taken from the same data Eventbrite shows on its cards. With **Include event details** you also get every ticket class with its own price, fee, tax and sales status (`AVAILABLE`, `SOLD_OUT`, `NOT_YET_ON_SALE`, ...). Prices are in the event's own currency; Eventbrite does not convert them.

### Does it work for online events and country domains?

Yes. `https://www.eventbrite.com/d/online/...` pages return virtual events with `isOnline: true`. Every country domain (eventbrite.co.uk, .ca, .com.au, .de, .fr, .es, ...) shares the same page structure; event URLs keep the domain of their organizer, and prices come in the local currency.

### Does it need a login or a browser?

No. All data comes from public, server-rendered pages and the public JSON endpoints those pages use. There is no headless browser, which keeps runs fast (about 20 events per second on listing pages) and cheap.

### Legal and data notes

The scraper collects only public, non-personal event information: event details, venues, organizer business profiles and ticket prices as published on Eventbrite. It does not collect attendee data, private or password-protected events, or anything behind a login. Respect Eventbrite's terms of service and the applicable laws in your jurisdiction when using the data.

### Related scrapers

- [Viator Scraper](https://apify.com/tortuga/viator-scraper): Tours, Prices, Ratings & Reviews
- [GetYourGuide Scraper](https://apify.com/tortuga/getyourguide-scraper): Tours, Prices & Ratings
- [Klook Scraper](https://apify.com/tortuga/klook-scraper): Activities, Prices & Reviews
- [Tripadvisor Scraper](https://apify.com/tortuga/tripadvisor-scraper): Reviews, Hotels, Restaurants, Attractions
- [OpenTable Scraper](https://apify.com/tortuga/opentable-scraper): Restaurants, Availability & Reviews

### Found it useful?

A ★ review on this Actor's Apify Store page helps other users find it and tells us what to improve. Issues and feature requests are welcome in the Actor's **Issues** tab.

# Actor input Schema

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

Eventbrite pages to scrape: discovery/category pages (https://www.eventbrite.com/d/il--chicago/music--events/), search pages (…/d/ny--new-york/all-events/?q=jazz), date pages (…/d/online/events--this-weekend/), browse pages (…/b/ca--los-angeles/food-and-drink/), organizer pages (https://www.eventbrite.com/o/nasa-30164999184) and single event pages (…/e/…-tickets-1234567890). Country domains (.co.uk, .ca, .de, …) work too. Listing pages paginate automatically. Optional if you fill in Location.

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

Build a discovery page from a location slug instead of (or in addition to) Start URLs. Use the slug Eventbrite shows in its URLs: 'il--chicago', 'ny--new-york', 'united-kingdom--london', 'canada--toronto', 'australia--sydney', 'germany--berlin', or 'online' for virtual events.

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

Only used together with Location. Eventbrite category slug: music, business, food-and-drink, arts, film-and-media, health, sports-and-fitness, science-and-tech, travel-and-outdoor, charity-and-causes, community, family-and-education, holiday, home-and-lifestyle, auto-boat-and-air, hobbies, school-activities, spirituality, government, fashion, other. Also accepts 'free' or 'paid'. Leave empty for all categories.

## `keywords` (type: `string`):

Only used together with Location. Free-text search, e.g. 'jazz', 'startup networking', 'yoga'.

## `dateRange` (type: `string`):

Restrict results to a period. Applies to the Location search and to any Start URL that is a '<category>--events' discovery page without its own date segment.

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

Stop after this many events in total (across all start URLs). Keeps cost predictable. Discovery pages hold 20 events each; Eventbrite serves at most about 1,000 events per search, so split big cities by category or date to get more.

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

Also open every event page (plus its ticket endpoint) to get the full description (HTML and text), ticket classes with prices, fees and sales status, refund policy, age restriction, door time, duration, capacity where the organizer shows it, organizer stats (events hosted, attendees, years) and all images. Slower and charged extra per event (see pricing).

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

Remember what earlier runs of this search returned and output only new events or events whose date, status (sold out, cancelled, sales ended), ticket price or venue changed. Use with a Schedule; unchanged events are not charged. With this on, Max items is the number of events checked per run, so set it to cover the whole search.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

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

Eventbrite blocks datacenter IPs, so residential Apify Proxy is the default. Proxy usage is billed to your account.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.eventbrite.com/d/il--chicago/music--events/"
    }
  ],
  "location": "",
  "category": "",
  "keywords": "",
  "dateRange": "all",
  "maxItems": 100,
  "includeDetails": false,
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.eventbrite.com/d/il--chicago/music--events/"
        }
    ],
    "location": "",
    "category": "",
    "keywords": "",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/eventbrite-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 = {
    "startUrls": [{ "url": "https://www.eventbrite.com/d/il--chicago/music--events/" }],
    "location": "",
    "category": "",
    "keywords": "",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/eventbrite-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 '{
  "startUrls": [
    {
      "url": "https://www.eventbrite.com/d/il--chicago/music--events/"
    }
  ],
  "location": "",
  "category": "",
  "keywords": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call tortuga/eventbrite-scraper --silent --output-dataset

```

## MCP server setup

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