# Eventbrite Scraper: Events, Organizers & Change Monitor (`promur/eventbrite-scraper`) Actor

Get Eventbrite events from organizer, event or search links: dates, venues, ticket prices, sales status, categories and organizer profiles with website and social links. Monitor mode returns only new, rescheduled, re-priced, sold-out, cancelled and removed events. No API key.

- **URL**: https://apify.com/promur/eventbrite-scraper.md
- **Developed by:** [PROMUR s.r.o.](https://apify.com/promur) (community)
- **Security:** Limited permissions
- **Stats:** 2 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. 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: Events, Organizers & Change Monitor

Get **Eventbrite events** from **organizer pages, event links or search results** - dates and times (local and UTC), venues with addresses and coordinates, **real ticket price ranges**, sales status and sales dates, categories, and the **organizer's profile** with website, social links, followers and events hosted - in one clean format ready for Excel, Google Sheets, your CRM or an AI agent. Or switch on the **change monitor** and get only what changed since your last run: new events, rescheduled or moved events, price changes, sold out, cancelled, removed.

The Actor reads Eventbrite's public pages - organizer pages, search results and **each event's own page** - like a visitor would. No API key, no login, no browser.

### Why this Actor

**Price, quality, reliability, responsibility - in balance:**

- 💵 **Fair price** - $3 per 1,000 events, organizer profiles and descriptions included. Unchanged events in monitor mode cost nothing.
- 🔍 **Complete rows** - every event's own page is read: real ticket price range, availability, sales dates, true end time, category and the organizer's facts. Fields Eventbrite does not publish are `null`, never guessed.
- 🔁 **Dependable runs** - the same columns every time, a run report per line, and a clean stop at your budget; the monitor continues next run where it stopped.
- 🤝 **Responsible collection** - public event data only, no personal contact data; Eventbrite's robots.txt is respected and the Actor never works around a bot check, so your data comes from sources that are fine to use.

**What you get:**

- 🧑‍💼 **Organizer data included** - website, Facebook, Instagram, X, LinkedIn, followers, total events hosted, years on Eventbrite, verified badge and bio on every event, **at no extra charge**. Read once per organizer per run.
- 🎯 **Complete organizers** - every upcoming event of an organizer, all pages, not just the first 12 shown on the profile. The run report shows *events listed* vs *events Eventbrite reports*.
- 💲 **Ticket prices from the event page** - the lowest and highest ticket price in the event's currency (search results show no prices, so every event's page is read), free / sold-out flags, sales status (`on_sale`, `sold_out`, `sales_ended` ...) and sales start / end dates.
- 🔔 **Change monitor** - one switch turns the scraper into a monitor. Each event gets a `changeType` (`new`, `changed`, `cancelled`, `removed`) and a `changes` list with the old and new value (date, venue, price, sold out). Unchanged events are not saved and **cost nothing**.
- 🧭 **Organizer, event or search** - watch a list of organizers (e.g. competitors or venues), a watchlist of single events, or a city + category search with any Eventbrite filter.
- 🌍 **Every Eventbrite site** - eventbrite.com, .co.uk, .de, .fr, .es, .com.au, .ca and the rest.
- ⚡ **Live** - read at run time, not from a cached database.

### Use cases

- **Event lead generation** - organizers in a city and category with their websites and social links, ready for outreach.
- **Competitor and venue monitoring** - a daily feed of new events, date changes, price changes and cancellations from the organizers you follow.
- **Event aggregation** - listings for a city calendar, newsletter or app, kept fresh with the monitor.
- **Market research** - prices, categories, formats and sell-outs across a market.
- **Sold-out and new-event alerts** - send changes to Slack, e-mail or a sheet on a schedule.
- **AI agents and RAG** - structured event data via the Apify API or MCP server.

### How to use

1. Paste one or more links under **Organizer, event or search links** (see below).
2. Optional: turn on **Change monitor** and give the feed a name; pick which changes to report.
3. Click **Start**. Download the results as JSON, CSV or Excel, or connect them to your tools. For a monitor, schedule the Actor (Console → Schedules), e.g. daily.

### Input

One per line in **Organizer, event or search links**:

| You paste | Meaning |
| --- | --- |
| `https://www.eventbrite.com/o/outgeek-badass-pros-33011984549` | an organizer: all upcoming events |
| `https://www.eventbrite.com/e/...-tickets-1373316098419` | one event (a watchlist entry) |
| `https://www.eventbrite.com/d/ny--new-york/music--events/` | a search: city + category |
| `https://www.eventbrite.co.uk/d/united-kingdom--london/business--events--this-weekend/` | a search with a date filter |

**Search links:** open Eventbrite, search a city, pick a category, date, price or format filter, then copy the address bar. Eventbrite shows up to about 49 pages (~980 events) per search; for more, split the search by date or category into several links. The run report tells you when a search was larger than what Eventbrite shows.

