# Luma Scraper (`normdata/luma-scraper`) Actor

Scrape Luma (lu.ma) events in any city, country or worldwide, or from any calendar: date, venue, GPS, ticket price, spots left, guest count, and hosts with LinkedIn, X, Instagram and website. Filter by category, keyword, date, price. Optional description and ticket types.

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

## Pricing

from $10.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.
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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 📅 Luma Scraper

Extract events from **Luma (lu.ma / luma.com)** in any city, state, country or the whole world, or from any calendar and community. Each event comes with date and local time, venue, address and GPS, ticket price, spots left, guest count, registration status, and the **hosts with their LinkedIn, X, Instagram, TikTok, YouTube and website**, plus the organising calendar's socials. Filter by category, keyword, date, price, in person or online, and open registration. Turn on **event details** for the full description, every ticket type with its capacity and spots left, categories, refund policy and registration questions.

### 🎯 Who uses it?

#### 🤝 Sales and partnerships teams

Find the people running AI, tech, crypto or founder events in your market, with their LinkedIn and X, and reach them first.

#### 📣 Event marketers and community managers

Map every competing event in your city and dates, see which ones sell out, and spot communities worth partnering with.

#### 🗓️ Event listing sites, newsletters and apps

Fill "what's on this week" pages, city guides and alerts with fresh events, cover images, GPS and ticket links.

#### 📊 Analysts and investors

Track which topics, cities and communities are growing: events per week, attendance, paid vs free, past events of any calendar.

### ✨ What it does

- **Any place.** A city ("Berlin"), "City, Country", a state ("California"), a country ("Germany"), **Worldwide**, or "latitude, longitude". Several in one run.
- **Your radius.** Search 5 km or 500 km around a city instead of Luma's usual ~50 km.
- **Any Luma link.** Calendars and communities (all their events), single events, city pages and category pages. Old lu.ma links work.
- **Past events of calendars,** newest first, with attendance.
- **Filters:** 12 categories (Tech, AI, Crypto, Arts & Culture, Food & Drink, Climate, Fitness, Wellness, Running, Books, Games, Family), keywords, date range (exact or "+7 days"), in person or online, free or paid, min and max ticket price, open for registration only.
- **People, not just events.** Every host and featured guest with Luma profile, bio, website and social links.
- **Optional event details** in the same row: description, ticket types, categories, refund policy, registration questions, sessions.

### 🏆 Why this scraper

- **Fast.** 1,000 events in about 25 seconds, 1,000 with full details in about a minute.
- **Countries and the world, not just Luma's city list.** Searches whole countries, states and continents, and keeps only events inside the country you asked for.
- **Lead-ready.** Host and calendar socials as clickable links (LinkedIn, X, Instagram, TikTok, YouTube, website).
- **Clean data.** Prices as numbers, local and UTC times, no duplicates across places, categories and links.
- **No proxy needed.** Nothing extra to set up or pay for.

### ⚖️ How it compares

Based on each Actor's public input options (October 2026).

| Capability | This actor | solidcode | aitorsm | haketa | hypebridge | matyascimbulka |
|---|:--:|:--:|:--:|:--:|:--:|:--:|
| Several places in one run | **yes** | one city (more via links) | no (one city) | yes | via links | yes |
| Countries, states, worldwide | **yes** | no | no | no | no | no |
| Custom radius | **yes** | no | no | no | no | no |
| Calendar / community links | **yes** | yes | yes | yes | yes | no |
| Past events of calendars | **yes** | no | yes | no | no | no |
| Categories | **12** | 8 | 8 | 8 | via links | yes |
| Keyword filter | **yes** | yes | no | no | no | no |
| Date range | **yes** | yes | no | no | no | no |
| In person / online filter | **yes** | yes | no | no | no | no |
| Free / paid filter | **yes** | yes | no | no | no | no |
| Min and max price | **yes** | no | no | no | no | no |
| Open registration only | **yes** | no | no | no | no | no |
| Event details (description, tickets) | **yes** | yes | description only | yes | yes | no |
| Proxy needed | **no** | no | no | optional | no | no |

### 📦 What data you get

