# Eventbrite Scraper & Luma Scraper - Events, Venues, Organizers (`tidytools/eventbrite-luma-events`) Actor

Events from Eventbrite and Luma by city, keyword and date in one table: date and time, venue and address with coordinates, price, sold out, organizer with events hosted and attendees, category. New-event alerts. $3 per 1,000 events, no start fee.

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

## Pricing

from $2.40 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Eventbrite & Luma Events do?

**Enter keywords and cities (or paste Eventbrite and Luma links), get one row per event with date, venue, price and organizer, at $3 per 1,000 events.** Optional organizer website and social links cost $0.002 per organizer. Filtered-out events, duplicates, events seen in earlier runs and failed searches are free. No start fee.

It collects **events from Eventbrite and Luma in one table**, by city, keyword and date: "AI events in San Francisco this month", "startup events in Berlin", "online marketing webinars". Each event comes with its **date and time (local and UTC), venue, address and coordinates, price range, sold-out state, category and organizer**, including how many events the organizer has run and how many attendees it has hosted.

- 🔎 **Two platforms, one search**: Eventbrite (search pages and event pages) and Luma (city feeds, categories, calendars). Duplicates across keywords and cities are removed.
- 🏢 **Organizer data for outreach**: organizer name and page, events hosted, attendees hosted, followers; optionally the organizer's **website and public social profiles** (organizations only).
- 🔔 **New-event alerts**: `onlyNewEvents` returns only events not seen in earlier runs of the same monitor. Schedule it weekly and pipe the results to Slack, Sheets or a CRM.
- 💸 **$3 per 1,000 events, no start fee.** Filtered-out events, duplicates, events already seen and failed searches are free.

#### Real results (3 October 2026)

| Run | Events | Time | Cost |
|---|---|---|---|
| "AI" in San Francisco, next 30 days, 20 per platform | 45 (23 Eventbrite, 22 Luma) | 3 s | $0.090 |
| "startup" and "marketing" in London, Berlin, online and Taipei, 5 per search, organizer profiles on, plus 4 Eventbrite / Luma URLs | 60 (41 Eventbrite, 19 Luma), 40 with an organizer website, 36 organizer profiles charged | 42 s | $0.192 |
| "AI" in Austin, TX with only-new-events, run twice | 7, then 5 new (7 seen before, free) | 2-4 s | $0.014, $0.010 |

Examples from the second run:

| Platform | Event | Starts | City | Price | Organizer | Organizer website |
|---|---|---|---|---|---|---|
| Eventbrite | Startup Founders & Innovators London Networking Event | 2026-10-06 19:00 +01:00 | London | 8.83-38.62 GBP | London Founders Network | - |
| Eventbrite | The Berlin AI Conference 2026 | 2026-10-15 18:00 +02:00 | Berlin | 35.70-94.01 EUR | Startup Network Europe | startupnetwork.eu |
| Eventbrite | Ready, Set, Launch! The Business Startup Blueprint | 2026-10-13 12:00 -05:00 | online | free | LiftFund | liftfund.com |
| Luma | Nebius Build Week Hackathon in partnership with NVIDIA | 2026-10-18 09:30 +02:00 | Berlin | free | Nebius Events | nebius.com |
| Luma | Common Matters #12 | 2026-10-14 18:30 +01:00 | London | 21 GBP | Craft | itscraft.com |

### Use cases

- **Sponsorship and partnership sales**: find events in your niche and city, with organizers that run many events and draw large audiences (`organizerEventCount`, `organizerTotalAttendees`).
- **Event marketing and community**: track competitors' and partners' events, or every AI or startup event in your cities.
- **Lead generation for event services**: venues, catering, AV, ticketing and event software reach active organizers.
- **Newsletters and calendars**: a weekly "what's on" list from `onlyNewEvents`, with dates already in local time.
- **Market research**: how many events per category, city and price range.

### How much does it cost?

| Event | Price | When |
|---|---|---|
| Event | **$3.00 / 1,000 events** ($0.003 each) | an event returned after your filters |
| Organizer profile | $0.002 per organizer | optional: an organizer's website and social links, once per organizer and run, only when something is found |

**Free:** events removed by your filters, duplicates, events seen in earlier runs (only-new mode), searches with no results or that fail, and invalid lines. **No start fee.** Reading each event page (price, organizer, end time) costs nothing extra. Larger Apify plans get the usual volume discount (Silver 10%, Gold and above 20%).

**Example:** 1,000 events with organizer details cost $3.00; with organizer websites for 300 distinct organizers, $3.60.