**Change monitor** (`onlyChanges`) - save only events that are new or changed since the previous run with the same **Feed name**. The first run saves every event as your baseline.

**Changes to report** (`watchChanges`) - `new`, `date`, `venue`, `price`, `availability` (sold out / back on sale), `cancelled`, `removed` (default: all). Removed events are detected for organizer and event lines.

**Organizer profile** (`includeOrganizerProfile`, default on) - website, social links, followers, events hosted, bio. Free.

**Full event description** (`includeDescription`) - the description text from the event page that is read anyway; free.

**Max events per line** (`maxEventsPerInput`) - 0 = no limit.

```json
{
    "urls": [
        "https://www.eventbrite.com/o/outgeek-badass-pros-33011984549",
        "https://www.eventbrite.com/d/ny--new-york/business--events/"
    ],
    "onlyChanges": true,
    "watchChanges": ["new", "date", "cancelled"],
    "feedName": "nyc-business-daily"
}
```

### Output

One row per event:

`eventId`, `name`, `url`, `summary`, `description`, `category`, `subcategory`, `format`, `organizerTags`, `startLocal`, `endLocal`, `timezone`, `startUtc`, `endUtc`, `status`, `isCancelled`, `isOnline`, `language`, `publishedAt`, `createdAt`, `venueName`, `venueAddress`, `venueStreet`, `venueCity`, `venueRegion`, `venuePostalCode`, `venueCountry`, `latitude`, `longitude`, `venueId`, `isFree`, `priceMin`, `priceMax`, `currency`, `isSoldOut`, `hasAvailableTickets`, `salesStatus`, `salesStart`, `salesEnd`, `urgency`, `ticketsBy`, `ticketsUrl`, `seriesId`, `additionalSessions`, `imageUrl`, `organizerId`, `organizerName`, `organizerUrl`, `organizerWebsite`, `organizerFacebook`, `organizerInstagram`, `organizerX`, `organizerLinkedin`, `organizerSocials`, `organizerFollowers`, `organizerTotalEvents`, `organizerHostingYears`, `organizerAttendeesHosted`, `organizerVerified`, `organizerBio`, `changeType`, `changes`, `source`, `input`, `scrapedAt`.

| Field | Meaning |
| --- | --- |
| `startLocal` / `endLocal` | date and time at the event's place (`timezone`); `startUtc` / `endUtc` the same moment in UTC |
| `priceMin` / `priceMax` | lowest and highest ticket price in `currency` |
| `salesStatus` | `on_sale`, `sold_out`, `sales_ended`, `not_yet_on_sale` ... as Eventbrite reports it |
| `urgency` | Eventbrite's own signals, e.g. `fewTickets`, `goingFast` |
| `additionalSessions` | for a recurring event: how many more dates the organizer lists (e.g. `9+`) |
| `organizerFollowers` | followers on Eventbrite (e.g. 7.1k becomes 7100) |
| `changeType` | monitor mode: `new`, `changed`, `cancelled`, `removed` |
| `changes` | monitor mode: `field` (`startLocal`, `endLocal`, `venue`, `priceMin`, `priceMax`, `currency`, `isSoldOut`, `salesStatus`, `isCancelled`), `old`, `new` |
| `source` / `input` | `organizer`, `event` or `search`, and the line you pasted |

The dataset has two views: **Events** and **Organizers** (organizer contact columns first, for lead lists).

**Run report:** every run saves a `SUMMARY` record (Storage → Key-value store) with one entry per line: kind, status, organizer, events Eventbrite reports, events listed, events saved, counts of new / changed / cancelled / removed events, and a plain-English message.

### Pricing

**$3.00 per 1,000 events saved** - you pay only for results. Event pages, organizer profiles and full descriptions are included at no extra charge.

- An organizer with 40 upcoming events: **$0.12**, organizer data included.
- A city + category search with 500 events: **$1.50**.
- A daily monitor over 30 organizers with ~20 changes a day: about **$0.06 a day**.

Set *Maximum cost per run* in the run options: the Actor saves events up to that amount and stops cleanly; in monitor mode the next run continues where it stopped. An event found by two lines in the same run is saved and charged once.

### Integrations

Schedule runs (Console → Schedules) and send results to Google Sheets, Slack, Airtable, Make, Zapier, n8n, a webhook or your database with Apify integrations. Call it from code with the Apify API, or from AI agents through the Apify MCP server.

### FAQ

**Does it get past events?** No - upcoming events. In monitor mode an event that ended simply leaves the list and is not reported as removed.

**Are e-mail addresses or phone numbers included?** No. The Actor returns the organizer's public Eventbrite profile: name, website, social links and statistics.

**Why is a field empty?** Eventbrite did not publish it for that event. Values are never guessed.

**Recurring events?** From an organizer or search link, a recurring event appears once with its next date (`seriesId` is set; `additionalSessions` shows how many more dates the organizer lists). From the recurring event's own link, `startLocal` / `endLocal` cover the whole series (first and last date).

