# Eventbrite Scraper · Organizer Leads, Websites & Events by City (`thequietstack/eventbrite-scraper`) Actor

Scrape Eventbrite events by city, category, keyword and date, or get one deduplicated lead row per organizer: website, socials, exact followers, upcoming/past events, ticket price range, phone/email only if printed in their public bio. No login.

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

## Pricing

from $10.00 / 1,000 organizer leads

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 · Organizer Leads, Websites & Events by City

Scrape Eventbrite by **city, category, keyword and date** and get either **one row per event** or **one deduplicated lead row per organizer**: their own website (kept apart from Facebook/Instagram/Linktree links), socials, **exact** follower count, upcoming and past event counts, how long they have been hosting, their ticket price range, and phone numbers or emails **only if the organizer printed them in their public Eventbrite bio**. No login, no API key, no email guessing.

Built for agencies and freelancers who sell to event organizers (web design, ticketing, marketing, venues, sponsors, catering, photography), for event aggregators, and for local market research.

### Why this scraper

- **One row per organizer, not per event.** A city search returns the same organizer many times (one Austin organizer had 13 of 200 business events). Other scrapers repeat the organizer on every event row; here you get one lead with `eventsInThisRun`, `upcomingEvents`, `pastEvents`, `nextEventDate` and the price range of their tickets.
- **"Has a website" means an own website.** Many organizers put a LinkedIn, Instagram, Gumroad or Linktree link into Eventbrite's *website* field. We classify it (`websiteFieldKind`: `own`, `social`, `linkInBio`, `eventPlatform`, `none`) and only count a real domain as `website`. Filter with `websiteFilter: "withWebsite"` or — if you sell websites — `"withoutWebsite"`.
- **Exact numbers where Eventbrite has them.** `followers` is the exact count from Eventbrite's own data (e.g. `12274`), while the page shows "12k" (kept separately as `followersShown`). Values Eventbrite only shows rounded (`attendeesHostedShown: "348k"`, `hostingYearsShown: "13 years"`) are labelled *Shown* so you know they are rounded.
- **You pay only for what passes your filters.** Online-only events, free/paid filter, follower range, minimum upcoming events and the website filter are applied **before** a row is written. Hard limits (`maxOrganizers`, `maxEvents`) stop the run cleanly.
- **Honest about the source.** Every search in the run summary shows how many events Eventbrite itself reports for it (`eventbriteTotal`) next to how many were read, so you see how much of a city you covered.

### Input example — organizer leads

```json
{
    "mode": "organizers",
    "locations": ["Austin, TX", "Miami, FL"],
    "categories": ["business", "food-and-drink"],
    "websiteFilter": "withWebsite",
    "maxFollowers": 5000,
    "maxEventsPerSearch": 200,
    "maxOrganizers": 300
}
```

### Input example — events

```json
{
    "mode": "events",
    "locations": ["Miami, FL"],
    "searchTerms": ["yoga"],
    "dateFrom": "2026-10-01",
    "dateTo": "2026-10-31",
    "priceFilter": "paid"
}
```

Locations: `"City, ST"` for the US, `"City, Country"` elsewhere, an Eventbrite slug like `tx--austin`, an `eventbrite.com/d/...` URL, or `online`.
Categories: `business`, `food-and-drink`, `health`, `music`, `arts`, `science-and-tech`, `sports-and-fitness`, `community`, `hobbies`, `family-and-education`, `charity-and-causes`, `home-and-lifestyle`, `film-and-media`, `fashion`, `travel-and-outdoor`, `spirituality`, `government`, `auto-boat-and-air`, `holiday`, `school-activities`, `other`.

### Output example (organizer row, measured 24 Sep 2026)

```json
{
    "type": "organizer",
    "organizerId": "17077434061",
    "name": "Austin Economic Development",
    "profileUrl": "https://www.eventbrite.com/o/austin-economic-development-17077434061",
    "website": "http://www.SmallBizAustin.org",
    "websiteDomain": "smallbizaustin.org",
    "hasWebsite": true,
    "websiteFieldKind": "own",
    "facebook": "https://www.facebook.com/AustinEconDev",
    "twitter": "https://x.com/AustinEconDev",
    "phonesInBio": [],
    "emailsInBio": [],
    "city": "Austin, TX",
    "followers": 7006,
    "followersShown": "7k",
    "upcomingEvents": 37,
    "totalEvents": 1228,
    "pastEvents": 1191,
    "hostingYearsShown": "8 years",
    "attendeesHostedShown": "40k",
    "verified": true,
    "nextEventDate": "2026-09-30",
    "eventsInThisRun": 13,
    "categories": ["Business & Professional"],
    "ticketPriceMin": 20,
    "ticketPriceMax": 20,
    "currency": "USD",
    "freeEventsInThisRun": 5
}
```

Event rows (`type: "event"`) contain name, URL, date/time/timezone, venue with address and coordinates, category/subcategory/format, organizer tags, min/max ticket price, free and sold-out flags, sales status, and the organizer's id, name, URL, website and follower count.

### Pricing

Pay per result: one charge per **organizer lead** and one per **event row**, plus a tiny start fee. Filtered-out rows are never charged. See the pricing tab for current prices.