| Field | Description |
| --- | --- |
| `eventId`, `name`, `url`, `platform`, `coverImage` | Luma ID, title, event page and cover image. `platform` is `external` for events a calendar lists on another site (Partiful, Eventbrite...). |
| `startAt`, `endAt` | Start and end in UTC. |
| `startLocal`, `endLocal`, `timezone` | Start and end in the event's local time ("2026-10-12 18:30") and its time zone. |
| `locationType`, `isOnline` | In person or online. |
| `venue`, `fullAddress`, `city`, `region`, `country`, `countryCode`, `latitude`, `longitude` | Where it happens (null when the host hides the address until you register). |
| `isFree`, `price`, `maxPrice`, `currency`, `flexiblePrice` | Cheapest paid ticket and dearest ticket (as Luma shows them), and pay-what-you-want. |
| `registrationStatus`, `soldOut`, `spotsRemaining`, `nearCapacity`, `requiresApproval`, `waitlist` | Can you still get in, and how many spots are left. |
| `guestCount`, `ticketCount` | People going and tickets issued. With details on, hidden guest lists are counted from the tickets. |
| `calendarId`, `calendarName`, `calendarUrl`, `calendarDescription`, `calendarVerified` | The calendar or community that runs it (null for personal calendars). |
| `calendarWebsite`, `calendarTwitter`, `calendarLinkedin`, `calendarInstagram`, `calendarTiktok`, `calendarYoutube` | The calendar's links. |
| `hosts`, `featuredGuests` | `name`, `username`, `profileUrl`, `bio`, `website`, `twitter`, `linkedin`, `instagram`, `tiktok`, `youtube`, `verified`. |
| `searchLocation`, `searchCategory` | Which of your places, calendars or categories found it. |
| `description` | *(details)* Full description as plain text. |
| `categories` | *(details)* Luma's categories for the event. |
| `ticketTypes` | *(details)* `name`, `price`, `minPrice`, `currency`, `flexible`, `capacity`, `spotsRemaining`, `registered`, `requiresApproval`, `salesStart`, `salesEnd`, `description`. |
| `refundPolicy`, `registrationQuestions`, `phoneRequired`, `sessions` | *(details)* Refund terms, what the sign-up form asks, and multi-session schedules. |
| `scrapedAt` | When the row was collected (UTC). |
| `error` | Only present when an event's details didn't load. |

#### Example row (trimmed)

