# Luma Events Scraper – lu.ma Events, Tickets & Organizers (`scrapeworkshq/luma-scraper`) Actor

Scrape Luma (lu.ma / luma.com) events by city, category, organizer calendar or URL: date, venue, ticket prices, sold-out, spots left, guest count, description and organizer website & socials. New-event monitor. No login, no proxy.

- **URL**: https://apify.com/scrapeworkshq/luma-scraper.md
- **Developed by:** [Scrapeworks HQ](https://apify.com/scrapeworkshq) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Luma Events Scraper – lu.ma Events, Ticket Prices, Sold-Out & Organizers

Scrape **Luma (lu.ma / luma.com) events** by **city** (80+ cities worldwide), **category** (AI, tech, crypto, climate, arts, food…), **organizer calendar**, **any coordinates** or single **event URL**. Get date & time zone, venue and full address, ticket prices for every ticket type, sold-out status, spots remaining, guest count, full description, categories and the organizer's website and social links. Built-in **new-event monitor** – schedule it and get only new or changed events. No login, no proxy, no browser – fast and cheap.

### 🚀 Quick start (60 seconds)

1. Paste Luma pages into **Luma URLs**, e.g. `https://luma.com/nyc`, `https://luma.com/ai`, an organizer calendar `https://luma.com/<calendar>` or an event `https://lu.ma/<event>`. Or just type cities (`London`, `Berlin`) or categories (`crypto`).
2. Optional: filters (keywords, free/paid, in-person/online, date range, only open events) and **Max events per source**.
3. Click **Start** and export to JSON, CSV, Excel or Google Sheets.

```json
{
  "startUrls": ["https://luma.com/sf", "https://luma.com/southparkcommons-events"],
  "cities": ["New York", "London"],
  "categories": ["ai"],
  "priceFilter": "any",
  "maxEventsPerSource": 100
}
```

#### Sample output

```json
{
  "eventId": "evt-Mhu0MM7WcH2hVNl",
  "name": "Undefined + EvolveDigital / Oct 22nd 2026",
  "url": "https://luma.com/undefined-20261022",
  "startAt": "2026-10-22T22:00:00.000Z",
  "endAt": "2026-10-23T01:00:00.000Z",
  "timezone": "America/New_York",
  "locationType": "offline",
  "isOnline": false,
  "venueName": "Automattic",
  "fullAddress": "Automattic, 166 Crosby St, New York, NY 10012, USA",
  "city": "New York",
  "sublocality": "NoHo",
  "region": "New York",
  "country": "United States",
  "countryCode": "US",
  "latitude": 40.7258728,
  "longitude": -73.9954015,
  "addressVisibility": "public",
  "isFree": false,
  "minPrice": 10,
  "maxPrice": 10,
  "currency": "USD",
  "isFlexiblePrice": false,
  "isSoldOut": false,
  "spotsRemaining": 43,
  "isNearCapacity": false,
  "requireApproval": false,
  "registrationStatus": "open",
  "waitlistActive": false,
  "guestCount": 57,
  "coverUrl": "https://images.lumacdn.com/uploads/y5/b9090853-35f8-463d-9061-7f6c2d62021c.png",
  "organizerName": "Undefined by Design Systems House",
  "organizerIsPersonal": false,
  "organizerCalendarId": "cal-WQdHOC8maJn4fyw",
  "organizerUrl": "https://luma.com/undefined-live",
  "organizerDescription": "Undefined is research at play. An in-person event that asks people in the industry questions about usability and best practices in tech.",
  "organizerWebsite": "https://undefined.ds.house",
  "organizerVerified": false,
  "organizerAvatarUrl": "https://images.lumacdn.com/calendars/wn/a056527a-975c-460e-8a5f-829e750afd4e.png",
  "organizerTwitter": "designsyshouse",
  "organizerInstagram": "designsyshouse",
  "organizerLinkedin": "https://www.linkedin.com/company/designsyshouse",
  "organizerYoutube": "designsyshouse",
  "featuredCity": "New York",
  "sourceType": "city",
  "source": "New York",
  "categories": [
    "Games",
    "Tech"
  ],
  "ticketTypes": [
    {
      "name": "Standard",
      "type": "fiat-price",
      "price": 10,
      "currency": "USD",
      "maxCapacity": null,
      "spotsRemaining": null,
      "registered": 57,
      "requireApproval": false,
      "soldOutOrDisabled": false
    }
  ],
  "ticketCount": 57,
  "hasAvailableTickets": true,
  "relatedCalendars": [],
  "scrapedAt": "2026-10-21T22:52:58.122Z",
  "descriptionText": "A live game show for people who build on the web\n\nEvolveDigital and Undefined are teaming up at Automattic's NoHo office ahead of EvolveDigital NYC, the two-day…"
}
```

With **Include details** on (default, no extra charge) every event also has `descriptionText`, `categories` and `ticketTypes` (name, price, currency, capacity, spots remaining, registrations per ticket type).

### Why this Luma scraper?

- **Every way in**: city, category, organizer calendar (future + optional past events), lat/lng anywhere in the world, or single event URLs – mix them in one run, duplicates removed.
- **Ticket intelligence**: min/max price, currency, flexible pricing, every ticket type, sold-out, spots left, near-capacity, waitlist, approval required, guest count.
- **Organizer data for outreach & partnerships**: organizer name, Luma calendar URL, website, X/Twitter, Instagram, LinkedIn, YouTube (organizations only – personal calendars are anonymized).
- **Monitor mode**: get only new events in your city/category each day, or price / sold-out changes. Skipped events are free.
- **Flat CSV output** & **webhook summary** for Zapier, Make, n8n, Slack.
- **Cheap**: $2.25 per 1,000 events, details included – 25% below the next cheapest popular Luma scraper and up to 90% below others.

### Use cases

- Event discovery newsletters, city guides and "what's on" apps
- Sponsorship, partnership and B2B lead generation (find active AI / crypto / startup community organizers)
- Market research on the tech-event scene: pricing, capacity and attendance by city or topic
- Feed AI agents / RAG pipelines with up-to-date local events
- Track competitors' events and sell-outs

### Input

| Field | Description |
|---|---|
| `startUrls` | Luma city, category, calendar or event URLs (lu.ma or luma.com). |
| `cities`, `categories` | Luma discover cities (e.g. `nyc`, `London`, `tokyo`) and categories (`ai`, `tech`, `crypto`…). |
| `nearCoordinates` | `"lat,lng"` – events near any point. |
| `categoriesAlsoAsStandaloneFeeds` | With categories + locations, also scrape the full city feeds (default: category × location only). |
| `keywords` / `excludeKeywords` | Include/exclude by words in name/organizer. |
| `priceFilter`, `onlyAvailable`, `locationType` | Free/paid, drop sold-out/closed, in-person/online. |
| `dateFrom`, `dateTo` | Start-date window. |
| `includePastCalendarEvents` | Also past events of organizer calendars. |
| `includeDetails` | Description, categories, ticket types, venue address (default on, free). |
| `maxEventsPerSource`, `maxResultsTotal` | Limits (0 = all). |
| `monitorMode`, `monitorKey`, `outputFormat`, `summaryWebhookUrl` | Monitoring & output options (see below). |

### Output

One row per event. Dataset views: **Overview**, **Organizers** and **Changes**. Key fields: `eventId`, `name`, `url`, `startAt`, `endAt`, `timezone`, `locationType`, `venueName`, `fullAddress`, `city`, `region`, `country`, `latitude`, `longitude`, `isFree`, `minPrice`, `maxPrice`, `currency`, `isSoldOut`, `spotsRemaining`, `isNearCapacity`, `registrationStatus`, `waitlistActive`, `guestCount`, `organizer*`, `descriptionText`, `categories`, `ticketTypes`, `scrapedAt`. A run summary is saved to the key-value store as `SUMMARY`.

### ⭐ Unique: Monitor mode, CSV-ready output & webhook summary

- **Monitor mode** remembers events between runs (per `monitorKey`): `all` adds `changeType` (new / changed / unchanged) and a field diff; `changes` outputs only new or changed events (price, sold-out, spots left, date…); `onlyNew` outputs only brand-new events. Skipped events are **not charged**.
- **Flat output** turns nested fields into columns – perfect for Google Sheets.
- **Summary webhook** POSTs counts and highlights to your Zapier / Make / n8n / Slack URL at the end of each run.

Tip: schedule daily with `cities: ["nyc"]`, `categories: ["ai"]`, `monitorMode: "onlyNew"` for a daily new-events feed.

### 💰 Pricing (pay per result)

| Event | Price |
|---|---|
| Run start | $0.00005 |
| Event (details included) | **$2.25 / 1,000** |

Filtered-out events and monitor-skipped events are free. 100 events ≈ $0.23.

### Notes & limitations

- Luma city pages list the curated upcoming events of that city. Category feeds are location-based: the Actor combines each category with each city/coordinate you give (e.g. `categories: ["ai"]` + `cities: ["London"]` = AI events in London); with no location, Luma uses the area near the server (US East).
- Some organizers hide the exact address until you register – then `venueName`/`fullAddress` are empty and only city / neighborhood / approximate coordinates are given.
- Private, invite-only or unlisted events are not accessible.

### Legal & privacy

Only publicly listed event information is collected. The Actor does **not** collect guest lists, attendee names, host personal profiles, emails or phone numbers; calendars owned by an individual are anonymized (`organizerIsPersonal: true`). You are responsible for using the data in line with Luma's terms and applicable law (GDPR/CCPA).

### 🔌 Integrations & API

Use the Apify API, JavaScript/Python clients, Zapier, Make, n8n, Google Sheets, Slack or webhooks. Works as an MCP tool for AI agents.

### ❓ More FAQ

**Does it need a Luma account or proxy?** No.
**Which cities are supported?** All Luma discover cities (NYC, SF, LA, London, Berlin, Paris, Tokyo, Seoul, Dubai… 80+); any other place via coordinates.
**Can I get past events?** Yes, for organizer calendars with `includePastCalendarEvents`.

### Changelog

- 1.0 – Initial release: cities, categories, calendars, coordinates, events; ticket types; monitor mode; flat output; webhook summary.

# Actor input Schema

## `startUrls` (type: `array`):

Any Luma page: a city (https://luma.com/nyc), a category (https://luma.com/ai), an organizer calendar (https://luma.com/<calendar-slug>) or a single event (https://lu.ma/<event>). lu.ma and luma.com both work.

## `cities` (type: `array`):

Luma discover cities by name or slug, e.g. "New York", "london", "berlin", "tokyo" (80+ cities worldwide). For any other place use Near coordinates.

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

Luma categories: ai, tech, crypto, climate, arts, food, fitness, wellness, running, books, games, family. Categories are location-based: combined with every city / coordinate you add (e.g. ai + London = AI events in London). With no location, Luma picks the area near the server (US East).

## `nearCoordinates` (type: `array`):

Events near any point, e.g. "30.2672,-97.7431" (Austin). Useful for towns that are not a Luma city.

## `categoriesAlsoAsStandaloneFeeds` (type: `boolean`):

When categories AND cities/coordinates are given, the Actor scrapes category × location only. Turn on to also scrape the full city/nearby feeds.

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

Keep events whose name or organizer contains any of these (case-insensitive).

## `excludeKeywords` (type: `array`):

Drop events whose name contains any of these.

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

Filter by ticket price.

## `onlyAvailable` (type: `boolean`):

Drop sold-out events and events with closed registration.

## `locationType` (type: `string`):

In-person vs. online/virtual events.

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

Only events starting on/after this date (YYYY-MM-DD).

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

Only events starting on/before this date (YYYY-MM-DD).

## `includePastCalendarEvents` (type: `boolean`):

For organizer calendar URLs, also scrape their past events (great for organizer research).

## `includeDetails` (type: `boolean`):

Fetches each event page for full description text, categories, every ticket type with price/capacity/registrations and the venue address. Included in the price – no extra charge.

## `maxEventsPerSource` (type: `integer`):

0 = all events (a city has typically 50–500 upcoming events, a category thousands).

## `maxResultsTotal` (type: `integer`):

0 = no overall limit.

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

How many sources to scrape at once.

## `monitorMode` (type: `string`):

Remembers items from previous runs (per Monitor key) and adds changeType = new/changed/unchanged plus a field-level diff. In the two 'only' modes, unchanged/old items are not output and not charged.

## `monitorKey` (type: `string`):

Name of the memory used by Monitor mode. Use a different key per schedule/task (e.g. 'competitor-a-daily'), so separate watchlists don't mix.

## `outputFormat` (type: `string`):

Flat makes CSV/Excel/Google Sheets exports one clean column per field.

## `summaryWebhookUrl` (type: `string`):

At the end of the run, POST a compact JSON summary (counts, new/changed, price drops, dataset ID) to this URL – e.g. Zapier/Make/n8n catch hook or Slack workflow. Free.

## Actor input object example

```json
{
  "startUrls": [
    "https://luma.com/sf",
    "https://luma.com/ai"
  ],
  "categoriesAlsoAsStandaloneFeeds": false,
  "priceFilter": "any",
  "onlyAvailable": false,
  "locationType": "any",
  "includePastCalendarEvents": false,
  "includeDetails": true,
  "maxEventsPerSource": 50,
  "maxResultsTotal": 0,
  "maxConcurrency": 3,
  "monitorMode": "off",
  "monitorKey": "default",
  "outputFormat": "full"
}
```

# Actor output Schema

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

All scraped items in the default dataset

## `overview` (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 = {
    "startUrls": [
        "https://luma.com/sf",
        "https://luma.com/ai"
    ],
    "maxEventsPerSource": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapeworkshq/luma-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 = {
    "startUrls": [
        "https://luma.com/sf",
        "https://luma.com/ai",
    ],
    "maxEventsPerSource": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapeworkshq/luma-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 '{
  "startUrls": [
    "https://luma.com/sf",
    "https://luma.com/ai"
  ],
  "maxEventsPerSource": 50
}' |
apify call scrapeworkshq/luma-scraper --silent --output-dataset

```

## MCP server setup

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