# Eventbrite Scraper (`tortuga/eventbrite-scraper`) Actor

Scrape Eventbrite events from any city, category, search or organizer page: title, dates, venue, address, price range, organizer, tags, images and ticket URL.

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

## Pricing

from $3.00 / 1,000 event scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# 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
}
```

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

# 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/), category 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 (eventbrite.co.uk, .ca, .com.au, .de, .fr, .es, …) work the same way. Listing pages are paginated automatically. Optional if you fill in Location below.

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

## `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/"
    }
  ],
  "dateRange": "all",
  "maxItems": 100,
  "includeDetails": 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/H0zP3M7ju1PCCHJZd/openapi.json