```json
{
  "eventId": "evt-plkQDIgx2uXuvPr",
  "name": "TFOT: Global Innovation Showcase: Deep Tech, Dual Tech, FinTech, Web3, Global Expansion and Scaling at SF War Memorial",
  "url": "https://luma.com/tfot-globalinnovationshowcase2026",
  "platform": "luma",
  "startAt": "2026-10-06T18:00:00.000Z",
  "endAt": "2026-10-07T02:00:00.000Z",
  "startLocal": "2026-10-06 11:00",
  "endLocal": "2026-10-06 19:00",
  "timezone": "America/Los_Angeles",
  "locationType": "offline",
  "isOnline": false,
  "venue": "War Memorial Veterans Building",
  "fullAddress": "War Memorial Veterans Building, 401 Van Ness Ave, San Francisco, CA 94102, USA",
  "city": "San Francisco",
  "region": "California",
  "country": "United States",
  "countryCode": "US",
  "latitude": 37.7795732,
  "longitude": -122.42101,
  "isFree": false,
  "price": 10,
  "maxPrice": 500,
  "currency": "USD",
  "registrationStatus": "open",
  "soldOut": false,
  "spotsRemaining": null,
  "requiresApproval": true,
  "guestCount": 327,
  "ticketCount": 0,
  "calendarId": "cal-Q32MaXasljdNP0W",
  "calendarName": "Orbis86 Events",
  "calendarUrl": "https://luma.com/orbis86",
  "calendarDescription": "Web3 and AI events hosted by Orbis86 globally | 50k+ followers across Twitter, Discord, Newsletter | 6000+ people hosted | 30+ Events hosted",
  "calendarWebsite": "https://orbis86.com",
  "calendarTwitter": "https://x.com/orbis86_x",
  "calendarLinkedin": "https://www.linkedin.com/company/thefutureoftech",
  "calendarInstagram": "https://www.instagram.com/orbis86.x",
  "hosts": [
    {
      "name": "Alina Aeby",
      "username": null,
      "profileUrl": "https://luma.com/user/usr-MChnoFcRFzQ29B4",
      "bio": "Founder & President, Silicon Valley PropTech Association (SVPA). Global partnerships in digital infrastructure, innovation, economic dev.",
      "website": "https://www.svproptech.com",
      "twitter": null,
      "linkedin": "https://www.linkedin.com/in/alina-aeby-80295120",
      "instagram": null,
      "tiktok": null,
      "youtube": null,
      "verified": false
    },
    {
      "name": "OffChain Global",
      "username": "offchainsf",
      "profileUrl": "https://luma.com/user/offchainsf",
      "bio": "Network of Web3 & entrepreneur professionals with over 70 chapters globally.",
      "website": "https://www.offchain.social",
      "twitter": "https://x.com/offchainglobal",
      "linkedin": "https://www.linkedin.com/in/kennimsf",
      "instagram": null,
      "tiktok": null,
      "youtube": null,
      "verified": false
    }
  ],
  "searchLocation": "San Francisco",
  "searchCategory": "AI",
  "description": "You've heard what's next. Now meet who's making it happen.\nThis October, get inside the room where founders, investors, government leaders, veterans, and technology pione...",
  "categories": [
    "AI",
    "Crypto"
  ],
  "ticketTypes": [
    {
      "name": "Standard",
      "price": 0,
      "minPrice": null,
      "currency": null,
      "flexible": false,
      "capacity": null,
      "spotsRemaining": null,
      "registered": 308,
      "requiresApproval": true,
      "salesStart": null,
      "salesEnd": null,
      "description": null
    },
    {
      "name": "Friends of Tech",
      "price": 10,
      "minPrice": null,
      "currency": "USD",
      "flexible": false,
      "capacity": null,
      "spotsRemaining": null,
      "registered": 12,
      "requiresApproval": false,
      "salesStart": null,
      "salesEnd": null,
      "description": "Instant confirmation. Support this event and the emerging tech community ❤\n\nNote: All ticket sales are final and non refundable"
    }
  ],
  "registrationQuestions": [
    "Please share your LinkedIn Profile URL",
    "Please let us know why you want to attend the event.",
    "How do you identify yourself? Please choose all that apply",
    "If you are a Funder or a Founder, please select one and what stage of funding you are raising or funding?"
  ],
  "scrapedAt": "2026-10-04T03:58:21.246Z"
}
```

### 💡 Use cases

#### 🤖 Every AI event in California, with the hosts' LinkedIn

```json
{ "locations": ["California"], "categories": ["ai"], "maxItems": null }
```

#### 🌍 Paid tech events worldwide next month

```json
{ "locations": ["Worldwide"], "categories": ["tech"], "dateFrom": "+1 days", "dateTo": "+30 days", "price": "paid", "maxItems": 2000 }
```

#### 🗓️ A community's whole history, with descriptions and tickets

```json
{ "urls": ["https://luma.com/genai-sf"], "includePast": true, "includeDetails": true }
```

#### 🚀 Founder and hackathon events you can still join in London

```json
{ "locations": ["London"], "searchTerms": ["founder", "hackathon", "startup"], "availableOnly": true }
```

#### 📍 Free events within 5 km of a point

```json
{ "locations": ["40.7128, -74.006"], "radiusKm": 5, "price": "free" }
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum events** | Always first, caps the whole run. Empty means no limit. |
| **Where** | Places, radius, Luma links, and past events of calendars. |
| **Filters** | Categories, keywords, dates, in person or online, price, open registration. |
| **What to include** | Event details (optional). |

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per event saved to your dataset. The price depends on your Apify plan tier:

| Your Apify plan | Price per event |
| --- | --- |
| Free | $0.013 |
| Bronze | $0.012 |
| Silver | $0.011 |
| Gold / Platinum / Diamond | $0.010 |

Approximate total cost:

| Events collected | Free | Bronze | Silver | Gold+ |
| --- | --- | --- | --- | --- |
| 100 | $1.30 | $1.20 | $1.10 | $1.00 |
| 1,000 | $13.00 | $12.00 | $11.00 | $10.00 |
| 10,000 | $130.00 | $120.00 | $110.00 | $100.00 |

Event details are included in the price, not billed again. No proxy costs. New Apify accounts start with $5 in free credit. On the Free plan a run saves up to 10 events.

**Speed:** 1,000 events in about 25 seconds, about a minute with details. Luma limits how fast one visitor can search, so a run with many places or categories takes a little longer.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Luma Scraper.
3. Type a place (or keep the prefilled one), or paste Luma links, add filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API (`run-sync-get-dataset-items`) or the ApifyClient for JavaScript and Python, and schedule it with Apify's built-in Scheduler to catch new events every day.

### 🤖 Use with AI agents (MCP)

Give an AI agent live access to Luma events through the Model Context Protocol:

```
claude mcp add --transport http apify "https://mcp.apify.com?tools=normdata/luma-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### 🔧 Troubleshooting

