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

Scrape public Eventbrite events by location, keyword, category, date, and price. Export event schedules, venue coordinates, ticket prices, and organizer profiles to JSON or CSV.

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

## Pricing

$12.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

## Eventbrite Scraper

Scrape Eventbrite events by city, keyword, category, date, and ticket price, then export Eventbrite event data to JSON, CSV, or Excel. This Eventbrite API alternative collects public event listings together with schedules, venues, ticket ranges, and organizer details in a consistent dataset.

Each result represents one unique event ID. The scraper follows search pages to their public event pages so the output includes fields that a search card alone does not show, such as the organizer name, the full description, ticket prices, age restriction, and refund policy. A separate organizer profile option adds public website and social links when those appear on the organizer's profile.

### What data can you extract from Eventbrite?

The dataset has stable, flat column names. Local times are paired with a timezone, while UTC timestamps are supplied when the public event page contains them. Numeric ticket prices use the event's currency and are not converted. Fields that do not apply to an event, or are absent from a public page, contain null.

| Field | Description | Example from the verification run |
| --- | --- | --- |
| eventId | Stable Eventbrite event ID | 1999889744060 |
| eventUrl | Public event page URL | https://www.eventbrite.es/e/oldskool-rb-day-party-90s-2000s… |
| name | Event title | Oldskool R\&B Day Party: 90s & 2000s R\&B & Future Beats / Ho… |
| summary | Short event summary | Barcelona's 90s and 2000s R\&B experience. Oldskool R\&B take… |
| description | Public event description as plain text | Your room's not ready but the terrace is. Oldskool R\&B chec… |
| startDate | Local start date, YYYY-MM-DD | 2026-09-26 |
| startTime | Local start time, HH:MM | 18:00 |
| startDateTime | Local start date and time | 2026-09-26T18:00:00 |
| startUtc | UTC start timestamp | 2026-09-26T16:00:00Z |
| endDate | Local end date, YYYY-MM-DD | 2026-09-26 |
| endTime | Local end time, HH:MM | 22:00 |
| endDateTime | Local end date and time | 2026-09-26T22:00:00 |
| endUtc | UTC end timestamp | 2026-09-26T20:00:00Z |
| timezone | IANA event timezone | Europe/Madrid |
| publishedAt | Event publication or creation timestamp | 2026-09-06T05:21:34Z |
| eventStatus | Event status | live |
| salesStatus | Ticket sales status | on_sale |
| isCancelled | Whether the event is cancelled | False |
| isOnline | Whether the event is online | False |
| isFree | Whether the event is free | False |
| currency | Ticket price currency code | EUR |
| minPrice | Lowest listed ticket price in currency units | 11.3 |
| maxPrice | Highest listed ticket price in currency units | 20.15 |
| ticketsUrl | Ticket checkout URL | https://www.eventbrite.com/checkout-external |
| category | Event category | Music |
| subcategory | Event subcategory | R\&B |
| format | Event format | Party |
| tags | Public event tag names | R\&B, Music… |
| imageUrl | Cover image URL | https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.com%2Fimages%… |
| venueName | Venue name | ME Barcelona |
| venueAddress | Display address of venue | Carrer de Casp #1-13, 08010 Barcelona |
| venueCity | Venue city | Barcelona |
| venueRegion | Venue state or region | CT |
| venuePostalCode | Venue postal code | 08010 |
| venueCountry | Venue country code | ES |
| latitude | Venue latitude | 41.389132 |
| longitude | Venue longitude | 2.170098 |
| organizerId | Stable organizer ID | 68062222693 |
| organizerName | Public organizer name | Oldskool rnb Bcn |
| organizerUrl | Public organizer profile URL | https://www.eventbrite.es/o/oldskool-rnb-bcn-68062222693 |
| organizerWebsite | Organizer website from optional profile enrichment | null |
| organizerFacebook | Facebook URL from optional profile enrichment | null |
| organizerInstagram | Instagram URL from optional profile enrichment | null |
| organizerLinkedin | LinkedIn URL from optional profile enrichment | null |
| organizerX | X profile URL from optional profile enrichment | null |
| organizerFollowers | Displayed follower count from optional profile enrichment | null |
| organizerEvents | Organizer event count shown on event page | 51 |
| organizerVerified | Whether organizer has a verified badge | True |
| organizerSuperOrganizer | Whether organizer has a super organizer badge | True |
| ageRestriction | Published age restriction | 18+ |
| refundPolicy | Published refund policy type | no_refunds |