### Limits you should know

- Eventbrite shows at most **49 pages × 20 = 980 events per search**. For bigger cities, split by category, keyword or date range — events are deduplicated across searches.
- `pastEvents` = total events minus upcoming, as shown on the organizer page. When an organizer hides their event count, the field is `null`.
- `phonesInBio` / `emailsInBio` only contain what the organizer wrote into their public bio (US phone format). Most organizers write nothing there — measured: 1–3 of ~120 organizers per city search.
- Only public data is read; nothing behind a login. The Actor slows down automatically on rate limits (429) and reports every HTTP status in the run summary.
- **Proxy:** the default is *no proxy*. Measured on 24 Sep 2026: Eventbrite serves Apify's own servers and residential IPs normally, but shows a CAPTCHA page (HTTP 405) to datacenter proxies. This Actor does not solve CAPTCHAs — it stops that search and says so in the summary. If you run very large jobs and see 429s, choose *Residential* in the proxy setting.

### Run summary

`SUMMARY` in the key-value store: every search with Eventbrite's own total and the number read, what each filter dropped, failed organizer pages, HTTP status counts and a `dataSourceCheck` (`OK` / `FORMAT_WARNING`). If Eventbrite changes its page format and nothing can be read, the run fails visibly instead of returning an empty success.

# Actor input Schema

## `mode` (type: `string`):

Organizer leads = one row per organizer (deduplicated across all searches) with website, socials, followers, event counts and ticket price range. Events = one row per event. Both = both row types.

## `locations` (type: `array`):

"City, ST" for the US ("Austin, TX", "Miami, Florida"), "City, Country" elsewhere ("London, United Kingdom"), an Eventbrite slug ("tx--austin"), an eventbrite.com/d/... URL, or "online".

## `categories` (type: `array`):

business, food-and-drink, health, music, arts, science-and-tech, sports-and-fitness, community, hobbies, family-and-education, charity-and-causes, home-and-lifestyle, film-and-media, fashion, travel-and-outdoor, spirituality, government, auto-boat-and-air, holiday, school-activities, other. Each category is one search per location.

## `searchTerms` (type: `array`):

Eventbrite keyword searches ("yoga", "real estate", "wine tasting"). Each keyword is one search per location. Leave categories and keywords empty for all events.

## `dateFrom` (type: `string`):

Only events on or after this date. Empty = from today.

## `dateTo` (type: `string`):

Only events starting on or before this date.

## `excludeOnline` (type: `boolean`):

Drop online-only events (and organizers seen only through them). On by default, because city searches on Eventbrite also return online events.

## `priceFilter` (type: `string`):

Applied before organizers are built, so 'paid' gives you organizers who sell tickets.

## `maxEventsPerSearch` (type: `integer`):

Events read from each location × category/keyword search. Eventbrite shows at most 49 pages × 20 = 980 per search.

## `websiteFilter` (type: `string`):

Filtered-out organizers are not charged.

## `minFollowers` (type: `integer`):

Exact Eventbrite follower count. Filtered-out organizers are not charged.

## `maxFollowers` (type: `integer`):

Skip big national organizers and keep local ones.

## `minUpcomingEvents` (type: `integer`):

Only organizers with at least this many upcoming events on Eventbrite (all cities).

## `includeBioContacts` (type: `boolean`):

Copies phone numbers and email addresses that the organizer has written into their public Eventbrite bio. Nothing is guessed, looked up or enriched.

## `maxOrganizers` (type: `integer`):

The run stops cleanly at this number. You are never charged for more.

## `maxEvents` (type: `integer`):

Only used with event rows. The run stops cleanly at this number; you are never charged for more.

## `concurrency` (type: `integer`):

Kept low on purpose; all requests share one adaptive rate limiter.

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

Default: no proxy — measured 24 Sep 2026, Eventbrite answers Apify's own servers normally but shows a CAPTCHA (HTTP 405) to Apify datacenter proxies, which this Actor does not try to solve. If your runs get rate-limited (429), switch to Residential proxy.

## Actor input object example

```json
{
  "mode": "organizers",
  "locations": [
    "Austin, TX",
    "Miami, FL"
  ],
  "categories": [
    "business",
    "food-and-drink"
  ],
  "searchTerms": [
    "yoga",
    "real estate"
  ],
  "excludeOnline": true,
  "priceFilter": "any",
  "maxEventsPerSearch": 200,
  "websiteFilter": "any",
  "includeBioContacts": true,
  "maxOrganizers": 300,
  "maxEvents": 1000,
  "concurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Organizer leads (type = organizer) and/or events (type = event).

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

Events per search (and Eventbrite's own total), what each filter dropped, failed organizer pages, HTTP status counts.

# 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 = {
    "locations": [
        "Austin, TX"
    ],
    "categories": [
        "business"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("thequietstack/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 = {
    "locations": ["Austin, TX"],
    "categories": ["business"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("thequietstack/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 '{
  "locations": [
    "Austin, TX"
  ],
  "categories": [
    "business"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call thequietstack/eventbrite-scraper --silent --output-dataset

```

## MCP server setup

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