# Luma Events Scraper – City, Category & Calendar (`refillflows/luma-events-scraper`) Actor

Scrape public Luma (lu.ma / luma.com) events in any city, by category, keyword, community calendar or event URL. Get dates, venue, coordinates, price, RSVPs, organizers and hosts as CSV or JSON. Fast public JSON API, no browser, no login. Schedule daily or call from Python.

- **URL**: https://apify.com/refillflows/luma-events-scraper.md
- **Developed by:** [Refill Flows](https://apify.com/refillflows) (community)
- **Categories:** Lead generation, Travel, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 event scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Scrape **public events from [Luma](https://luma.com)** (lu.ma) in any city in the world, by category (AI, tech, crypto, climate, arts…), keyword, community calendar or event URL. The **Luma Events Scraper** returns clean JSON, CSV or Excel with dates, venue and coordinates, price, RSVP count, sold-out and waitlist status, organizer and hosts.

It talks to Luma's public JSON endpoints directly: **no browser, no login, no cookies**. 300 events take about 10 seconds, so runs stay cheap and fast. Try it with the prefilled input (San Francisco + "hackathon"), or call it from Python, JavaScript, Make, Zapier, n8n or the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### What can this Luma Events Scraper do?

- 🌍 **Any city, not only Luma's featured cities.** Type "Pune", "Austin" or "48.85,2.35". Featured cities resolve instantly; others are geocoded with OpenStreetMap.
- 🏷️ **Category filters**: `ai`, `tech`, `crypto`, `climate`, `arts`, `food`, `fitness`, `wellness`, `running`, `books`, `games`, `family`.
- 🔎 **Keyword search** per city, for example "hackathon", "founders", "demo day", "web3".
- 📅 **Community calendars**: all upcoming events from a calendar such as `luma.com/genai-sf`.
- 🔗 **Single event URLs**, with the full description included at no extra cost.
- 📆 **Date window, free-only and in-person-only filters.**
- ♻️ **Automatic de-duplication** across cities, categories and queries, with `source` showing which search found each event.
- 🧾 **Optional details mode** adds the full description and every ticket tier.
- 🛡️ **Privacy-aware by default.** Host bios and social links are only added when you turn them on.

### How to scrape Luma events

1. Open the [Luma Events Scraper](https://apify.com/refillflows/luma-events-scraper) and click **Try for free**.
2. Enter a city in **Locations** (for example `San Francisco` or `Bengaluru`). Add a category, a keyword such as `hackathon`, a calendar URL, or leave the filters empty to get every upcoming event nearby.
3. Optionally set a date window, **Only free events**, or **Max events** to cap the run.
4. Click **Start**. When the run finishes, open the **Dataset** tab and export **CSV**, Excel or JSON, or pull the results through the Apify API.

A typical first run with the prefilled input finishes in a few seconds and costs a few cents.

### How much does it cost to scrape Luma?

You only pay for events you actually get. Apify platform usage is included in the price.

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Event scraped | **$1.50 per 1,000 events** |
| Event details (optional) | $2.00 per 1,000 events |

So 1,000 events cost about $1.50, or $3.50 with full descriptions. Apify's free plan includes $5 of monthly credit, which covers about 3,000 events. Set **Max events** or a run cost limit to cap what you spend.

### Input

| Field | What it does |
|---|---|
| `locations` | Cities or `"lat,lon"`. Combined with categories or keywords, or on its own for all events. |
| `radiusKm` | Radius around each location (default 25). |
| `categories` | Luma categories to search in each location. |
| `searchQueries` | Keywords to search in each location. |
| `calendarUrls` | Luma calendar or community pages. |
| `eventUrls` | Individual event pages. |
| `startDate` / `endDate` | Date window (YYYY-MM-DD). |
| `onlyFree`, `includeOnline` | Filters. |
| `maxItems`, `maxItemsPerSource` | Cost caps. |
| `includeDetails` | Full description and ticket tiers (extra billed event). |
| `includeHostSocials` | Host bio, website and LinkedIn/X/Instagram. |

Example: AI and tech events in San Francisco and Bengaluru, plus the GenAI SF community calendar:

```json
{
  "locations": ["San Francisco", "Bengaluru"],
  "categories": ["ai", "tech"],
  "calendarUrls": ["https://luma.com/genai-sf"],
  "startDate": "2026-11-12",
  "endDate": "2026-12-31",
  "maxItems": 300
}
```

### Output

Each event is one row. Here is a real example, shortened:

```json
{
  "eventId": "evt-vg4ZgWNtj8sDm7y",
  "name": "Biryani Maxxing: A Diwali Feast & Multiplayer AI Mixer",
  "url": "https://luma.com/biryanimaxxing",
  "startAt": "2026-11-11T01:00:00.000Z",
  "endAt": "2026-11-11T03:00:00.000Z",
  "timezone": "America/Los_Angeles",
  "locationType": "offline",
  "venue": null,
  "fullAddress": null,
  "city": "San Francisco",
  "region": "California",
  "country": "United States",
  "countryCode": "US",
  "latitude": 37.78804243996196,
  "longitude": -122.39606114466983,
  "isFree": true,
  "priceMin": null,
  "priceMax": null,
  "currency": null,
  "isSoldOut": false,
  "spotsRemaining": 37,
  "requiresApproval": true,
  "registrationStatus": "open",
  "waitlistActive": false,
  "guestCount": 463,
  "ticketCount": 463,
  "coverImageUrl": "https://images.lumacdn.com/api-uploads/90/77a59930-ee9f-4182-9cdf-a8041885c335.png",
  "calendarName": "PromptQL Events",
  "calendarUrl": "https://luma.com/promptql",
  "calendarWebsite": "https://promptql.io/",
  "calendarIsVerified": false,
  "hosts": [
    {
      "name": "Host Name",
      "profileUrl": "https://luma.com/user/usr-XXXX",
      "isVerified": false
    }
  ],
  "description": null,
  "source": {
    "type": "category",
    "location": "San Francisco",
    "category": "ai",
    "label": "San Francisco / ai"
  },
  "scrapedAt": "2026-11-10T20:05:03.883Z"
}
```

The dataset has two views, **Events** (overview) and **Location & map**. You can export to JSON, CSV, Excel, XML or HTML, or pull results through the Apify API, webhooks, Make, Zapier, n8n or the Apify MCP server.

### How to scrape Luma events with Python or the API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("refillflows/luma-events-scraper").call(run_input={
    "locations": ["San Francisco"],
    "searchQueries": ["hackathon"],
    "maxItems": 100,
})
for event in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(event["name"], event["startAt"], event["url"])
```

Or, with `curl`, start a run and then download the dataset as CSV from `https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv`. You can also schedule the Actor daily in Apify Console and send new rows to Google Sheets, Slack or a webhook.

### Tips

- If you want **everything** in a city, leave categories and keywords empty and raise `maxItemsPerSource`. A 25 km radius around San Francisco returns 500+ upcoming events.
- Luma rate-limits heavy traffic. The Actor retries with exponential backoff automatically. For very large runs (10k+ events, or details mode), turn on an Apify datacenter proxy.
- To monitor new events, schedule the Actor daily and use the `eventId` field to compare runs.

### FAQ

#### Is there an official Luma API?

Luma offers a calendar-scoped API for organizers on paid plans. This Actor is for **public discovery**: every upcoming event in a city, category or community that any visitor can see without logging in. You do not need a Luma account or API key.

#### Is it legal to scrape Luma?

This Actor only collects **publicly listed** event information that Luma shows to any visitor without logging in. It does not access private events, guest lists or attendee data. Host social links are off by default. If you turn them on, you are responsible for having a lawful basis (for example GDPR legitimate interest) to process that data. Use the data in line with Luma's terms and your local laws.

#### Can I export Luma events to CSV?

Yes. After a run, open the **Dataset** tab and click **Export** → **CSV** (or Excel). From code, request the dataset with `?format=csv`. Each event is one row, ready for Google Sheets or a newsletter listing.

#### Does it work for cities that are not on Luma's featured list?

Yes. Featured cities resolve instantly; any other place name is geocoded with OpenStreetMap. You can also pass `"lat,lon"` directly.

#### Who is this for?

Event and DevRel teams tracking AI and tech meetups, sales and partnership teams looking for organizers, VCs and founders mapping a city's startup calendar, newsletter writers building "events this week" lists, and AI agents that need structured "what's on near X" data.

### Other tools by Refill Flows

- [Shopify App Store Scraper](https://apify.com/refillflows/shopify-app-store-scraper) — app rankings, pricing plans and merchant reviews.
- [Bulk Lighthouse Audit](https://apify.com/refillflows/bulk-lighthouse-audit) — Lighthouse and Core Web Vitals for many URLs, no API key.

### Support

Found a bug or missing field? Open an issue on the Actor's **Issues** tab and we'll fix it quickly. Maintained by [Refill Flows](https://apify.com/refillflows).

# Actor input Schema

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

Cities or "lat,lon" pairs to search around. Any city works: Luma's featured cities (sf, nyc, london, bengaluru, berlin, singapore...) resolve instantly, others are geocoded via OpenStreetMap.

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

Search radius around each location.

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

Optional Luma categories to search in each location. Leave empty to get all events.

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

Optional keywords (e.g. "hackathon", "founders", "web3") searched in each location.

## `calendarUrls` (type: `array`):

Luma calendar pages to pull all upcoming events from, e.g. https://luma.com/genai-sf

## `eventUrls` (type: `array`):

Individual Luma event pages, e.g. https://luma.com/abc123. Description is included for free.

## `startDate` (type: `string`):

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

## `endDate` (type: `string`):

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

## `onlyFree` (type: `boolean`):

Skip paid events.

## `includeOnline` (type: `boolean`):

Keep virtual/online events in the results.

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

Stop after this many unique events. Also caps your cost.

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

Cap per individual search.

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

Fetch each event page for the full description and all ticket tiers. Slower, billed as an extra 'event-details' event.

## `includeHostSocials` (type: `boolean`):

Add hosts' public bio, website and LinkedIn/X/Instagram links. These may be personal data: only enable if you have a lawful basis (e.g. GDPR legitimate interest) to process them.

## `requestDelayMs` (type: `integer`):

Politeness delay between API pages.

## `proxyConfiguration` (type: `object`):

Optional. Datacenter proxy helps on very large runs if Luma rate-limits.

## Actor input object example

```json
{
  "locations": [
    "San Francisco"
  ],
  "radiusKm": 25,
  "categories": [],
  "searchQueries": [
    "hackathon"
  ],
  "calendarUrls": [],
  "eventUrls": [],
  "onlyFree": false,
  "includeOnline": true,
  "maxItems": 25,
  "maxItemsPerSource": 500,
  "includeDetails": false,
  "includeHostSocials": false,
  "requestDelayMs": 400,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `stats` (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": [
        "San Francisco"
    ],
    "searchQueries": [
        "hackathon"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("refillflows/luma-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": ["San Francisco"],
    "searchQueries": ["hackathon"],
    "maxItems": 25,
}

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

```

## MCP server setup

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