**A place was skipped.**
Add the country ("Valencia, Spain"), or type "latitude, longitude".

**No online events.**
Luma's map search only lists in-person events. Online events come from calendar links.

**Some events have no address.**
The host hides it until you register. City, country and GPS are usually still there.

**Some rows have `platform: external`.**
A calendar listed an event hosted on another site. You get its name, date, place and link; it has no Luma details.

**The run slows down for a while.**
Luma limits how fast one visitor can search. The Actor waits and carries on by itself; nothing is lost.

**Some rows have an `error`.**
That event's details didn't load. The rest of the row is complete.

### ❓ FAQ

| Question | Answer |
| --- | --- |
| Do I need a Luma account? | No. Only public data is read. |
| Does it need a proxy? | No. |
| Can I get attendee lists? | No. Only the guest count and the featured guests Luma shows publicly. |
| Can I get past events? | Yes, for calendars: paste the calendar link and turn on **Past events of calendars**. |
| Can I scrape a whole country? | Yes. Type the country name, and leave the maximum empty for every event. |
| Can I track new events? | Yes. Schedule the same input daily with Apify's Scheduler and compare runs. |

### 🛡️ Limits & responsible use

This Actor reads only public data from Luma. It never signs in and never registers for events. Host profiles are personal data: handle them in line with privacy law in your country (GDPR, CAN-SPAM...), and use the data in line with Luma's terms.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

### 🧪 Local development

```powershell
bun install
bun run typecheck
bun test/qa.mjs
apify run
```

Local results are stored in `storage/datasets/default`.

# Actor input Schema

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

Stop after this many events. Leave empty for no limit (every event that matches). The Apify Free plan is always capped at 10.

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

A city ("San Francisco", "London"), "City, Country" ("Valencia, Spain"), a state ("California"), a country ("Germany"), "Worldwide", or "latitude, longitude". A city covers about 50 km around it.

## `radiusKm` (type: `integer`):

Search this far around each city or point instead of Luma's usual ~50 km. Leave empty for the default.

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

Calendars and communities (luma.com/genai-sf: all their events), single events (luma.com/abc123), city pages (luma.com/sf) or category pages (luma.com/ai). lu.ma links work too.

## `includePast` (type: `boolean`):

For calendar links, also collect their past events (with attendance), newest first.

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

Keep events in any of these Luma categories. Leave empty for all.

## `searchTerms` (type: `array`):

Keep events whose name, calendar or host mentions any of these words, e.g. "founders", "hackathon", "yoga".

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

A date (2026-11-20) or a relative one ("+7 days"). Leave empty for today.

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

A date (2026-12-31) or a relative one ("+30 days"). Events starting up to this day.

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

Luma's map search only lists in-person events; online events come from calendar links.

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

Free events, paid events, or both.

## `minPrice` (type: `integer`):

Cheapest ticket, in the event's own currency.

## `maxPrice` (type: `integer`):

Cheapest ticket, in the event's own currency. 0 keeps free events only.

## `availableOnly` (type: `boolean`):

Skip sold-out events, waitlists and closed registrations.

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

Reads each event for its full description, every ticket type with price and spots left, categories, refund policy and registration questions. Slower: about 20 events per second.

## Actor input object example

```json
{
  "maxItems": 10,
  "locations": [
    "San Francisco"
  ]
}
```

# Actor output Schema

## `events` (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": 10,
    "locations": [
        "San Francisco"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/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 = {
    "maxItems": 10,
    "locations": ["San Francisco"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/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 '{
  "maxItems": 10,
  "locations": [
    "San Francisco"
  ]
}' |
apify call normdata/luma-scraper --silent --output-dataset

```

## MCP server setup

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