# Eventbrite Scraper | Events & Organizers (`peerless_columbine/eventbrite-events-organizers-scraper`) Actor

Export public Eventbrite events by city, filters or event/organizer URLs, with dates, venues, ticket prices and descriptions. $3 per 1,000 events plus platform usage. Independent third-party tool.

- **URL**: https://apify.com/peerless\_columbine/eventbrite-events-organizers-scraper.md
- **Developed by:** [tingyou333 zhuang](https://apify.com/peerless_columbine) (community)
- **Categories:** Travel, Automation, Lead generation
- **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 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 | Events & Organizers

Collect publicly visible Eventbrite events for local event feeds, market research and organizer discovery. Search by city, category, date, format and ticket price, or supply event, search or organizer profile URLs. Organizer input collects that organizer's public upcoming list, then verifies each event detail belongs to the same organizer. Each accepted event is read from its detail page and written as a structured dataset row. A separate `SUMMARY` record explains pagination, exclusions, failures and limits.

This is an **independent third-party tool**, not an Eventbrite product, partner or endorsed integration. It does not use personal cookies, login sessions, ticket purchases or paid upstream services.

### Quick start

For a small export from a public organizer, click **Try for free** and use:

```json
{
  "startUrl": [
    {
      "url": "https://www.eventbrite.com/o/jiggytime-ent-5494940201"
    }
  ],
  "maxItems": 3,
  "maxPages": 2,
  "maxRequests": 12,
  "maxRunSecs": 95,
  "retrieveOrganizerData": false
}
```

For a city search, replace the input with:

```json
{
  "city": "ny--new-york",
  "maxItems": 3,
  "maxPages": 2,
  "maxRequests": 12,
  "maxRunSecs": 95,
  "retrieveOrganizerData": false
}
```

Do not combine `startUrl` with city or search filters. Public events and organizer listings can expire or change. One accepted event produces one row. Download the dataset as JSON, CSV or Excel, and read `SUMMARY` for collection limits.

### Pricing

**$3 per 1,000 stored events ($0.003 each), plus Apify platform usage.** There is no Actor start fee or separate organizer-profile fee. Optional organizer enrichment can increase source requests and platform usage. Failed/skipped events, `SUMMARY` and optional diagnostics incur no result fee. Compute, storage and transfer are additional platform costs. Use a spending limit and the `maxItems`, `maxRequests` and `maxRunSecs` controls. Keep the Actor timeout above `maxRunSecs`; the published default timeout is 660 seconds.

### Input and filter semantics

Unknown inputs fail early instead of being silently ignored. Accepted enum values are listed in the input form.

| Field | Type / runtime default | Behavior |
|---|---|---|
| `maxItems` | integer / 10 | Strict global maximum of valid distinct events, 1–1,000,000. The upper input bound does not promise available coverage. |
| `startUrl` | array / empty | **Platform input requires `{ "url": "https://..." }` objects.** Plain URL strings remain supported by the local runtime only and do not pass the platform input schema. Public `/e/` event, `/d/` search or `/o/` organizer profile URLs. Organizer input reads upcoming events, not past events or profile enrichment alone. Mutually exclusive with all search filters. No remote URL-list downloads. |
| `city` | string / absent | Source city slug, e.g. `ny--new-york`, `united-kingdom--london`, `spain--madrid`. No typo correction or geocoding is inferred. |
| `category` | string / absent | Known Eventbrite category slug; passed to the source and checked against category IDs in results. |
| `date` | string / absent | `today`, `tomorrow`, `this-weekend`, `this-week`, `next-week`, `this-month`, `next-month`. Source filter plus a check of the event's **local start date**. Weekend is Saturday–Sunday; current week/month start today. Relative dates use each event's published IANA timezone. |
| `format` | string / absent | Known format such as `conference`, `festival`, `seminar`, `networking`. Source must acknowledge its taxonomy ID; unexpected source mapping fails explicitly. See schema for accepted values. |
| `price` | `free` / `paid` / absent | Requires a published free or paid ticket option respectively. An event offering both may satisfy both filters. No ticket amount is inferred from its title. |
| `online` | boolean / false | Uses global online-event search and requires `isOnline=true`. If combined with city, city does not narrow the global online source; `SUMMARY` explicitly warns. |
| `retrieveOrganizerData` | boolean / false | Extra public profile request per unique organizer, cached during the run. Basic organizer data is already available from the event page. Profile failure preserves the valid event, adds a row warning and marks the run partial. External organizer links are returned as data, never visited. |

Extensions:

| Field | Default | Behavior |
|---|---|---|
| `keyword` | absent | Eventbrite relevance search; not a literal-title substring filter. |
| `startDate`, `endDate` | absent | Both required together, YYYY-MM-DD, inclusive event-local **start-date** bounds. Cannot combine with `date`. This excludes events starting outside the range even if they overlap it. |
| `domain` | `eventbrite.com` | Allowlisted Eventbrite country site for search. Detail links may lead to another Eventbrite country domain. |
| `maxPages` | 20 | Maximum search or organizer upcoming-list pages per target, 1–1,000; source limits still apply. |
| `maxRequests` | 100 | Total source attempts, including redirects, details, enrichment and retries, 1–10,000. DoH queries are separately counted. |
| `requestTimeoutSecs` | 25 | Per-attempt timeout, 3–60 seconds. |
| `maxRetries` | 1 | Up to three configurable retries for network failures and selected 5xx; no retries for 401/403/429 or challenges. |
| `requestDelaySecs` | 0.3 | Delay between sequential requests, 0–10 seconds. |
| `maxRunSecs` | 600 | Overall work deadline, 10–7,200 seconds. |
| `dnsMode` | `system` | `system` or explicit `google-doh`; both enforce public-IP validation. |
| `diagnosticsEnabled` | false | Explicitly opt into sanitized response diagnostics in KVS, separately from output rows and charging. Requires selected IDs. No extra source requests. |
| `diagnosticEventIds` | absent | One or two numeric string IDs to capture if actually encountered. Does not add targets. Must be absent/empty when diagnostics are disabled. |
| `diagnosticMaxBytes` | 524288 | Maximum serialized UTF-8 bytes per diagnostic, 16384–1048576. Truncation and omitted content are marked. |
| `diagnosticMaxObjects` | 300 | Maximum visited JSON containers/collection width, 10–1000; deep structures are bounded too. |

City search follows Eventbrite's metropolitan/relevance scope and organizer-supplied geography. A New York search can include surrounding boroughs or incorrectly geocoded listings; it is not a municipal-boundary guarantee. Source filter acknowledgement is saved for inspection. Not every enum/domain combination has been live tested. Unsupported or changed source semantics produce a diagnostic rather than unfiltered rows.

### Output and missing-data rules

Every dataset row has stable `id`, `eventbriteId`, `title`, `url`, `startDate`, `startDateTime` and `scrapedTimestamp`. Other keys are present with null or empty-array values when the public page does not supply them. Dataset views show event overview and provenance/warnings.

| Group | Fields |
|---|---|
| Time | `startDate`, `startTime`, `startDateTime`, `endDate`, `endTime`, `endDateTime`, `timezone`, `startDateTimeUtc`, `endDateTimeUtc`, `duration`, `durationSeconds` |
| Venue | `venue.name`, `city`, `state`, `country`, `streetAddress`, `postalCode`, `fullAddress`, `latitude`, `longitude`; physical fields are null for online events |
| Organizer | `organizer.id`, `name`, `url`, `description`, `website`, `socialUrls`, `followers`, `followersDisplay`, `verified`, `eventsHosted`, `attendeesHosted`, `hostingYears`, `isSuperOrganizer` |
| Tickets | `pricing.isFree`, `minPrice`, `maxPrice`, `currency`, `availability`, `hasFreeTicketOption`, `hasPaidTicketOption`, `ticketsUrl`, `registrationUrl`, `isSoldOut`, `hasAvailableTickets` |
| Content | `summary`, `description`, `category`, `subcategory`, `format`, `tags`, `imageUrl`, `images`, `status`, `isProtected`, `publishedAt`, `createdAt`, `language`, `ageRestriction`, `urgencySignals` |
| Provenance | `source.detailUrl`, `searchPage`, `responseSha256`, `detailParser`, `organizerEnrichment`, taxonomy IDs, `warnings`, `scrapedTimestamp` |

Dates from the primary embedded payload are local wall-clock values paired with `timezone`; UTC is separate. A JSON-LD-only fallback may include an explicit offset in `startDateTime`; its parser mode and warning make this visible. `duration` is an ISO-8601 duration string, when published, and `durationSeconds` is numeric. **Created date is not substituted for published date.** Direct details often do not publish `publishedAt` or a postal code. `tags` currently preserve tags from search results; direct-only details may have an empty tag array.

`pricing.isFree` preserves the source's whole-event flag. An observed mixed event had `isFree=false`, minimum 0 and maximum 55.2 USD. Prices are public offer amounts, not a verified checkout total, and can include expired or mixed ticket tiers. No purchase is performed. Null prices do not mean free.

`description` uses published text modules first. If those are absent, it can read the separate nested body inside the page's observed Overview DOM structure, while excluding the outer summary paragraph. `source.descriptionSource` identifies the route. Ambiguous or absent body content stays null with `FULL_DESCRIPTION_UNAVAILABLE`; summary and SEO description never substitute for a body. `capacity` and `attendeeCount` remain null unless actually published for that event. An organizer's lifetime `attendeesHosted` is not event attendance. Abbreviated follower counts such as `3.4k` stay in `followersDisplay`; an exact numeric count is not invented.

Error records never enter the event dataset. `SUMMARY.errors` holds normalized safe diagnostics. A 200 response without known event/search data is a schema failure, not a successful empty result. A real empty result requires the search payload's zero result count. Protected events are skipped.

### Pagination, limits and status

Search starts at the supplied page (default 1), follows numeric pages, verifies that the source page number advances, and deduplicates by stable event ID across all targets and domains. It stops at the requested result limit, page/request/time/fee limit, source last page, a repeated page or an access challenge. Recommendation rails and unrelated JSON-LD items are not harvested. Requested, final and parsed event IDs must match, including after redirects.

Organizer input reads `upcomingEvents` from the public profile. Every listed ID/URL and organizer owner is checked before fetching, and the detail must independently identify the same organizer. `hasMoreUpcoming`/`hasMore` control continuation through the observed read-only organizer events endpoint; numeric pages, repeated-page detection and the same HTTP budgets apply. The HTML `upcomingEventsTotal` is compared to the final distinct listed count: a mismatch is a partial/error result, never a complete collection. API `total` is preserved as a response-reported count, not assumed to be global. The real tested organizer had seven events and a first-page terminal signal; nonempty later-page behavior is tested with clearly labelled control fixtures and is not claimed as live coverage.

`SUMMARY.status` is `SUCCEEDED`, `EMPTY`, `LIMITED`, `PARTIAL` or `FAILED`. `LIMITED` includes intentional small samples; it is not proof of complete source coverage. `PARTIAL` means valid rows survived alongside an error. `complete` refers only to the requested publicly available source window and is false when errors or scope warnings exist. Inspect each target's termination reason and reported source count. Source page counts can change while paginating.

Search results are a bounded source window, not all events on Eventbrite. A September 26, 2026 New York observation reported 10,000 matches but exposed at most 49 pages of 20 results. Increasing `maxItems` cannot remove a source-imposed window. The seven-event organizer acceptance was a real cloud run; nonempty later organizer pages were checked with control fixtures, not live positive pagination evidence.

### API and scheduled exports

Save your input as `input.json`, then start a run with your own Apify token:

```sh
curl --fail-with-body -X POST \
  'https://api.apify.com/v2/acts/UC12YFWTPLXOztuLQ/runs' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-binary @input.json
```

Read the returned run's default dataset for rows and its key-value store `SUMMARY` record for coverage. Export JSON, CSV or Excel in Apify Console. You can configure an Apify schedule for repeated snapshots; this Actor does not create schedules itself.

For recurring feeds, upsert on `eventbriteId` and compare `scrapedTimestamp`. IDs are deduplicated within a run, not across separate runs.

### Optional response diagnostics

`DIAGNOSTICS` is a bounded index, and `DIAG_EVENT_<numeric ID>` is a JSON envelope for each explicitly selected event encountered. It records requested/final URL, event ID, original response SHA-256, encoding/byte count, parser body length/hash, structural keys, sanitized event context and matching Event JSON-LD. The public event Overview DOM is retained for independent parser replay. Unknown event JSON branches are retained within the limits; account, session, tracking, bootstrap, executable scripts and unrelated events are removed. Unrelated visible page regions are omitted. Private/protected or identity-mismatched content is suppressed.

These are sanitized snapshots, not byte-identical raw response archives. `sanitizedHtmlSha256` covers the replay HTML; the index `payloadSha256` covers the exact UTF-8 JSON record bytes written to KVS. Redaction, omission and truncation are explicit. Diagnostics are disabled by default, never become dataset rows, are not charged, and never collect request headers, cookies or authorization. Storage failure appears as a normalized diagnostic error and is not retried.

### Support

Use this Actor's **Issues** tab with the run ID, public Eventbrite URL and relevant `SUMMARY` diagnostic. Never post credentials or private run records containing sensitive information. Explicit access blocks, login gates and CAPTCHA stop the affected target. Missing organizer details and ticket prices remain null; an organizer's lifetime attendance is not an event's attendance.

# Actor input Schema

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

Strict run-wide limit on valid, deduplicated event rows; runtime default 10.

## `startUrl` (type: `array`):

Public /e/ event, /d/ search or /o/ organizer upcoming-event URLs as objects with a url field. Platform input requires URL objects; string URLs are a local-runtime extension. Mutually exclusive with search filters. No remote URL-list downloads.

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

Eventbrite city slug such as ny--new-york or united-kingdom--london. Source uses metropolitan relevance, not municipal boundaries.

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

Source taxonomy filter; checked against the returned category tag.

## `date` (type: `string`):

Require event local start date in the selected period after applying source date search. Weekend means Saturday-Sunday. Cannot combine with explicit dates.

## `format` (type: `string`):

Eventbrite format taxonomy; source filter must be acknowledged.

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

free requires a confirmed free ticket option (may have paid tickets too); paid requires a confirmed paid ticket option.

## `online` (type: `boolean`):

Use the global online search. When true, city is not applied and SUMMARY explicitly records that scope.

## `retrieveOrganizerData` (type: `boolean`):

Visit each unique public organizer profile once. Failures retain valid event details and appear in SUMMARY and row warnings.

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

Extension: pass the phrase to Eventbrite relevance search. Not a literal title substring filter.

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

Extension: inclusive event-local start-date lower bound, YYYY-MM-DD; requires endDate.

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

Extension: inclusive event-local start-date upper bound, YYYY-MM-DD; requires startDate.

## `domain` (type: `string`):

Search website locale. Detail links can legitimately lead to another allowed Eventbrite country domain.

## `maxPages` (type: `integer`):

Maximum search or organizer upcoming-list pages. Stops at the source terminal signal or repeated page; default 20.

## `maxRequests` (type: `integer`):

Run-wide source HTTP attempt budget, including redirects, details, organizer pages and retries. DNS requests counted separately by the resolver.

## `requestTimeoutSecs` (type: `integer`):

Maximum seconds per source attempt.

## `maxRetries` (type: `integer`):

Retries for network failure and selected 5xx only. Never retry 403, 429 or challenges.

## `requestDelaySecs` (type: `number`):

Sequential collection delay. No concurrent event requests.

## `maxRunSecs` (type: `integer`):

Maximum work duration; timeout writes partial summary.

## `dnsMode` (type: `string`):

system validates system DNS addresses. google-doh explicitly uses TLS-verified dns.google at 8.8.8.8 and validates every target public IP; useful on local fake-IP networks.

## `diagnosticsEnabled` (type: `boolean`):

Opt-in only: save bounded, sanitized public event response JSON envelopes to KVS, never the dataset. Requires explicit diagnosticEventIds. Does not cause extra source requests.

## `diagnosticEventIds` (type: `array`):

At most two numeric event IDs to capture if encountered. Must be nonempty only when diagnosticsEnabled is true. Keys are DIAGNOSTICS and DIAG\_EVENT\_<ID>.

## `diagnosticMaxBytes` (type: `integer`):

Hard UTF-8 serialized JSON byte limit per event record. Includes metadata, sanitized HTML and event JSON. Default 524288; omitted or truncated content is explicitly marked.

## `diagnosticMaxObjects` (type: `integer`):

Bounds visited event JSON containers and collection widths. Excludes account/session/tracking/bootstrap data and unrelated event JSON-LD.

## Actor input object example

```json
{
  "maxItems": 3,
  "city": "ny--new-york",
  "online": false,
  "retrieveOrganizerData": false,
  "domain": "eventbrite.com",
  "maxPages": 20,
  "maxRequests": 100,
  "requestTimeoutSecs": 25,
  "maxRetries": 1,
  "requestDelaySecs": 0.3,
  "maxRunSecs": 600,
  "dnsMode": "system",
  "diagnosticsEnabled": false,
  "diagnosticMaxBytes": 524288,
  "diagnosticMaxObjects": 300
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "maxItems": 3,
    "city": "ny--new-york"
};

// Run the Actor and wait for it to finish
const run = await client.actor("peerless_columbine/eventbrite-events-organizers-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 = {
    "maxItems": 3,
    "city": "ny--new-york",
}

# Run the Actor and wait for it to finish
run = client.actor("peerless_columbine/eventbrite-events-organizers-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 '{
  "maxItems": 3,
  "city": "ny--new-york"
}' |
apify call peerless_columbine/eventbrite-events-organizers-scraper --silent --output-dataset

```

## MCP server setup

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