For comparison (Apify Store, 3 October 2026, users in the last 30 days): aitorsm/eventbrite (82 users) $0.02 per event plus $0.015 per organizer enrichment; parseforge/eventbrite-scraper (64) $0.0045 per event, $0.003 per organizer and $0.006 per start; hypebridge/eventbrite-search (41) $0.005 per event plus $0.005 per detailed event; crawlerbros/eventbrite-scraper (30) $0.002 per event plus $0.005 per start; aitorsm/luma-events (29) $0.03 per event plus $0.01 per detail. This Actor covers both platforms in one run and does not return attendee or guest lists.

#### Control your cost

- `maxEventsPerSearch` (per keyword, city and platform) and `maxEvents` (per run) cap the events and so the cost.
- The run logs its worst-case plan at the start and compares it with your **maximum charge per run**; when the next event could pass it, the run stops (`SUMMARY.status: LIMIT_REACHED`).
- Every row has `charged: true` or `false`; failed searches are rows ending in "(not charged)".

### How to use it

1. **Keywords**: e.g. `AI`, `startup`, `marketing`, `yoga`. Empty = all events. One per line; commas and semicolons also separate (`AI, startup`).
2. **Locations**: `San Francisco, CA`, `Austin, TX`, `London, UK`, `Berlin`, `Taipei`, or `online`. One per line or separated by semicolons (`London; Berlin`; a comma stays part of `Austin, TX`). Every keyword is searched in every location on every chosen platform.
3. Optional **filters**: `dateFrom` / `dateTo` (`2026-11-01`, `2026/11/01`, `today`, `+30 days`), free or paid, in person or online.
4. Optional: **Eventbrite or Luma URLs** to read directly (a search page you set up on Eventbrite, an event or organizer page on any Eventbrite country site, a Luma city, category, calendar or event page, including `luma.com/calendar/cal-...` and `lu.ma/evt-...` links). Spaces, semicolons or a comma between links separate them; pasted quotes and brackets are removed.
5. Click **Start**. **Events (overview)** shows the key columns; **Organizers** lists who runs them; **Events (all fields)** has everything.

On Luma, a keyword that is a Luma category (ai, tech, crypto, climate, food, arts, fitness, wellness, running, books, games, family) is matched with Luma's own event categories; other keywords are matched in the title and description. Luma has city feeds for about 90 cities (no "online" feed: use calendar links for online communities).

#### Input example

```json
{
    "searches": ["AI", "startup"],
    "locations": ["San Francisco, CA", "New York, NY", "London, UK"],
    "dateTo": "+30 days",
    "maxEventsPerSearch": 100,
    "organizerProfiles": true,
    "onlyNewEvents": true,
    "monitorName": "ai-startup-weekly"
}
```

#### Output example

Real result (3 October 2026):

```json
{
    "platform": "eventbrite",
    "eventId": "2000526458490",
    "url": "https://www.eventbrite.com/e/travel-with-ai-tickets-2000526458490",
    "title": "Travel with AI",
    "summary": "Travel with AI is a hands-on introduction to using AI as a practical travel companion.",
    "startDate": "2026-10-09T14:00:00-07:00",
    "startDateUtc": "2026-10-09T21:00:00.000Z",
    "timezone": "America/Los_Angeles",
    "durationMinutes": 60,
    "eventType": "in_person",
    "venueName": "Mechanics' Institute",
    "address": "57 Post Street, San Francisco, CA 94104",
    "city": "San Francisco",
    "region": "CA",
    "country": "US",
    "latitude": 37.7888045,
    "longitude": -122.4030162,
    "isFree": false,
    "priceMin": 0,
    "priceMax": 7.18,
    "currency": "USD",
    "soldOut": false,
    "salesStatus": "on_sale",
    "status": "scheduled",
    "category": "Community",
    "subcategory": "Other",
    "format": "Seminar",
    "organizerName": "Mechanics' Institute",
    "organizerUrl": "https://www.eventbrite.com/o/mechanics-institute-2495482952",
    "organizerEventCount": 1962,
    "organizerTotalAttendees": 57813,
    "organizerFollowers": 2300,
    "organizerWebsite": "https://www.milibrary.org/",
    "organizerSocial": { "x": "https://x.com/milibrary", "facebook": "https://www.facebook.com/MILibrary" },
    "organizerProfileCharged": true,
    "charged": true
}
```

#### What the fields mean

