# Events Scraper (`steadyfeeds/events-scraper`) Actor

Public events from Eventbrite, Meetup and Luma in one run and one consistent format, with dates, venues and coordinates.

- **URL**: https://apify.com/steadyfeeds/events-scraper.md
- **Developed by:** [christopher tan](https://apify.com/steadyfeeds) (community)
- **Categories:** Travel, Lead generation, AI
- **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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Events Scraper

Find public events across **Eventbrite, Meetup and Luma** in one run, in one consistent format. Dates, venues, coordinates and links, with no login or API key.

Press **Start** to see it work on Singapore.

### One format, three platforms

Each platform structures its data differently. This Actor maps them onto the same 20 fields, so a single spreadsheet holds events from all three:

| Field | Example |
|---|---|
| `name` | `GPT-6 Astra Hackathon: Singapore` |
| `platform` | `eventbrite`, `meetup` or `luma` |
| `startDate` / `endDate` | `2026-09-13T01:30:00Z` (ISO 8601, UTC) |
| `timezone` | `Asia/Singapore` |
| `venueName` / `address` / `city` / `country` | `Suntec Singapore` |
| `latitude` / `longitude` | Ready to plot on a map |
| `isOnline` | `true` for virtual events |
| `organizer` | Who is running it |
| `description` | Event summary, HTML stripped |
| `imageUrl` / `ticketsUrl` | Cover image and checkout link |
| `searchLocation` / `searchKeyword` | Which of your searches produced the row |

### Results are interleaved, not first-come

A small limit would otherwise be used up entirely by whichever platform was fetched first. Results are interleaved across platforms, so asking for 30 events in Singapore returns a genuine mix rather than 30 Eventbrite rows and nothing else. Where one platform is thin, the others fill the gap.

### What people use it for

- **Event discovery and aggregation.** Build a local events page or newsletter without checking three sites by hand.
- **Community and developer relations.** See which meetups and conferences are running in a city, and who organises them.
- **Sponsorship and venue research.** Find recurring events by size, venue and theme.
- **Market research.** Track how much activity a topic generates in a city over time.
- **Feeding AI agents.** Clean event records with real timestamps and coordinates.

### Input

| Setting | What it does |
|---|---|
| **Locations** | Cities such as `Singapore`, `Austin, Texas`, `Berlin`. Each searched on every selected platform. |

| **Keyword** | Narrow to `tech`, `yoga`, `startup` and so on. |
| **Platforms** | Any combination of Eventbrite, Meetup and Luma. |
| **Max events per location** | Default 100, interleaved across platforms. |
| **Online events only** | Keep just virtual events. |

### Writing locations so Meetup works

Eventbrite accepts any city name. Meetup needs to know the country, and if it cannot tell, it quietly returns events from somewhere else entirely. Rather than pass that on to you, this Actor resolves the country itself and **skips Meetup with an explanation** when it cannot.

So write locations either way:

```
Singapore            # well-known cities resolve on their own
Berlin
Lyon, France         # "City, Country" always works
Austin, Texas        # "City, State" for the US
fr--Lyon             # a Meetup slug, if you already have one
```

### What it cannot do, and why

Worth knowing before you plan a job:

- **Coverage differs by platform, and gaps are left empty rather than guessed.** Eventbrite gives the deepest results, with pagination into the thousands per city, plus timezone and ticket links, but its search payload carries no organizer name. Meetup returns a page of about a dozen events with organizer and description but no end time or coordinates. Luma publishes one global discover feed rather than a per-city search, so it is fetched once per run and ignores both the location and the keyword.
- **No ticket prices.** None of the three publishes price in its search payload. You get the checkout link where available.
- **No attendee data.** Public listings only.
- **Keyword search does not reach Luma.** Its feed is curated and takes no query.
- **Duplicates are removed across the whole run**, so an event matching two of your searched locations is returned once rather than billed twice. The same event cross-posted to two different platforms will still appear twice, tagged with each source, so you can decide what to keep.
- **Meetup is skipped for locations whose country cannot be determined**, with a message naming the location. This is deliberate: Meetup returns another city's events rather than an error, and wrong data is worse than none.

### More tools from steadyfeeds

- [Job Board Scraper](https://apify.com/steadyfeeds/job-board-scraper) — every open role from company career pages across eight systems.
- [Airbnb Listings Scraper](https://apify.com/steadyfeeds/airbnb-listings-scraper) — search Airbnb and export prices, ratings and coordinates.
- [Airbnb Listing Details Scraper](https://apify.com/steadyfeeds/airbnb-listing-details) — full detail for a listing: amenities, rules, host and photos.
- [Telegram Channel Scraper](https://apify.com/steadyfeeds/telegram-channel-scraper) — export posts from public Telegram channels.

### Notes

Reads the same public listing pages you can open in a browser. No headless browser is used, so runs are fast and cheap.

Something broken or a platform you need added? Open an issue on this Actor and I will take a look.

# Actor input Schema

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

Cities to search. Meetup needs a country, so write "City, Country" ("Lyon, France") or "City, State" for the US ("Austin, Texas"). Well-known cities like Singapore, Berlin or Tokyo work on their own. Eventbrite accepts any of these forms.

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

Narrow the search, for example "tech", "yoga" or "startup". Leave empty for all events. Note that Luma's feed does not accept a keyword.

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

Which platforms to search. All three by default.

## `maxEventsPerLocation` (type: `integer`):

Results are interleaved across platforms, so a small limit still returns a mix rather than filling up from one source.

## `onlineOnly` (type: `boolean`):

Keep only events the platform marks as online or virtual.

## Actor input object example

```json
{
  "locations": [
    "Singapore"
  ],
  "platforms": [
    "eventbrite",
    "meetup",
    "luma"
  ],
  "maxEventsPerLocation": 100,
  "onlineOnly": false
}
```

# Actor output Schema

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

All scraped events as JSON.

## `spreadsheet` (type: `string`):

The same results as an .xlsx spreadsheet.

## `csv` (type: `string`):

The same results as a CSV file.

# 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": [
        "Singapore"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyfeeds/events-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": ["Singapore"] }

# Run the Actor and wait for it to finish
run = client.actor("steadyfeeds/events-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": [
    "Singapore"
  ]
}' |
apify call steadyfeeds/events-scraper --silent --output-dataset

```

## MCP server setup

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