# Events Scraper: Eventbrite, Meetup & Luma — No Login (`cliqtomedia/events-aggregator`) Actor

Scrape public events from Eventbrite, Meetup and Luma for any city or online. Filter by keyword and date. Get dates with time zones, venues, organizers, prices and event links. No login.

- **URL**: https://apify.com/cliqtomedia/events-aggregator.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.72 / 1,000 event scrapeds

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

Get public events from **Eventbrite, Meetup and Luma** in one clean dataset. Type any city (or `Online`), add keywords and dates, and get event names, local start times, venues, organizers, prices and links. No login. A run with 20 events costs about $0.06–$0.07.

It is for event marketers, community managers, local media and sales teams who need fresh event lists. A first run with the prefilled form (London, keyword `AI`, 20 events) takes about 10–20 seconds.

![Eventbrite, Meetup and Luma events scraper: an Austin search returns event cards with date, local time, venue, organizer and price from three sites](https://api.apify.com/v2/key-value-stores/HsnEecvcGAmt9Qm2D/records/README-HERO-20261014.png)

### Table of contents

- [What it does](#what-it-does)
- [Quick start](#quick-start)
- [Use cases](#use-cases)
- [Input](#input)
- [Output](#output)
- [Pricing and limits](#pricing-and-limits)
- [API, export and integrations](#api-export-and-integrations)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Support](#support)

### What it does

The Actor searches the public event pages of Eventbrite, Meetup and Luma for your city. It reads several result pages, keeps events that match your keywords, dates and online setting, removes duplicates and saves **one row per event**.

- **Eventbrite:** any city in the world, or `Online`. Up to 25 result pages for each keyword. Prices and organizer names are added for matching events.
- **Meetup:** any city when you give a **country code**. One search page for each keyword, usually 20–30 events.
- **Luma:** about 85 large cities (for example London, New York, Berlin, Austin, São Paulo, Singapore). Other cities are skipped, not failed.

Start times are in the event's local time with the UTC offset (for example `2026-10-26T18:00:00-05:00`), plus the time zone name.

#### Good fit

- Build a weekly list of tech, music or business events in a city.
- Find events to sponsor, speak at or write about.
- Collect organizer names and event links for outreach research.

#### Not a fit / limits

- It does not log in and does not collect attendee lists, guest emails or host contact details.
- It is not a full archive of a city. Each site shows a limited number of search pages; results change from day to day.
- Some fields are often empty on some sites (for example Meetup prices and venues, or Luma organizers). Empty means "not published", not "free".
- You are responsible for using the data in line with each site's terms and the law in your country.

### Quick start

1. Open the **Input** tab. The form is prefilled with City `London`, Country code `GB`, keyword `AI` and 20 events.
2. Change **City** if you want. **When you change the city, also change Country code** (for example `Berlin` + `DE`, `Austin` + `US` + state `TX`).
3. Click **Start**.
4. Open the **Output** tab and choose the **Events** view. Click `url` to open an event.

Expected result: 20 London AI events, each with a title, start time and link, and most with a venue, organizer and price. With only 20 events, most come from Eventbrite; set **Maximum events** higher to get more Meetup and Luma events too.

### Use cases

| Buyer job                   | Input path                                      | Output entity | Key fields                            | Next integration          |
| --------------------------- | ----------------------------------------------- | ------------- | ------------------------------------- | ------------------------- |
| Weekly city event list      | `location`, `countryCode`, `dateFrom`, `dateTo` | Event         | `title`, `startAt`, `venue`, `url`    | Google Sheets, newsletter |
| Topic events for outreach   | `keywords` (for example `["AI","startup"]`)     | Event         | `title`, `organizer`, `url`           | CRM, spreadsheet          |
| Online events only          | `location`: `Online`, `keywords`                | Event         | `title`, `startAt`, `timezone`, `url` | Calendar, Slack           |
| Free events for a community | `location`, `countryCode`, then filter `isFree` | Event         | `isFree`, `price`, `venue`, `url`     | Spreadsheet               |

### Input

#### Input fields

| Field         | Plain name          | Type         | Required | Default / prefill                  | Allowed values                      | Effect                                                                                                               |
| ------------- | ------------------- | ------------ | -------- | ---------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `location`    | City                | string       | no       | default `London`, prefill `London` | city name in English, or `Online`   | Where to search. `Online` searches online Eventbrite events only.                                                    |
| `countryCode` | Country code        | string       | no       | default empty, prefill `GB`        | 2 letters, for example `US`, `DE`   | Needed for Meetup. Also stops Eventbrite from picking a city with the same name in another country.                  |
| `stateCode`   | US state code       | string       | no       | empty                              | 2 letters, for example `TX`         | For US cities only. Helps Eventbrite and Meetup find the right city.                                                 |
| `keywords`    | Keywords            | string array | no       | default `[]`, prefill `["AI"]`     | 0–5 words, up to 60 characters each | An event is kept if **any** keyword is a whole word in its title, description or category. Empty: all events.        |
| `sources`     | Event sites         | string array | no       | all three                          | `eventbrite`, `meetup`, `luma`      | Which sites to search.                                                                                               |
| `dateFrom`    | From date           | string       | no       | empty                              | `YYYY-MM-DD`                        | Keep events that start on or after this date (event local time).                                                     |
| `dateTo`      | To date             | string       | no       | empty                              | `YYYY-MM-DD`                        | Keep events that start on or before this date (event local time).                                                    |
| `online`      | Online or in person | boolean      | no       | empty                              | `true`, `false` or empty            | `true`: online only. `false`: in person only. Empty: both. Hybrid events with unknown mode are kept only when empty. |
| `maxItems`    | Maximum events      | integer      | no       | default `50`, prefill `20`         | 1–500                               | Maximum events in the result across all sites. The run can return fewer.                                             |

An API call with empty input `{}` searches London on all three sites, with no keywords, up to 50 events. Without `countryCode` Meetup is skipped. Unknown input fields are rejected.

#### Interacting settings

| When                | Input A       | Input B       | Effective behavior                                                                |
| ------------------- | ------------- | ------------- | --------------------------------------------------------------------------------- |
| You change the city | `location`    | `countryCode` | The country code must match the city. A wrong code gives `LOCATION_NOT_RESOLVED`. |
| City is `Online`    | `location`    | `sources`     | Only Eventbrite is searched; Meetup and Luma are skipped.                         |
| No country code     | `countryCode` | `sources`     | Meetup is skipped with `COUNTRY_CODE_REQUIRED`; other sites still run.            |
| Several keywords    | `keywords`    | `maxItems`    | Eventbrite and Meetup search each keyword; results are mixed and deduplicated.    |

#### Input examples

##### AI events in Berlin next month

```json
{
  "location": "Berlin",
  "countryCode": "DE",
  "keywords": ["AI", "startup"],
  "dateFrom": "2026-11-01",
  "dateTo": "2026-11-30",
  "maxItems": 100
}
```

Expected behavior: searches the three sites for each keyword and keeps events in November. Expected output: events with `title`, `startAt`, `venue`, `organizer`, `url`.

##### All events in Austin, Texas

```json
{
  "location": "Austin",
  "countryCode": "US",
  "stateCode": "TX",
  "maxItems": 500
}
```

Expected behavior: reads many result pages; in our test it returned 500 events (473 Eventbrite, 12 Meetup, 15 Luma) in about 2 minutes.

### Output

#### Output fields

| Field         | Meaning                                                                 | Type    | Can be empty? | Example                                               |
| ------------- | ----------------------------------------------------------------------- | ------- | ------------- | ----------------------------------------------------- |
| `source`      | Site where the event was found                                          | string  | no            | `eventbrite`, `meetup`, `luma`                        |
| `eventId`     | Event ID on that site                                                   | string  | no            | `1993713935049`                                       |
| `title`       | Event name                                                              | string  | no            | `BookPeople Presents: Adam Grant - Vibe`              |
| `url`         | Public event page                                                       | string  | no            | `https://www.eventbrite.com/e/...`                    |
| `startAt`     | Start, local time with UTC offset                                       | string  | no            | `2026-10-26T18:00:00-05:00`                           |
| `endAt`       | End, local time with UTC offset                                         | string  | yes           | `2026-10-26T19:00:00-05:00`                           |
| `timezone`    | Time zone name                                                          | string  | yes           | `America/Chicago`                                     |
| `venue`       | Place name                                                              | string  | yes           | `AISD Performing Arts Center`                         |
| `address`     | Street address                                                          | string  | yes           | `1500 Barbara Jordan Boulevard, ...`                  |
| `city`        | City                                                                    | string  | yes           | `Austin`                                              |
| `country`     | Country code                                                            | string  | yes           | `US`                                                  |
| `online`      | Online event                                                            | boolean | yes           | `false`; empty for hybrid events                      |
| `organizer`   | Organizer or group name (never a private person)                        | string  | yes           | `BookPeople`                                          |
| `price`       | Lowest ticket price; `0` can be a free or donation ticket, see `isFree` | number  | yes           | `49.95`                                               |
| `currency`    | Price currency                                                          | string  | yes           | `USD`                                                 |
| `isFree`      | Event is free                                                           | boolean | yes           | `false`                                               |
| `category`    | Category on the site                                                    | string  | yes           | `Hobbies & Special Interest`                          |
| `description` | Short description, plain text, up to 5,000 characters                   | string  | yes           | `BookPeople welcomes Adam Grant ...`                  |
| `sourceUrl`   | Search page where the event was found                                   | string  | no            | `https://www.eventbrite.com/d/tx--austin/all-events/` |
| `fetchedAt`   | When it was read (UTC)                                                  | string  | no            | `2026-10-14T15:03:29.735Z`                            |

In our 500-event Austin test: start time and time zone 100% filled, venue, address and organizer 99%, price 97%, no duplicates.

#### Output entities and surfaces

| Situation                  | Where to look                                                                    | What you see                                             | What to do                             |
| -------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------- |
| Normal run                 | Dataset (**Events** view)                                                        | One row per event                                        | Export or open `url`                   |
| No matching events         | Dataset empty; `RUN_SUMMARY` status `not_found`                                  | 0 rows, run succeeded                                    | Use fewer filters or other keywords    |
| One site failed or skipped | `RUN_SUMMARY` → `sources`                                                        | Run status `partial` or per-site `skipped` with a reason | Use the rows you got; check the reason |
| City not found             | Run failed, `RUN_SUMMARY` reason `LOCATION_NOT_RESOLVED` or `LOCATION_NOT_FOUND` | 0 rows                                                   | Check city spelling and country code   |

The status message shows a short result, for example `complete: 20 events — eventbrite 19 (MAX_ITEMS), meetup 1 (MAX_ITEMS), luma 0 (MAX_ITEMS)`. `MAX_ITEMS` means the limit was reached.

#### Output example

```json
{
  "source": "eventbrite",
  "eventId": "1993713935049",
  "title": "BookPeople Presents: Adam Grant - Vibe",
  "url": "https://www.eventbrite.com/e/bookpeople-presents-adam-grant-vibe-tickets-1993713935049",
  "startAt": "2026-10-26T18:00:00-05:00",
  "endAt": "2026-10-26T19:00:00-05:00",
  "timezone": "America/Chicago",
  "venue": "AISD Performing Arts Center",
  "address": "1500 Barbara Jordan Boulevard, Austin, TX 78723",
  "city": "Austin",
  "country": "US",
  "online": false,
  "organizer": "BookPeople",
  "price": 49.95,
  "currency": "USD",
  "isFree": false,
  "category": "Hobbies & Special Interest",
  "description": "BookPeople welcomes Adam Grant in conversation with Matthew McConaughey to celebrate the release of Vibe.",
  "sourceUrl": "https://www.eventbrite.com/d/tx--austin/all-events/",
  "fetchedAt": "2026-10-14T15:03:29.735Z"
}
```

This is one real row from the Austin example (description shortened). `null` means the site did not publish that value.

### Pricing and limits

#### Pricing unit

The Actor uses **pay per event** pricing:

- **Actor start:** $0.006 once per run (256 MB memory).
- **Event scraped:** one charge per saved event. FREE plan $0.0032, BRONZE $0.00304, SILVER $0.00288, GOLD and higher $0.00272.

A run with no matching events pays only the start fee. A run that fails (wrong input or a city that is not found) also pays the start fee. Events that are not saved are not charged. If you set a maximum cost per run, the Actor stops when it is reached and keeps the saved events (status `partial`, reason `CHARGE_LIMIT`).

#### Cost examples

| Scenario               | Input scope                   | Saved events | FREE plan | GOLD plan |
| ---------------------- | ----------------------------- | -----------: | --------: | --------: |
| No matches             | any                           |            0 |    $0.006 |    $0.006 |
| First run (prefill)    | London, `AI`, 20 events       |           20 |    $0.070 |   $0.0604 |
| City list              | Paris, 2 keywords, 100 events |          100 |    $0.326 |    $0.278 |
| Large city, all events | Austin, 500 events            |          500 |    $1.606 |    $1.366 |

#### Limits

- Up to 500 events per run. A run usually takes 10 seconds to 2 minutes and stops by itself after about 4 minutes.
- Smaller cities and narrow keywords return fewer events. The Actor stops a search when new pages bring no matching events.
- The sites can change their pages or limit requests. A failed site does not stop the other sites.

### API, export and integrations

- **API:** start the Actor with the [Apify API](https://docs.apify.com/api/v2) or the [JavaScript](https://docs.apify.com/api/client/js) / [Python](https://docs.apify.com/api/client/python) client and read the default dataset.
- **Export:** download the dataset as JSON, CSV, Excel, XML or HTML.
- **Scheduling:** use [Apify schedules](https://docs.apify.com/platform/schedules) to run it every week. Each run is a fresh search; compare `source` + `eventId` between runs to find new events.
- **No-code:** send results to Google Sheets, Slack or Zapier with [Apify integrations](https://docs.apify.com/platform/integrations).

#### Use with AI agents (MCP)

- MCP server URL with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/events-aggregator`.
- Smallest useful input: `{"location":"London","countryCode":"GB","keywords":["AI"],"maxItems":20}`.
- Key output fields: `title` (event name), `startAt` (local start time with offset), `venue` (place), `url` (event page), `source` (site).
- A 20-event run takes about 10–20 seconds and costs $0.06–$0.07. Maximum 500 events per run.

### Troubleshooting

#### The dataset is empty

Symptom: run succeeded, status `not_found`.
Likely reason: no event matched all filters.
Action: remove dates or the online filter, use fewer or broader keywords, or leave keywords empty.

#### Wrong city or `LOCATION_NOT_RESOLVED`

Symptom: the run failed, or one site shows `LOCATION_NOT_RESOLVED`.
Likely reason: the country code does not match the city, or the site found a different city with this name.
Action: check the spelling in English and set the right **Country code** (and **US state code** for US cities).

#### A site shows `skipped`

Symptom: `RUN_SUMMARY` → `sources` shows `skipped` for one site.
Likely reason: `LOCATION_NOT_SUPPORTED` (Luma does not cover this city, or Meetup/Luma with `Online`) or `COUNTRY_CODE_REQUIRED` (Meetup without a country code).
Action: this is normal; the other sites still give results. Add a country code for Meetup.

#### Status `partial` with `SOURCE_ERROR`

Symptom: some events saved, one site shows `error` with a reason like `SOURCE_RATE_LIMITED` or `SOURCE_BLOCKED`.
Likely reason: the site was busy or limited requests.
Action: use the saved events, or run again later.

### FAQ

#### Do I need an Eventbrite, Meetup or Luma account?

No. The Actor reads public pages only. It does not need a login, cookies or an API key.

#### Does it collect personal data?

No attendee lists or guest emails. For Luma, personal hosts are not saved; only a group or calendar name is shown as `organizer`.

#### Why do I get fewer events than `maxItems`?

The sites show a limited number of results for a city and keyword, and some events do not match your filters. `maxItems` is a limit, not a promise.

#### Why are some prices empty?

Meetup and Luma often do not publish prices on search pages. Empty means unknown, not free. Check `isFree` and the event page.

#### How fresh are the results?

Every run reads the sites live. `fetchedAt` shows when each event was read.

### Support

For questions, bugs or feature requests, open the **Issues** tab on this Actor page. Include the run ID, your input (without private data) and the reason code from `RUN_SUMMARY`. Never share API tokens or passwords.

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/events-aggregator/changelog.md

# Actor input Schema

## `location` (type: `string`):

City name in English, for example London, Berlin, Austin or São Paulo. Type Online for online events only (Eventbrite).

## `countryCode` (type: `string`):

Two-letter country code, for example GB, US, DE. Needed for Meetup. It also stops Eventbrite from using a city with the same name in another country.

## `stateCode` (type: `string`):

Optional. For US cities only, for example TX for Austin or OR for Portland.

## `keywords` (type: `array`):

Up to 5 keywords. An event is kept if any keyword is a whole word in its title, description or category. Leave empty to get all events.

## `sources` (type: `array`):

Sites to search. Luma covers about 85 big cities. Meetup needs a country code.

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

Optional. Keep events that start on or after this date (YYYY-MM-DD, event local time).

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

Optional. Keep events that start on or before this date (YYYY-MM-DD, event local time).

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

Optional. On: only online events. Off: only in-person events. Leave empty to get both.

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

Maximum events in the result, across all sites. Each saved event is charged, plus a small start fee per run.

## Actor input object example

```json
{
  "location": "London",
  "countryCode": "GB",
  "keywords": [
    "AI"
  ],
  "sources": [
    "eventbrite",
    "meetup",
    "luma"
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

Event title, date, city, venue, ticket/registration URL and available price fields.

## `runSummary` (type: `string`):

Status per site (complete, skipped or error, with reason), counts and request totals.

## `output` (type: `string`):

Compact outcome record for agents and integrations.

# 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 = {
    "location": "London",
    "countryCode": "GB",
    "keywords": [
        "AI"
    ],
    "sources": [
        "eventbrite",
        "meetup",
        "luma"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/events-aggregator").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 = {
    "location": "London",
    "countryCode": "GB",
    "keywords": ["AI"],
    "sources": [
        "eventbrite",
        "meetup",
        "luma",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/events-aggregator").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 '{
  "location": "London",
  "countryCode": "GB",
  "keywords": [
    "AI"
  ],
  "sources": [
    "eventbrite",
    "meetup",
    "luma"
  ],
  "maxItems": 20
}' |
apify call cliqtomedia/events-aggregator --silent --output-dataset

```

## MCP server setup

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

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/XLJ67RACHLkKfqxqE/builds/mfifc3oHAad91OVqT/openapi.json