- **startDate / endDate**: local time with the UTC offset; **startDateUtc / endDateUtc** in UTC. Eventbrite events with a hidden end time have `endDate: null`.
- **priceMin / priceMax / currency / isFree**: the ticket price range (0 = a free ticket type exists). **soldOut**, **spotsRemaining** (Luma), **requiresApproval** (Luma: registration needs the host's approval).
- **organizer...**: Eventbrite organizer (events hosted, attendees hosted, followers) or Luma calendar. **hostNames** (Luma): the names shown as hosts. Personal Luma calendars have no organizer name or links.
- **tags**: Eventbrite organizer tags or Luma categories. **search / searchLocation / input**: which search found the event.
- **SUMMARY** (key-value store): per search (`searches`) the events delivered, pages read and total results; filtered, duplicate and already-seen counts.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tidytools~eventbrite-luma-events/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searches":["AI"],"locations":["San Francisco, CA"],"dateTo":"+14 days","maxEventsPerSearch":50}'
```

**With AI agents (MCP):** connect Apify's MCP server (`https://mcp.apify.com?tools=tidytools/eventbrite-luma-events`) to Claude, Cursor or any MCP client and ask, for example, "List AI and startup events in London in the next two weeks with their organizers". Minimal input: `{"searches": ["AI"], "locations": ["London, UK"]}`. Failed searches are not charged and carry an `errorType`.

### Responsible use

This Actor returns **events and the organizations that run them**. It never reads or returns attendee or guest lists, and for people listed as Luma hosts it returns their names only (no profiles or social handles). Turn off **Include host names (Luma)** (`includeHostNames`) to leave even those names out. Organizer websites and social links come from organizer pages and organization calendars that the organizers published themselves. Use organizer contacts for relevant business outreach, follow the platforms' terms and your local marketing and privacy laws (for example GDPR and CAN-SPAM), and honor opt-out requests. Event descriptions and images belong to their authors: summarize or link them rather than republishing them in bulk.

### Limitations

- **Eventbrite** lists up to about 980 events per search (49 pages); use more specific keywords or date ranges for more. Location names are turned into Eventbrite place pages (`San Francisco, CA` -> `ca--san-francisco`); a plain city name is resolved by Eventbrite itself.
- **Luma** has city feeds for about 90 cities and no keyword search; keywords are matched in each event's title, description and categories, so a Luma search may scan many events to find a few.
- **Meetup** is not included: its search pages are disallowed for crawlers in its robots.txt.
- Requests use our honest TidyTools user agent and respect robots.txt; pages that refuse the request are retried from our servers, never with bot-check solving.

### FAQ

**Does the Actor collect usage data?** The Actor sends one anonymous usage counter per run (input type, item count range, outcome) to improve the tool; no URLs, content or account data.

**What happens if I enter nothing, a wrong date or a link that is not Eventbrite or Luma?** The run ends normally (it does not fail) with a free row per mistake, `errorType: "invalid_input"` and a message saying what to fix. Nothing is charged. A date range that ended before today, or only unknown platforms (e.g. `meetup`), stops the run the same way before anything is searched. A city Luma does not cover or an Eventbrite search with no page is a free `no_results` or `not_found` row for that search; the other searches still run.

**I call it from code or a no-code tool that sends text. Does that work?** Yes. `"true"` / `"false"` (also `yes` / `no`, `1` / `0`) are read as on / off, numbers as text (`"20"`, `"1,000"`) are read, and `Free` / `in person` match the filter choices. A value that cannot be read (a number like `"abc"`, an option like `"cheap"`) falls back to the default and is listed in `SUMMARY.inputNotes`; a `{ "url": ... }` object is read as a link, any other non-text item becomes a free `invalid_input` row.

**Is the same event charged twice when two searches or links find it?** No. An event found by several keywords, cities or links (an Eventbrite event on `.com` and `.co.uk`, a Luma event in a city feed and by its own link) is returned and charged once per run.

**Why is a search with "free" or "paid" slow?** Eventbrite's search lists do not show prices, so each event page is read to check the price. A filter that removes most events (for example free events in a niche keyword) makes the search read up to about 980 event pages; the events that do not match are free. Date and in-person/online filters are applied before reading the page and cost no extra time.

**Does an organizer link return old events?** It returns the events the organizer page lists as upcoming, including series that started earlier and are still running (their `startDate` can be in the past and `endDate` in the future).

**Can I get the attendee list of an event?** No. The Actor returns events and the organizations that run them, never attendee or guest lists.

**How do I get a weekly list of new events?** Turn on **Only new events**, keep the same **Monitor name** and schedule the Actor weekly. Events already returned by earlier runs are skipped and not charged; connect the run to Slack, Google Sheets or a CRM through an Apify integration.

**Why are there fewer Luma events than Eventbrite events?** Luma has no keyword search: the Actor reads the city feed and keeps the events whose title, description or category match your keywords. Use a Luma category keyword (ai, tech, food ...) or add Luma calendar URLs to get more. With a category keyword and a city, each event's own page is read to check its categories even when "Read each event page" is off (no extra charge).

**Are the times in my time zone?** `startDate` is the event's local time with its UTC offset, and `startDateUtc` is the same moment in UTC, so you can convert to any time zone.

### Related Actors

- [Trade Show Exhibitor List Scraper](https://apify.com/tidytools/trade-show-exhibitor-list-scraper): the companies exhibiting at an event.
- [Company Website Enrichment](https://apify.com/tidytools/company-website-enrichment): company details for organizer websites.

# Actor input Schema

## `searches` (type: `array`):

What the events are about, one per line, e.g. AI, startup, marketing, yoga, wine tasting. Empty = all events in the locations. On Luma a keyword that is a Luma category (ai, tech, crypto, climate, food, arts, fitness, wellness, running, books, games, family) uses that category feed; other keywords are matched in the event title and description.

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

Cities, one per line: "San Francisco, CA", "Austin, TX", "London, UK", "Berlin", "Taipei", or "online" (Eventbrite online events). Luma covers about 90 cities (sf, nyc, london, berlin, tokyo, singapore, taipei ...).

## `platforms` (type: `array`):

Where to search. Both by default.

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

Pages to read directly, one per line: an Eventbrite search page (eventbrite.com/d/...), event (/e/...) or organizer page (/o/...); a Luma city, category, calendar or event page (luma.com/sf, luma.com/ai, luma.com/<calendar>, luma.com/calendar/cal-..., luma.com/<event>, lu.ma/evt-...). Spaces, semicolons or a comma between links also separate them.

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

Only events starting on or after this day: YYYY-MM-DD, "today", "tomorrow" or relative such as "+7 days".

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

Only events starting on or before this day: YYYY-MM-DD or relative such as "+30 days", "2 weeks", "1 month".

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

Keep only free or only paid events. Events whose price is unknown are kept.

## `eventType` (type: `string`):

Keep only in-person or only online events. Events whose format is unknown are kept; hybrid events count as in person.

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

Per keyword, location and platform. Eventbrite lists up to about 980 events per search.

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

The run stops after this many events (each one is charged). With the maximum charge per run, this caps the cost.

## `eventDetails` (type: `boolean`):

On: price range, currency, sold out, organizer with event count and attendees hosted, category, exact start and end time. Off: faster, fewer fields (Eventbrite search lists have no price or organizer name). Same price either way.

## `organizerProfiles` (type: `boolean`):

Add each organizer's website and public social profiles (Eventbrite organizer page, Luma calendar). Charged once per organizer and run, only when a website or social link is found. Individuals' personal calendars give no links.

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

Add the event description as plain text (up to 10,000 characters; needs "Read each event page"). The short summary is always included.

## `includeHostNames` (type: `boolean`):

Luma lists the people who host an event; their names are returned in hostNames (names only, no profiles). Turn off to leave hostNames out and keep organization-level data only.

## `onlyNewEvents` (type: `boolean`):

Return only events not returned by earlier runs of the same monitor (schedule this Actor daily or weekly for new-event alerts). Events seen before are free.

## `monitorName` (type: `string`):

Name of the saved list of seen events (letters, digits, dashes). Empty = derived from the first keyword and location.

## `httpVia` (type: `string`):

Requests always use our honest TidyTools user agent and respect robots.txt.

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

Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account.

## `maxConcurrency` (type: `integer`):

How many searches run at the same time (each reads up to 4 event pages at once).

## Actor input object example

```json
{
  "searches": [
    "AI"
  ],
  "locations": [
    "San Francisco, CA"
  ],
  "platforms": [
    "eventbrite",
    "luma"
  ],
  "dateTo": "+30 days",
  "priceFilter": "any",
  "eventType": "any",
  "maxEventsPerSearch": 20,
  "maxEvents": 100,
  "eventDetails": true,
  "organizerProfiles": false,
  "includeDescription": false,
  "includeHostNames": true,
  "onlyNewEvents": false,
  "monitorName": "",
  "httpVia": "auto",
  "maxConcurrency": 5
}
```

# Actor output Schema

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

No description

## `organizers` (type: `string`):

No description

## `full` (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 = {
    "searches": [
        "AI"
    ],
    "locations": [
        "San Francisco, CA"
    ],
    "dateTo": "+30 days",
    "maxEventsPerSearch": 20,
    "maxEvents": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidytools/eventbrite-luma-events").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 = {
    "searches": ["AI"],
    "locations": ["San Francisco, CA"],
    "dateTo": "+30 days",
    "maxEventsPerSearch": 20,
    "maxEvents": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("tidytools/eventbrite-luma-events").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 '{
  "searches": [
    "AI"
  ],
  "locations": [
    "San Francisco, CA"
  ],
  "dateTo": "+30 days",
  "maxEventsPerSearch": 20,
  "maxEvents": 100
}' |
apify call tidytools/eventbrite-luma-events --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidytools/eventbrite-luma-events"
        }
    }
}
```

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/FuauC7YIAgMTglXiq/builds/By98h2RWCJiZGawq6/openapi.json