### How to scrape Eventbrite

1. Enter a country and city. For example, use spain and barcelona, or united-states and new-york. If a location resolves incorrectly, copy the location slug from an Eventbrite discovery URL into locationSlug.
2. Add a keyword or category if you want a narrower search. A category retains only events with that category tag. You can combine a keyword with a category to search for a phrase and then retain the selected category.
3. Set an optional date range and price filter. Date ranges need both startDate and endDate. Leave both blank for upcoming search results. Set maxItems to the number of unique events you need.
4. Run the actor and inspect the Events table. Export the default dataset as JSON, CSV, or Excel. Repeat the same input later to monitor changes by eventId.

### Input

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| country | String | spain | Country slug used to construct a discovery location. |
| city | String | barcelona | City name used with country. Common United States cities receive their state abbreviation automatically. |
| locationSlug | String | Empty | Exact discovery location slug, such as ny--new-york. Overrides country and city. |
| keyword | String | Empty | Search phrase. When blank, category becomes the search term; when both are blank, all-events is used. |
| category | String | Empty | Event category. Only records with the corresponding category tag are returned. |
| price | String | Empty | free or paid; blank accepts both. The filter uses the event page classification. |
| startDate | Date string | Empty | First event date, in YYYY-MM-DD format. Requires endDate. |
| endDate | Date string | Empty | Last event date, in YYYY-MM-DD format. Requires startDate. |
| maxItems | Integer | 100 | Maximum number of unique results. Zero requests all results available within the scanned window. |
| enrichOrganizers | Boolean | false | Visit each unique public organizer profile once for website, social links, and displayed follower count. |
| proxyConfiguration | Object | Automatic | Proxy setting used for public pages; access limits trigger a change of proxy route. |

A practical input for a Barcelona music feed:

```json
{
  "country": "spain",
  "city": "barcelona",
  "category": "music",
  "maxItems": 30,
  "enrichOrganizers": false
}
```

If you need events from a fixed period, provide both dates. For example, startDate 2026-10-01 and endDate 2026-10-31 select an October search window. The site applies this date range to the search results. Date ranges can be useful for scheduled exports because each run can cover a known time window and downstream records can be updated by eventId.

The category list follows the site's public category tags. If you supply both keyword and category, the search phrase controls discovery and the category then filters each returned listing. A very narrow phrase can therefore return fewer results than maxItems. Price filtering is checked against each event page, which means some search results may be visited and then excluded before a matching result is written.

### Output example

This trimmed item comes from a successful 30-event Barcelona music run on 26 September 2026. It preserves the actual values of the shown fields; omitted fields remain available in the dataset.

```json
{
  "eventId": "1999889744060",
  "eventUrl": "https://www.eventbrite.es/e/oldskool-rb-day-party-90s-2000s-rb-future-beats-hotel-me-barcelona-tickets-1999889744060",
  "name": "Oldskool R&B Day Party: 90s & 2000s R&B & Future Beats | Hotel ME Barcelona",
  "summary": "Barcelona's 90s and 2000s R&B experience. Oldskool R&B takes over Hotel ME for The Check In 03 with classics and future beats, back to back.",
  "startDateTime": "2026-09-26T18:00:00",
  "startUtc": "2026-09-26T16:00:00Z",
  "endDateTime": "2026-09-26T22:00:00",
  "timezone": "Europe/Madrid",
  "isOnline": false,
  "isFree": false,
  "currency": "EUR",
  "minPrice": 11.3,
  "maxPrice": 20.15,
  "category": "Music",
  "subcategory": "R&B",
  "format": "Party",
  "venueName": "ME Barcelona",
  "venueAddress": "Carrer de Casp #1-13, 08010 Barcelona",
  "venueCity": "Barcelona",
  "venueCountry": "ES",
  "latitude": 41.389132,
  "longitude": 2.170098,
  "organizerId": "68062222693",
  "organizerName": "Oldskool rnb Bcn",
  "organizerUrl": "https://www.eventbrite.es/o/oldskool-rnb-bcn-68062222693",
  "organizerEvents": 51,
  "organizerVerified": true,
  "ageRestriction": "18+",
  "refundPolicy": "no_refunds"
}
```