**What do `blocked` and `robots_disallowed` mean in the run report?** `blocked`: Eventbrite refused automated access. `robots_disallowed`: the link points to a page Eventbrite's robots.txt asks automated tools not to read (some filter combinations do) - pick the filters again or use another link. We do not work around either, so nothing is silently missing.

**Why does a large search take a few minutes?** Each event's own page is read for its prices and dates - about 4 pages at a time, politely.

### Support

Found a link that does not work, or need a field? Open an issue on the **Issues** tab with the input line and the run link - we usually fix it fast.

# Actor input Schema

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

One per line, any Eventbrite country site (.com, .co.uk, .de, .com.au ...):<br>• <code>https://www.eventbrite.com/o/\<name>-\<id></code> - an organizer: all upcoming events<br>• <code>https://www.eventbrite.com/e/\<name>-tickets-\<id></code> - one event (build a watchlist from event links)<br>• <code>https://www.eventbrite.com/d/\<place>/\<category or keyword>/</code> - a search: open Eventbrite, search a city, pick a category, date or price filter, and paste the address bar link

## `maxEventsPerInput` (type: `integer`):

Maximum events saved per organizer, event or search line. 0 = no limit (an organizer's every upcoming event; a search up to Eventbrite's ~49 pages).

## `onlyChanges` (type: `boolean`):

Return only events that are new, rescheduled, moved to another venue, re-priced, sold out (or back on sale), cancelled or removed since your previous run with the same feed name. Unchanged events are skipped and cost nothing. The first run returns every event (your baseline). Ideal for daily schedules.

## `watchChanges` (type: `array`):

Which changes are saved in monitor mode. Example: pick only <i>New events</i> for a new-event alert per organizer or per search. Removed events are detected for organizer and event lines.

## `includeOrganizerProfile` (type: `boolean`):

Adds the organizer's website, social links (Facebook, Instagram, X, LinkedIn ...), followers, total events hosted, years on Eventbrite, verified badge and bio to every event. Read once per organizer per run. No extra charge.

## `includeDescription` (type: `boolean`):

Adds the full event description text to every event. It comes from the event page the Actor reads anyway, so it costs no extra time or money; leave it off for smaller rows.

## `feedName` (type: `string`):

Keeps separate memories for separate monitors. Runs with the same feed name compare against each other. Stored in your own account (key-value store <code>eventbrite-scraper-state</code>).

## Actor input object example

```json
{
  "urls": [
    "https://www.eventbrite.com/o/outgeek-badass-pros-33011984549",
    "https://www.eventbrite.com/d/ny--new-york/music--events/"
  ],
  "maxEventsPerInput": 100,
  "onlyChanges": false,
  "watchChanges": [
    "new",
    "date",
    "venue",
    "price",
    "availability",
    "cancelled",
    "removed"
  ],
  "includeOrganizerProfile": true,
  "includeDescription": false,
  "feedName": "default"
}
```

# Actor output Schema

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

One row per event: eventId, name, url, summary, description, category, subcategory, format, organizerTags, startLocal, endLocal, timezone, startUtc, endUtc, status, isCancelled, isOnline, language, publishedAt, createdAt, venueName, venueAddress, venueStreet, venueCity, venueRegion, venuePostalCode, venueCountry, latitude, longitude, venueId, isFree, priceMin, priceMax, currency, isSoldOut, hasAvailableTickets, salesStatus, salesStart, salesEnd, urgency, ticketsBy, ticketsUrl, seriesId, additionalSessions, imageUrl, organizerId, organizerName, organizerUrl, organizerWebsite, organizerFacebook, organizerInstagram, organizerX, organizerLinkedin, organizerSocials, organizerFollowers, organizerTotalEvents, organizerHostingYears, organizerAttendeesHosted, organizerVerified, organizerBio, changeType, changes, source, input, scrapedAt.

## `summary` (type: `string`):

One entry per input line: kind (organizer, event, search), status (ok, not_found, blocked, invalid, error, duplicate, skipped), organizer, events Eventbrite reports, events listed, events saved, new / changed / cancelled / removed counts, and a plain-English message.

# 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 = {
    "urls": [
        "https://www.eventbrite.com/o/outgeek-badass-pros-33011984549",
        "https://www.eventbrite.com/d/ny--new-york/music--events/"
    ],
    "maxEventsPerInput": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("promur/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 = {
    "urls": [
        "https://www.eventbrite.com/o/outgeek-badass-pros-33011984549",
        "https://www.eventbrite.com/d/ny--new-york/music--events/",
    ],
    "maxEventsPerInput": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("promur/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 '{
  "urls": [
    "https://www.eventbrite.com/o/outgeek-badass-pros-33011984549",
    "https://www.eventbrite.com/d/ny--new-york/music--events/"
  ],
  "maxEventsPerInput": 100
}' |
apify call promur/eventbrite-scraper --silent --output-dataset

```

## MCP server setup

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