# Luma Event Scraper (`sleepmodesystems/luma`) Actor

$2 / 1K events · Every upcoming Luma event on the map, ~20,000 in ~140 countries · any city, radius or box, 12 categories, calendars with past events · hosts' LinkedIn and X, ticket tiers, new-events monitor · no login, no proxy

- **URL**: https://apify.com/sleepmodesystems/luma.md
- **Developed by:** [Sleep Mode Systems](https://apify.com/sleepmodesystems) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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

Luma Event Scraper extracts public events from Luma (https://luma.com, formerly lu.ma): name, local date and time, venue with coordinates, ticket prices in the event's own currency, registration status, guest count, the organizing calendar and the hosts with their LinkedIn, X, Instagram, YouTube, TikTok and website links. It reads **Luma's whole event map**, not only Luma's 87 city pages: ~20,000 upcoming in-person events in ~140 countries in one run, any city, point, box or radius, and every one of Luma's 12 categories. Calendars and hosts come with their past events too.

**Price: $2 / 1K events, less on higher Apify tiers, details included. Luma's whole map, ~20,000 events in ~140 countries, in under 30 minutes, no proxy; 1,000 events with full details in under 2 minutes.**

### What does the Luma Event Scraper extract?

| Data         | Fields                                                                                                                                                                                  | Filled in last full run                                                                                                                     |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| Event        | `eventId`, `name`, `url`, `slug`, `coverImageUrl`                                                                                                                                       | 100%                                                                                                                                        |
| Time         | `startAt`, `endAt`, `timezone`, `startLocal`, `endLocal`, `durationMinutes`                                                                                                             | 100%                                                                                                                                        |
| Place        | `venueName`, `address`, `fullAddress`, `neighbourhood`, `googlePlaceId`, `venueNotes`, `city`, `region`, `country`, `countryCode`, `latitude`, `longitude`, `addressHidden`, `lumaCity` | 98.5% city, 100% coordinates, 79.8% street address (20.2% guests only), 64.4% venue name, 79.8% Google place id                             |
| Online       | `isOnline`, `locationType`, `onlinePlatform`                                                                                                                                            | 100%; the map is in person only, online events come from calendars, hosts and links                                                         |
| Tickets      | `isFree`, `price`, `maxPrice`, `currency`, `flexiblePrice`, `minFlexiblePrice`                                                                                                          | 77.7% free; 96.6% of paid events with price and currency                                                                                    |
| Registration | `registrationStatus`, `soldOut`, `spotsRemaining`, `nearCapacity`, `requiresApproval`, `waitlistActive`, `guestCount`, `ticketsSold`                                                    | 98.8% guest count (1.2% hidden by the host), 98.8% tickets sold, 62.5% spots left, 37.0% need approval, 9.8% sold out                       |
| Organizer    | `calendarId`, `calendarName`, `calendarUrl`, `calendar` (with its social links)                                                                                                         | 100%                                                                                                                                        |
| Hosts        | `hostNames`, `hosts` (name, profile, bio, LinkedIn, X, Instagram, YouTube, TikTok, website)                                                                                             | 98.1%; 54.5% of events with a host on LinkedIn                                                                                              |
| Details      | `description`, `categories`, `ticketTypes`, `registrationQuestions`, `capacity`, `refundPolicy`, `featuredIn`, `phoneRequirement`, `membershipRequired`, `sponsorMentions`              | with `withDetails`: 99.0% description, 100% ticket tiers, 75.2% categories, 62.4% registration questions, 8.0% refund policy, 8.8% capacity |
| Guests       | `featuredGuests`                                                                                                                                                                        | with `featuredGuests`: the guests Luma features on the public page                                                                          |
| Run          | `sourceType`, `source`, `detailsFetched`, `scrapedAt`                                                                                                                                   | 100%                                                                                                                                        |

Fill rates from runs on Apify on 2026-11-06: Luma's whole map with `everywhere` (19,310 events), and 1,000 London events with `withDetails`.

### Who uses the Luma Event Scraper?

- **Event sponsors and DevRel teams** find AI, tech and crypto meetups in their cities, with guest counts, sold-out flags and the organizer's links: 9.8% of the events on the map are sold out and 37.0% need the host's approval.
- **Sales and partnership teams** build lead lists of event organizers and hosts from their public LinkedIn, X and website links.
- **Community managers** follow competing and partner calendars, including their past events, to plan dates and co-hosting.
- **Event directories and newsletters** publish every upcoming event of a city, a country or a category, refreshed each day.
- **Researchers and investors** measure where communities gather: events per city and country, free versus paid, prices by currency, categories over time.
- **Developers** who need a Luma events API without building one call this actor from JavaScript, Python or REST.

### How much does the Luma Event Scraper cost?

Pay per event. You pay for events written to the dataset and a tiny start fee. Platform usage is included, and event details cost nothing extra. The price per event falls with the discount tier of your Apify plan; Apify's paid plans come with a Bronze, Silver or Gold tier:

| Your Apify discount tier | Per event | Per 1,000 events |
| ------------------------ | --------- | ---------------- |
| Free                     | $0.0020   | $2.00            |
| Bronze                   | $0.0019   | $1.90            |
| Silver                   | $0.0018   | $1.80            |
| Gold and above           | $0.0017   | $1.70            |

The actor start costs $0.00005 per run at the default 256 MB, on every tier.

#### Luma Event Scraper cost examples

| Scenario                           | Events       | Free tier | Gold tier |
| ---------------------------------- | ------------ | --------- | --------- |
| Small test, `maxItems: 100`        | 100          | $0.20     | $0.17     |
| One calendar, `luma.com/superteam` | 41           | $0.08     | $0.07     |
| London, Luma's own area            | 1,180        | $2.36     | $2.01     |
| All of Luma's 87 cities            | 14,400       | $28.80    | $24.48    |
| Luma's whole map, `everywhere`     | 19,310       | $38.62    | $32.83    |
| London every day for a month       | about 35,400 | about $71 | about $60 |

With `onlyNewEvents`, a daily run is charged only for events no earlier run delivered. Event counts are from runs on 2026-11-05 and 2026-11-06. Set `maxItems` to cap any run. Set the run's maximum charge in Apify to cap spend; the actor stops cleanly when it is reached and reports how many events it got.

### How do you configure the Luma Event Scraper?

| Field               | Type             | Default | Meaning                                                                                                                                       |
| ------------------- | ---------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `locations`         | array of strings | empty   | One of Luma's 87 cities (`sf`, `San Francisco`, `london`), a point `latitude,longitude`, a box `south,west,north,east`, or `everywhere`.      |
| `radiusKm`          | integer          | 0       | With a city or point: only events within this distance. 0 is Luma's own area, about 50 to 70 km.                                              |
| `categories`        | array            | empty   | Luma's categories: ai, tech, crypto, climate, food, arts, fitness, wellness, running, books, games, family. Without locations: the whole map. |
| `startUrls`         | array of strings | empty   | Any Luma link: event, calendar or community, city, category, host profile (`luma.com/user/...`), `luma.com/discover`, or an `evt-`/`cal-` id. |
| `searchQueries`     | array of strings | empty   | Luma's own search: its 50 best matches per search and location.                                                                               |
| `pastEvents`        | boolean          | `false` | Also read the past events of calendar and host links, newest first.                                                                           |
| `dateFrom`          | string           | empty   | Only events starting on or after this day (`YYYY-MM-DD` or `7 days`), in the event's own time zone.                                           |
| `dateTo`            | string           | empty   | Only events starting on or before this day; the run stops reading a feed once it passes this day.                                             |
| `locationType`      | string           | `any`   | `any`, `inPerson` or `online`.                                                                                                                |
| `price`             | string           | `any`   | `any`, `free` or `paid`.                                                                                                                      |
| `withDetails`       | boolean          | `false` | Adds the description, categories, every ticket tier and the registration questions; 1,000 events with details take under 2 minutes.           |
| `featuredGuests`    | boolean          | `false` | Adds the guests Luma features publicly on the event page. Hosts are always included.                                                          |
| `maxItems`          | integer          | 100000  | Stop after this many events.                                                                                                                  |
| `maxItemsPerSource` | integer          | 0       | Stop each location, category, link or search after this many events; 0 for no limit.                                                          |
| `onlyNewEvents`     | boolean          | `false` | Return only events an earlier run of the same monitor did not deliver; the others are not charged.                                            |
| `monitorName`       | string           | empty   | Name of the list of delivered events; empty ties it to this input.                                                                            |
| `minItems`          | integer          | 1       | Fail the run when it stores fewer events: a guard for scheduled runs.                                                                         |

#### How do the Luma Event Scraper inputs combine?

- **Locations and categories combine:** `locations: ["london", "sf"]` with `categories: ["ai"]` gives AI events in London and in San Francisco. Categories alone cover Luma's whole map.
- **A Luma link means the same as typing it in its field:** `luma.com/sf` is a location, `luma.com/ai` a category, `luma.com/discover/sf/ai` that exact pair, `luma.com/discover` the whole map. So `luma.com/sf` with the AI category gives AI events in San Francisco.
- **Search words are narrowed** by your locations and categories, never added to them.
- **Calendars, hosts and events** are read in full; the date, price and in-person filters still apply.
- **Every run starts with its plan** in the log and in `SUMMARY.plan`, in plain words: "AI events in San Francisco (Luma's area, about 50 to 70 km)".
- **Cities are matched as people write them:** `San Francisco, CA`, `New York City`, `Bangalore`, `Bay Area` or a pasted `luma.com/sf` all work, and a near miss such as `Londn` stops in seconds with "did you mean London?".

An event found by two sources is returned and charged once.

### How do you scrape every Luma event in a city with the Luma Event Scraper?

Give one of Luma's 87 cities by handle or name. You get every upcoming event in Luma's own area around it, about 50 to 70 km: ~1,200 for London and ~1,100 for San Francisco, where Luma's city pages feature about 50 and 80.

```json
{ "locations": ["London", "sf", "Tokyo"] }
```

### How do you scrape Luma events near any place or in a country with the Luma Event Scraper?

Anywhere on Luma's map, by point and radius, or by a box `south,west,north,east` of any size. The box around Germany holds ~1,500 events, Zürich and Prague included; use `countryCode` to keep one country.

```json
{ "locations": ["52.37,4.89"], "radiusKm": 25 }
```

```json
{ "locations": ["47.2,5.8,55.1,15.1"] }
```

### How do you scrape all Luma events worldwide with the Luma Event Scraper?

`everywhere` reads Luma's whole map: ~20,000 upcoming in-person events in ~140 countries, most in the US, the UK, Germany and Canada, in under 30 minutes on Apify.

```json
{ "locations": ["everywhere"] }
```

### How do you scrape Luma events by category with the Luma Event Scraper?

Luma's 12 categories, in your locations or on the whole map. AI events in London and San Francisco:

```json
{ "categories": ["ai"], "locations": ["london", "sf"] }
```

### How do you scrape a Luma calendar, community or host with the Luma Event Scraper?

Paste the calendar or community link, or a host's profile link. Add `pastEvents` for their history: the Superteam calendar listed 41 upcoming events and 2,551 past ones on 2026-11-05. Calendars and hosts also list their online events.

```json
{ "startUrls": ["https://luma.com/superteam", "https://luma.com/user/someone"], "pastEvents": true }
```

### How do you search Luma events by keyword with the Luma Event Scraper?

Luma's own search, logged out, gives its 50 best matches per search, in each location you give or Luma-wide. Use several narrow words for more.

```json
{ "searchQueries": ["hackathon", "agents"], "locations": ["sf", "london"] }
```

### How do you get only new Luma events with the Luma Event Scraper?

Turn on `onlyNewEvents` and schedule the same input. The first run delivers every event it finds; each later run delivers only events no earlier run of that monitor delivered, and skips the others before reading their details, so you are never charged twice for an event. The list of delivered ids lives in your Apify account (key-value store `luma-monitor`) and keeps an id for 180 days after the event was last seen. Tested on the Superteam calendar on 2026-11-06: the first run delivered its 41 upcoming events, the second run 0, and was charged for none.

```json
{ "locations": ["london", "sf"], "categories": ["ai"], "onlyNewEvents": true, "monitorName": "ai-london-sf" }
```

### How do you get Luma event descriptions and ticket tiers with the Luma Event Scraper?

`withDetails` adds the description as text, Luma's categories, every public ticket tier with its price, capacity, spots left and sales dates, the total capacity, the refund policy, the sponsors the description names, where Luma features the event, and the questions of the registration form (never the answers). Event links always come with details.

```json
{ "locations": ["london"], "dateTo": "14 days", "withDetails": true, "price": "paid" }
```

### Which fields does the Luma Event Scraper output?

Source: **Luma** = Luma's value unchanged. **Derived** = computed by this actor. Missing values are `null`, never an empty string.

| Field                                       | Source  | Meaning                                                                                                                                      |
| ------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `eventId`                                   | Luma    | Luma's event id, `evt-...`.                                                                                                                  |
| `name`                                      | Luma    | Event title.                                                                                                                                 |
| `url`, `slug`                               | Derived | Public event page, `https://luma.com/<slug>`.                                                                                                |
| `startAt`, `endAt`                          | Luma    | Start and end, ISO 8601 in UTC.                                                                                                              |
| `timezone`                                  | Luma    | The event's time zone, e.g. `Europe/London`.                                                                                                 |
| `startLocal`, `endLocal`                    | Derived | Start and end on the event's own clock, `2026-11-20T18:30`.                                                                                  |
| `durationMinutes`                           | Derived | End minus start.                                                                                                                             |
| `isOnline`, `locationType`                  | Luma    | `offline` for in person; `zoom`, `meet`, ... for online.                                                                                     |
| `onlinePlatform`                            | Derived | The online platform; `null` in person. The join link is for guests and never read.                                                           |
| `addressHidden`                             | Derived | `true` when the host shows the address to registered guests only; `address` and `fullAddress` are then `null`.                               |
| `venueName`                                 | Derived | The venue's name when Luma's first address line is a name, not a street: `DoubleVerify UK`.                                                  |
| `address`, `fullAddress`                    | Luma    | Street address and full address with postcode, when public.                                                                                  |
| `city`, `region`, `country`                 | Luma    | Where the venue is, also when the address is hidden.                                                                                         |
| `countryCode`                               | Luma    | ISO code, `GB`.                                                                                                                              |
| `latitude`, `longitude`                     | Luma    | Venue coordinates; for a hidden address Luma's blurred pin, rounded to about 1 km.                                                           |
| `coordinatesApproximate`                    | Derived | `true` for that blurred pin.                                                                                                                 |
| `lumaCity`, `lumaCityName`                  | Luma    | The Luma city page that features the event, when it does.                                                                                    |
| `neighbourhood`                             | Luma    | Neighbourhood or district, also when the address is hidden.                                                                                  |
| `googlePlaceId`                             | Luma    | The venue's Google Maps place id, when public.                                                                                               |
| `venueNotes`                                | Luma    | The host's notes on the location, such as the entrance.                                                                                      |
| `isFree`                                    | Luma    | `true` when every ticket is free.                                                                                                            |
| `price`, `maxPrice`                         | Derived | Lowest and highest ticket price in currency units, from Luma's cents; `price` is 0 when free.                                                |
| `currency`                                  | Luma    | `USD`, `GBP`, `EUR`, `JPY`, ...                                                                                                              |
| `flexiblePrice`                             | Luma    | Pay what you want; `minFlexiblePrice` is the least accepted.                                                                                 |
| `registrationStatus`                        | Luma    | `open`, `waitlist`, `sold-out`, ...                                                                                                          |
| `soldOut`, `spotsRemaining`                 | Luma    | Sold out, and spots left when the host shows it.                                                                                             |
| `nearCapacity`                              | Luma    | Luma's "almost full" flag.                                                                                                                   |
| `requiresApproval`                          | Luma    | The host approves every registration.                                                                                                        |
| `waitlistActive`                            | Luma    | The waitlist is open.                                                                                                                        |
| `guestCount`                                | Luma    | Guests going; `null` when the host hides the guest list (`guestCountHidden: true`).                                                          |
| `ticketsSold`                               | Luma    | Tickets registered as Luma counts them; `null` when the guest list is hidden.                                                                |
| `calendarId`, `calendarName`, `calendarUrl` | Luma    | The organizing calendar. A personal calendar, which Luma names "Personal" (41% of London events), gets its owner's name and profile instead. |
| `calendar`                                  | Luma    | Calendar with description, verified flag, and its LinkedIn, X, Instagram, YouTube, TikTok and website links.                                 |
| `hostNames`                                 | Derived | Host names, comma-separated, for CSV.                                                                                                        |
| `hosts`                                     | Luma    | Each host: `name`, `username`, `profileUrl`, `bio`, `avatarUrl`, `isVerified` and social links as full URLs.                                 |
| `featuredGuests`                            | Luma    | With `featuredGuests`: the guests the event page features, same fields as hosts. Else `null`.                                                |
| `coverImageUrl`                             | Luma    | Cover image.                                                                                                                                 |
| `detailsFetched`                            | Derived | `true` when the details were read.                                                                                                           |
| `description`                               | Derived | With details: the description as plain text, from Luma's rich text.                                                                          |
| `categories`                                | Luma    | With details: Luma's category handles, `["ai", "tech"]`.                                                                                     |
| `ticketTypes`                               | Derived | With details: each public tier with `name`, `price`, `currency`, `capacity`, `spotsRemaining`, `registered`, sales dates.                    |
| `registrationQuestions`                     | Luma    | With details: what the sign-up form asks, `{label, type, required}`.                                                                         |
| `capacity`                                  | Derived | With details: total places when every public tier has a capacity.                                                                            |
| `phoneRequirement`                          | Luma    | With details: the form asks a phone number, `required` or `optional`.                                                                        |
| `membershipRequired`                        | Luma    | With details: the event is for members of the calendar's paid membership.                                                                    |
| `refundPolicy`                              | Derived | With details: the host's refund policy as text.                                                                                              |
| `featuredIn`                                | Luma    | With details: the Luma city pages and calendars that feature the event, `{type, name, url}`.                                                 |
| `sponsorMentions`                           | Derived | With details: names the description credits after "sponsored by", "powered by", "in partnership with" or "our sponsors".                     |
| `sourceType`, `source`                      | Derived | What found the event: `city`, `area`, `category`, `search`, `calendar`, `user` or `event`, and the input itself.                             |
| `scrapedAt`                                 | Derived | When the run read the event.                                                                                                                 |

#### Luma Event Scraper output example

A London event read with `withDetails`, the host replaced by a placeholder and the description shortened:

```json
{
    "eventId": "evt-3toO2lBO1w96W4r",
    "name": "How to Walk Into the Room When You Feel You Don't Belong",
    "url": "https://luma.com/bka6lrit",
    "slug": "bka6lrit",
    "startAt": "2026-11-17T18:00:00.000Z",
    "endAt": "2026-11-17T21:00:00.000Z",
    "timezone": "Europe/London",
    "startLocal": "2026-11-17T18:00",
    "endLocal": "2026-11-17T21:00",
    "durationMinutes": 180,
    "isOnline": false,
    "locationType": "offline",
    "onlinePlatform": null,
    "addressHidden": false,
    "address": "DoubleVerify UK",
    "fullAddress": "DoubleVerify UK, 1 New Oxford St, London WC1A 1NU, UK",
    "city": "London",
    "region": "England",
    "country": "United Kingdom",
    "countryCode": "GB",
    "latitude": 51.5170898,
    "longitude": -0.12350000000000001,
    "coordinatesApproximate": false,
    "lumaCity": null,
    "lumaCityName": null,
    "isFree": false,
    "price": 35,
    "maxPrice": 50,
    "currency": "GBP",
    "flexiblePrice": false,
    "minFlexiblePrice": null,
    "registrationStatus": "open",
    "soldOut": false,
    "spotsRemaining": 31,
    "nearCapacity": false,
    "requiresApproval": false,
    "waitlistActive": false,
    "guestCount": 0,
    "guestCountHidden": false,
    "calendarId": "cal-DeOTxBeIzflzVIA",
    "calendarName": "Anders & True",
    "calendarUrl": "https://luma.com/anderstrue.co",
    "calendar": {
        "id": "cal-DeOTxBeIzflzVIA",
        "name": "Anders & True",
        "url": "https://luma.com/anderstrue.co",
        "description": "Teaching you to enjoy talking to strangers",
        "avatarUrl": "https://images.lumacdn.com/calendars/sd/2fc87ab2-2528-4478-8fdf-ad3c887fc4de.png",
        "isVerified": false,
        "isPersonal": false,
        "twitterUrl": null,
        "instagramUrl": "https://www.instagram.com/anderstrue.co",
        "linkedinUrl": "https://www.linkedin.com/company/example",
        "youtubeUrl": null,
        "tiktokUrl": null,
        "websiteUrl": "https://anderstrue.co"
    },
    "hostNames": "Alex Example",
    "hosts": [
        {
            "id": "usr-XXXXXXXXXXXXXXX",
            "name": "Alex Example",
            "username": "alexexample",
            "profileUrl": "https://luma.com/user/alexexample",
            "bio": "Community builder",
            "avatarUrl": null,
            "isVerified": false,
            "twitterUrl": null,
            "instagramUrl": null,
            "linkedinUrl": "https://www.linkedin.com/in/alexexample",
            "youtubeUrl": null,
            "tiktokUrl": null,
            "websiteUrl": null
        }
    ],
    "featuredGuests": null,
    "coverImageUrl": "https://images.lumacdn.com/uploads/vp/d5dea110-f7d6-423d-b91b-a08bb01a1023.png",
    "detailsFetched": true,
    "description": "The worst time to start networking is when you really need something.\n\nBut you put it off because it's awkward and uncomfortable and there's always something more urgent.\n\nUntil suddenly you're stuck, you need help... and you've got no idea who to ask.\n\nMake 17 November the evening when you finally …",
    "categories": [],
    "ticketTypes": [
        {
            "id": "ttype-QoIxJJhHJREtB2Y",
            "name": "Standard",
            "description": null,
            "type": "fiat-price",
            "price": 35,
            "minPrice": null,
            "currency": "GBP",
            "flexiblePrice": false,
            "requiresApproval": false,
            "capacity": null,
            "spotsRemaining": null,
            "registered": 6,
            "available": true,
            "salesStart": "2026-10-21T09:00:00.000Z",
            "salesEnd": null
        },
        {
            "id": "ttype-wxidqbMb3lSLB4O",
            "name": "Pay It Forward",
            "description": "Cover the cost of a free place for someone who needs it (we all started somewhere, right?)",
            "type": "fiat-price",
            "price": 50,
            "minPrice": 50,
            "currency": "GBP",
            "flexiblePrice": true,
            "requiresApproval": false,
            "capacity": null,
            "spotsRemaining": null,
            "registered": 0,
            "available": true,
            "salesStart": "2026-10-21T09:00:00.000Z",
            "salesEnd": null
        }
    ],
    "registrationQuestions": [
        {
            "label": "What is your LinkedIn profile?",
            "type": "linkedin",
            "required": true
        },
        {
            "label": "What's the networking moment you'd most like to handle better?",
            "type": "text",
            "required": false
        },
        {
            "label": "I understand that tickets are non-refundable. If I can't make it, I can transfer my ticket to someone else by emailing hi@anderstrue.co.",
            "type": "agree-check",
            "required": true
        }
    ],
    "sourceType": "city",
    "source": "city london",
    "scrapedAt": "2026-11-05T23:56:10.569Z"
}
```

### How does the Luma Event Scraper report on its run?

Every run saves a `SUMMARY` record in its key-value store: the plan in plain words, what was found and kept per source, and any problem. From a run of 30 London tech events on 2026-11-06:

```json
{
    "plan": ["Tech events in London (Luma's area, about 50 to 70 km)"],
    "input": {
        "startUrls": [],
        "locations": ["london"],
        "radiusKm": 0,
        "categories": ["tech"],
        "searchQueries": []
    },
    "filters": {
        "dateFrom": null,
        "dateTo": null,
        "locationType": "any",
        "price": "any",
        "pastEvents": false
    },
    "withDetails": false,
    "featuredGuests": false,
    "eventsFound": 50,
    "duplicates": 0,
    "filteredOut": 0,
    "detailsRead": 0,
    "detailsFailed": 0,
    "skippedProfiles": [],
    "blocked": false,
    "slowDowns": 0,
    "errors": [],
    "sources": [
        {
            "source": "category tech (city london)",
            "found": 50,
            "pushed": 30,
            "error": null
        }
    ],
    "itemsPushed": 30,
    "monitor": null,
    "stoppedAtChargeLimit": false,
    "durationSec": 2,
    "runErrors": []
}
```

A run is suspect when `blocked` is `true`, when `errors` is not empty, or when a source has an `error`. `slowDowns` counts the times Luma asked the actor to wait. Set `minItems` to make a bad run fail outright.

### How does the Luma Event Scraper compare to other Luma scrapers?

|                                            | Luma Event Scraper  | [solidcode](https://apify.com/solidcode/luma-scraper) | [matyascimbulka](https://apify.com/matyascimbulka/luma-event-scraper) | [logiover](https://apify.com/logiover/luma-scraper) |
| ------------------------------------------ | ------------------- | ----------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------- |
| Price per 1,000 events                     | $1.70 to $2.00      | $2.50 to $3.00                                        | $0.03 to $0.07                                                        | $2.50                                               |
| Luma's whole map, any point, box or radius | ✅ ~20,000 events   | ❌                                                    | ❌                                                                    | ✅                                                  |
| All 12 Luma categories                     | ✅                  | ❌ 8                                                  | ❌ 8                                                                  | ✅                                                  |
| Calendars and hosts with past events       | ✅                  | —                                                     | ❌                                                                    | ✅                                                  |
| Hosts and organizers with LinkedIn and X   | ✅                  | ✅                                                    | ✅                                                                    | ✅                                                  |
| Ticket tiers and descriptions              | ✅ details included | ✅                                                    | ❌ description only                                                   | ✅                                                  |
| Only new events, never charged twice       | ✅                  | ❌                                                    | ❌                                                                    | ❌                                                  |
| Hidden guest lists stay hidden             | ✅                  | ✅                                                    | —                                                                     | —                                                   |
| Run plan in plain words, and a run summary | ✅                  | —                                                     | —                                                                     | ✅ summary                                          |

✅ yes, ❌ no, — not stated on the actor's page. Figures read from each actor's public page on 2026-11-06.

### Things to know about Luma data from the Luma Event Scraper

- Luma's map lists **in-person events only**. Online events come from calendars, hosts, event links and searches.
- Cities, categories and searches list **upcoming events only**. Past events come from calendars and hosts, with `pastEvents`.
- Luma's city pages feature 50 to 80 events. Luma's area around the city holds about 15 to 20 times more (~1,200 in London, ~1,100 in San Francisco), and that is what the actor reads.
- A search returns Luma's 50 best matches, never more: Luma does not page searches.
- With a small `maxItems`, `everywhere` returns the first areas it reads (South America first), not a sample of the world; for a sample, pick a city.
- `guestCount` is Luma's count of guests going; a tier's `registered` can be higher, for registrations that still wait for approval or payment.
- When the host hides the guest list, Luma's API still sends a count. The actor leaves `guestCount` `null`, as the event page does.
- When the address is for guests only (about one event in five), Luma gives the neighbourhood and a blurred pin; the actor never guesses the street.

### Is it legal to use the Luma Event Scraper?

This actor reads publicly available data only, the same data luma.com shows a visitor who is not logged in. It collects personal data that hosts and featured guests chose to show publicly on Luma (name, short bio, avatar and the social links they published); if you process it, the GDPR or your local privacy law applies to you, including a lawful basis and honouring objections. It respects robots.txt, skips profiles that ask robots to stay away, respects rate limits and does not bypass any login or paywall; guest lists and contact details that need an account are never read. You are responsible for how you use the data, including any terms that apply to you. See Apify's [guide to web scraping legality](https://blog.apify.com/is-web-scraping-legal/).

### Frequently asked questions about the Luma Event Scraper

#### Can I get Luma events as CSV or Excel?

Yes. Every run's dataset downloads as CSV, Excel, JSON or XML from Apify, or through the API. Nested fields such as `hosts` become columns; `hostNames` and `calendarName` keep a CSV readable.

#### How often should I run it?

Hosts add Luma events all the time, and guest counts move as people register. A daily run of your cities with `dateTo` set a few weeks ahead keeps a directory current; a weekly run of `everywhere` gives a time series.

#### Does it need proxies?

No. Luma answers Apify's servers directly, and every test run of 2026-11-06 on Apify finished without being slowed down or blocked.

#### Can I schedule it and send results somewhere?

Yes. Use Apify Schedules, and a webhook or integration to send each run's dataset to your database, Google Sheets, Slack, HubSpot or Notion.

#### Does it work with the Apify API and SDK?

Yes. Any Apify client (JavaScript, Python, REST) can start the actor and read the dataset.

#### Is there an official Luma API?

Luma's own API covers only the calendars you manage, on a paid Luma Plus plan. For other people's public events, this actor is the Luma events API: it reads the same data luma.com shows and returns it as clean JSON.

#### Can I get the attendee list or guests' emails of a Luma event?

No. Luma shows full guest lists and emails only to the host or to logged-in guests, and this actor never logs in. It gives the guest count and, with `featuredGuests`, the guests the event page features publicly.

#### Does it work for lu.ma links?

Yes. lu.ma and luma.com links both work, as do bare slugs and Luma ids (`evt-...`, `cal-...`).

#### How do I get only new events every day?

Schedule the actor daily with `onlyNewEvents`. Each run returns only the events earlier runs did not deliver, and is charged only for those.

#### Why do I get fewer events for a city than its luma.com map shows?

The map on luma.com moves with the view. The actor reads Luma's area around the city, 50 to 70 km; set `radiusKm`, or give a box, for a different area.

### Support for the Luma Event Scraper

Questions, a missing field, or a custom pipeline on top of this data: write to sleepmodesystems@proton.me. Bugs go in the Issues tab of this actor.

Did the Luma Event Scraper save you time? A review on its [Apify page](https://apify.com/sleepmodesystems/luma) takes a minute and helps other people find it. Thank you!

# Actor input Schema

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

Cities, as you would write them: sf, San Francisco, New York City, Bangalore, Berlin, Germany... (Luma's 87 cities; a near miss gets a "did you mean"). Every event in Luma's area around each, about 50 to 70 km: San Francisco has ~1,100 where Luma's city page shows 80. Anywhere else: latitude,longitude (52.37,4.89), or a box south,west,north,east (47.2,5.8,55.1,15.1). everywhere for Luma's whole map.

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

With a city or a point: only events within this distance. 0 uses Luma's own area around the city or point (about 50 to 70 km).

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

Luma's categories. With locations: these categories there. Alone: these categories on Luma's whole map (under 30 minutes).

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

Paste any public Luma page, luma.com or lu.ma: an event, a calendar or community (luma.com/superteam), a host (luma.com/user/name), a city (luma.com/sf), a category (luma.com/ai), a city and category (luma.com/discover/sf/ai), or luma.com/discover for the whole map. Ids work too: evt-..., cal-..., usr-...

## `searchQueries` (type: `array`):

Luma's own search, its 50 best matches per word, in each location and category above, else Luma-wide. Example: hackathon, AI agents.

## `pastEvents` (type: `boolean`):

For calendar and host profile links, also read their past events, newest first. Cities, categories and searches only list upcoming events.

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

Only events starting on or after this day (YYYY-MM-DD), in the event's own time zone. Relative values such as 7 days work too.

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

Only events starting on or before this day. Luma's feeds are sorted by start time, so the run stops reading a feed as soon as it passes this day.

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

Luma's map lists in-person events only; online events come from calendar, host and event links and from searches.

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

Keep free events, paid events, or both.

## `withDetails` (type: `boolean`):

Adds each event's description, categories, every ticket tier with its price, capacity and spots left, and the questions of the registration form. 1,000 events with details take under 2 minutes. Event links always come with details.

## `featuredGuests` (type: `boolean`):

Adds the guests Luma features publicly on the event page (name, short bio, social links; up to 10 with details, else about 6). Hosts are always included. Luma's full guest list needs a login and is never read.

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

Stop after this many events in total. Luma's whole map holds ~20,000 upcoming in-person events.

## `maxItemsPerSource` (type: `integer`):

Stop each city, category, link or search after this many events. 0 for no limit per source.

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

Return only events that an earlier run with the same monitor did not deliver. Events delivered before are skipped before their details are read and are never charged. The first run delivers everything it finds. Ids are kept for 180 days after an event was last seen.

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

Name of the list of delivered events. Leave empty to tie it to this input (sources and filters): a changed input starts a new list. Give a name to share one list between inputs or tasks.

## `minItems` (type: `integer`):

Fail the run if fewer events were found.

## `freshMap` (type: `boolean`):

Maintenance only: read Luma's whole map without the actor's saved list of busy areas.

## Actor input object example

```json
{
  "locations": [
    "london"
  ],
  "radiusKm": 0,
  "categories": [],
  "startUrls": [],
  "searchQueries": [],
  "pastEvents": false,
  "locationType": "any",
  "price": "any",
  "withDetails": false,
  "featuredGuests": false,
  "maxItems": 200,
  "maxItemsPerSource": 0,
  "onlyNewEvents": false,
  "minItems": 1,
  "freshMap": false
}
```

# Actor output Schema

## `results` (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 = {
    "locations": [
        "london"
    ],
    "maxItems": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("sleepmodesystems/luma").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": ["london"],
    "maxItems": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("sleepmodesystems/luma").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": [
    "london"
  ],
  "maxItems": 200
}' |
apify call sleepmodesystems/luma --silent --output-dataset

```

## MCP server setup

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

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/Yb3WFkM9tyfRCR0Pb/builds/0IhNXl7TF0ciE7cWK/openapi.json