The sample is a paid, in-person music event. Its local start is 18:00 in Europe/Madrid; the separate UTC field records the corresponding instant. The venue coordinates are numbers, ready for mapping. The event page supplies the organizer identity even though that identity is often absent from the search card. Social fields are null because the example did not request organizer profile enrichment.

### Use cases

- **Event calendars:** Collect upcoming public events for a city or topic, then show title, date, venue, ticket range, image, and event URL in a calendar or directory. Use eventId to prevent duplicate cards when an event appears in more than one search.
- **Organizer research:** Build a list of event hosts in a selected market. Group rows by organizerId, count their listed events, and review their public profile pages. Profile enrichment can add a public website and social links when present.
- **Venue research:** Compare which venues host particular formats or categories. venueName, city, address, and coordinates make it possible to group events by neighborhood or place, subject to differences in how event hosts enter venue names.
- **Ticket analysis:** Examine public minimum and maximum ticket prices by category, city, and date. Compare only rows with the same currency, and treat zero-price tickets within paid events carefully.
- **Event monitoring:** Schedule the same search each day, store rows by eventId, and compare new, changed, and removed events. Keep a recent date window for late announcements and a wider periodic run for backfills.
- **Editorial planning:** Find public events that match a keyword and date range, then inspect summaries, descriptions, age restrictions, and refund policies before selecting items for a newsletter or local guide.

### How much does it cost to scrape Eventbrite?

The configured result price is **$12 per 1,000 events**, or **$0.012 per dataset item**. The event charge applies to results actually written, up to maxItems or the run's budget limit. Search cards that are examined and discarded by category or price filters do not become dataset items. Platform usage is included in this result price.

| Results written | Result charge |
| ---: | ---: |
| 30 | $0.36 |
| 100 | $1.20 |
| 500 | $6.00 |
| 1,000 | $12.00 |

These examples assume the run produces the stated number of items. An exact search, a small city, a short date range, or a strict free/paid filter may produce fewer. The optional organizer profile setting does not create additional event rows; the per-item result price is unchanged. It can take longer because each distinct organizer profile must be loaded once during the run.

### Tips for best results

**Use the exact location when possible.** Eventbrite has discovery slugs for cities and broader regions. A similar place name may resolve to the wrong area. Copy the slug from a working discovery URL into locationSlug if a country and city combination does not represent the desired place. The output's venueCity and venueCountry columns offer a quick check of the returned area.

**Choose a focused search.** A keyword, category, or short date range increases the share of relevant events in the pages scanned. The actor deduplicates event IDs across pages and date slices, so the output does not contain duplicate event records from overlapping searches.

**Pair the date fields.** The site accepts a from/to range. Supplying only one boundary is rejected so the results cannot silently cover a different period than intended. For very large requests, the actor searches consecutive seven-day windows to reach records beyond a single query's page cap.

**Understand event prices.** minPrice and maxPrice come from public ticket offer data and can be empty when there is no public offer. isFree follows the event page's own flag. A zero minimum does not always mean every ticket is free. Currency is included, and prices from different currencies should be analyzed separately.

**Use organizer enrichment when needed.** Normal event extraction already includes organizerId, organizerName, organizerUrl, event count, and badge indicators when the event page provides them. Turn on enrichOrganizers when public websites, social URLs, or follower counts matter. Profile pages do not always publish every social link; null means it was not available in that public profile.

### Limits

Search pages expose 20 results at a time and report at most 49 pages for a query. For requests above roughly 900 items, the actor divides the requested period into seven-day windows and deduplicates event IDs. Even a single seven-day window can contain more matches than the site exposes; those excess matches cannot be guaranteed. The site controls result ordering, indexing, event visibility, and which ticket details appear publicly.

Each returned event normally requires a separate public event page to fill the organizer, price, and description columns. If that page is temporarily unavailable, the listing can still be returned with those detail fields null. The verification run returned 30 items with organizerName present on 28 and isFree present on all 30. Online events may lack venue addresses and coordinates by design.

The location built from a country and city is a convenience. For cities with ambiguous names or an unsupported United States city abbreviation, set locationSlug to the exact value from the site's discovery URL. Only publicly listed events and organizer pages are read. Events behind sign-in, private invitations, or restricted ticket pages are outside the scope of this actor.

Search filters can reduce the output below maxItems. A category must appear in the listing's public category tag, and price is checked after opening the event page. The actor does not fabricate a missing field or infer organizer contact information from a name. Descriptions and prices reflect the public page at collection time; organizers can edit them later.

### Automated use

A scheduled workflow can request a particular city and week, load the resulting dataset, and update records keyed by eventId. For example: “Collect up to 100 music events in Barcelona for the first week of October, then group them by venue.” Another request could be: “Find paid business events in New York, retain each organizerId, and compare newly published events with yesterday's export.”

Keep date windows and identifiers in the saved configuration so that repeated runs are comparable. If your workflow stores results in a database, use an upsert keyed by eventId. If you only append rows, the same future event will be duplicated on every scheduled run. An organizer table can be maintained separately with organizerId as its key.

### FAQ

#### Do I need an account on the event site?

No account is required for the public search and event pages used here. Sign-in-only and private events are not included. Public organizer profiles can be read when enrichOrganizers is enabled.

#### Can I collect free events only?

Yes. Set price to free. The actor checks the event page's isFree value before writing a row. An event that offers a free ticket alongside paid tickets may still be classified as paid by the site, so examine minPrice and maxPrice if that distinction matters to your analysis.

#### Can I search by both keyword and category?

Yes. The keyword drives the search phrase and the category checks each listing's public category tag. This makes the category filter exact, but a narrow keyword can leave fewer matching results than your maximum.

#### Why are some organizer or venue fields empty?

Public pages vary. An online event has no physical venue; some event pages omit organizer details, public offers, or policy information. The actor writes null for missing values so exports keep the same columns. Organizer websites and social links require the optional profile setting and remain null if the profile does not publish them.

#### How fast is a run?

Time depends on the number of events, page response times, access challenges, and whether organizer profiles are requested. The 30-item verification run completed in about two minutes, including its initial access negotiation. Larger runs require more event page requests; strict price filters can also increase the number of pages visited per result.

#### Can I schedule it or export to a spreadsheet?

Yes. The dataset can be exported as JSON, CSV, or Excel and used by a scheduled workflow. Use eventId to update existing rows in a spreadsheet or database. A recurring search for the same future dates will often return many of the same events.

#### Is collecting these records allowed?

The actor reads public event and organizer information only. Review the site's terms and applicable privacy rules for your use case, respect event organizers' rights, and avoid misuse of personal information. It does not access private events or attempt to obtain nonpublic contact details.

### Integrations

The default dataset can be read through an API, downloaded, or sent onward through webhooks and scheduled workflows. JSON suits databases and applications; CSV and Excel suit spreadsheet review. Use stable event and organizer IDs to join successive exports, and use the local schedule plus timezone when displaying event times.

### Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.

# Actor input Schema

## `country` (type: `string`):

Country slug, such as spain or united-states. Used with city unless locationSlug is set.

## `city` (type: `string`):

City name, such as Barcelona. Major US cities use their state prefix automatically.

## `locationSlug` (type: `string`):

Optional Eventbrite location slug, such as ny--new-york or spain--barcelona; overrides country and city.

## `keyword` (type: `string`):

Search events matching this phrase. Leave blank for all events or to use category as the search term.

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

Keep only events tagged with this category. The category is also used as the search term when keyword is blank.

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

Keep only free or paid events, based on the public event detail. Blank includes both.

## `startDate` (type: `string`):

First event date in YYYY-MM-DD format. Set together with endDate.

## `endDate` (type: `string`):

Last event date in YYYY-MM-DD format. Set together with startDate.

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

Hard cap on unique events. Set 0 for available results in the selected date window.

## `enrichOrganizers` (type: `boolean`):

Visit each unique public organizer profile once for website, social links, and follower count.

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

Proxy configuration. The actor starts with datacenter and escalates on access limits.

## Actor input object example

```json
{
  "country": "spain",
  "city": "barcelona",
  "locationSlug": "",
  "keyword": "",
  "category": "",
  "price": "",
  "maxItems": 100,
  "enrichOrganizers": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Public event records in the default dataset.

# 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 = {
    "country": "spain",
    "city": "barcelona"
};

// Run the Actor and wait for it to finish
const run = await client.actor("mlg14/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 = {
    "country": "spain",
    "city": "barcelona",
}

# Run the Actor and wait for it to finish
run = client.actor("mlg14/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 '{
  "country": "spain",
  "city": "barcelona"
}' |
apify call mlg14/eventbrite-scraper --silent --output-dataset

```

## MCP server setup

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