Luma Events Scraper
Scrape lu.ma events by city, calendar or event link. Get name, date with timezone, venue, host, ticket price and guest count. $2.125 per 1,000.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
startUrls,cities,searchQuery(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.002125 per event = $2.125 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Event returned | Charged once per genuine Luma event row. Sample rows, diagnostics, blocked requests and empty runs are never charged. | $0.002125 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-07, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
startUrls | Paste any lu.ma link, one per line. Event pages (https://lu.ma/beta-fdnw), city pages (https://lu.ma/sf), community calendars (https://lu.ma/Beta-events) and category pages (https://lu.ma/ai) are all understood. A bare slug works too. | array |
cities | Luma discover cities to pull upcoming events from. Use the slug (sf, nyc, london, berlin, tokyo, bengaluru) or the plain name ("San Francisco"). Luma runs discover pages for 87 cities. | array |
searchQuery | Optional keyword. Applied to every city and calendar feed above, for example "hackathon", "founders", "yoga". | string |
category | Optional Luma category. Only applies to the global feed (use it without cities); Luma ignores a category filter on a city page. | string |
maxItems | Hard cap on rows returned across every target (1-5000). You are charged per event returned. A single city's discover feed holds roughly 70-90 upcoming events, so add more cities for bigger runs. | integer |
period | Only affects community calendar pages. Luma city feeds are always upcoming-only. | string |
includeDetails | Off by default. When on, the actor makes one extra request per event to add the event description, Luma's own category tags and every ticket tier with its price. Slower, and the per-event price is unchanged. | boolean |
What you get
A structured dataset — each result includes fields like:
namestartAtLocaltimezonecityStatevenueNamehostNamecalendarNameisFreepricepriceCurrencyguestCountisSoldOuturlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Travel, Hotels & Events
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Booking.com Reviews Scraper
Scrape Booking.com guest reviews. Get the score, title, liked and disliked text, reviewer name, country and stay dates. $1.50 per 1,000 reviews.
Tripadvisor Reviews Scraper
Scrape Tripadvisor reviews for hotels, restaurants and attractions. Get rating, full text, reviewer, hometown, trip type and owner reply. $0.25/1,000.
Airbnb Listings Scraper
Scrape Airbnb listings by location, dates and guests. Get listing ID, name, room type, price, rating, reviews and host. No account, no API key.
Google Hotels Scraper
Scrape Google Hotels by destination and dates: name, nightly price, stay total, rating, reviews, link. $3.50 per 1,000.
Where this tool sits
- Categories
- Travel, Hotels & Events
Luma Events Scraper: lu.ma events by city, calendar or link
Paste a lu.ma link or name a city, and you get one row per event. Name, start and end time with the timezone, the venue or the online flag, who is hosting, the ticket price, and how many people have registered so far.
A city's discover feed is upcoming-only and finite, roughly 70 to 90 events at a time. Past events live on community calendars, and you reach those by pasting the calendar and switching Past events on.
| Input | lu.ma event, city, calendar or category links, or plain city names |
| Output | One row per event |
| Ceiling | 5,000 events per run |
| Account needed | None |
| Price | $2.125 per 1,000 events, flat on every plan |
🔍 What Luma Events Scraper does
It reads four kinds of lu.ma page and turns all of them into the same row. A single event page, a city discover page like lu.ma/sf, a community calendar, or a category page like lu.ma/ai. Name the cities instead of pasting links if you prefer, by slug or by plain name.
Times come back three ways so you do not have to do the arithmetic: startAt and endAt in UTC, startAtLocal and endAtLocal in the event's own clock, and timezone alongside them.
Prices are converted into the currency's major units properly, which matters more than it sounds. A yen price has no decimal places and a Bahraini dinar has three, and both come back right.
📥 What you give it
{
"cities": ["sf", "nyc"],
"searchQuery": "founders",
"maxItems": 200,
"includeDetails": false
}
| Field | Default | What it is |
|---|---|---|
startUrls | none, the box starts with https://lu.ma/sf | Any lu.ma link, one per line. Event pages, city pages, community calendars and category pages all work, and a bare slug works too. |
cities | none | Luma discover cities. Use the slug (sf, nyc, london, berlin, tokyo, bengaluru) or the plain name. Luma runs discover pages for 87 cities. |
searchQuery | none | Keyword filter applied to every city and calendar feed, for example hackathon or yoga. |
category | any | tech, ai, crypto, climate, food, arts, fitness, wellness. See the warning below. |
maxItems | 50 | Hard cap on rows across every target, 1 to 5,000. |
period | upcoming | past pulls a calendar's history instead. Only affects community calendars. |
includeDetails | off | One extra request per event, adding the description, Luma's own tags and every ticket tier with its price. |
proxyConfiguration | none | Optional. Only touch it if the run has to leave through your own servers. |
category only applies to the global feed. Set a city and Luma ignores the category filter entirely, so you get that city's whole upcoming list. Use searchQuery to narrow a city instead.
period: past does nothing on a city page. Luma's city discover feeds only ever list what is coming up. A community calendar is the only surface with a history to read.
📤 What you get back
A real row from a recent run:
{
"eventId": "evt-DglQU0ckykBp1nQ",
"slug": "ou0z635y",
"url": "https://lu.ma/ou0z635y",
"name": "Maum Market SF",
"startAt": "2026-09-20T18:00:00.000Z",
"endAt": "2026-09-20T23:00:00.000Z",
"timezone": "America/Los_Angeles",
"startAtLocal": "2026-09-20 11:00",
"endAtLocal": "2026-09-20 16:00",
"durationMinutes": 300,
"locationType": "offline",
"isOnline": false,
"venueName": "Ferry Building",
"addressFull": "1 Ferry Building, San Francisco, CA 94105, USA",
"addressShort": "1 Ferry Building, San Francisco",
"city": "San Francisco",
"cityState": "San Francisco, California",
"region": "California",
"country": "United States",
"countryCode": "US",
"latitude": 37.7954425,
"longitude": -122.3936136,
"addressIsHidden": false,
"hostName": "Maum Market",
"hostUsername": "maummarket",
"hostCount": 1,
"hosts": [
{
"name": "Maum Market",
"username": "maummarket",
"avatarUrl": "https://images.lumacdn.com/uploads/ty/...",
"twitter": null,
"linkedin": null,
"instagram": "maum.market",
"website": "https://maum.market",
"isVerified": false
}
],
"calendarName": "Maum Market",
"calendarSlug": null,
"calendarUrl": null,
"calendarIsPersonal": true,
"calendarIsVerified": true,
"coverImageUrl": "https://images.lumacdn.com/uploads/9a/...",
"socialImageUrl": "https://images.lumacdn.com/event-social/f6/...",
"isFree": true,
"price": null,
"priceMax": null,
"priceCurrency": null,
"priceIsFlexible": null,
"isSoldOut": false,
"spotsRemaining": null,
"requiresApproval": false,
"registrationStatus": "open",
"waitlistActive": false,
"guestCount": 0,
"ticketCount": 0,
"visibility": "public",
"eventType": "independent",
"description": null,
"categories": null,
"ticketTypes": null,
"source": "city",
"sourceInput": "https://lu.ma/sf",
"position": 1,
"scrapedAt": "2026-09-20T07:04:49.921Z"
}
| Field | What it is |
|---|---|
eventId | Stable. Use it to dedupe across runs and across targets. |
startAtLocal, endAtLocal | The event's own wall clock, already in timezone. startAt and endAt are the UTC pair. |
addressIsHidden | Some hosts only reveal the address after you register. When this is true, the address fields are null and stay that way. |
isFree, price, priceMax, priceCurrency | price and priceMax are the cheapest and dearest tier in major currency units. All null on a free event. |
priceIsFlexible | True when the host lets attendees pick what to pay. |
hosts[] | Every host, with the social links each one has filled in. hostName and hostUsername repeat the first. |
guestCount, ticketCount | How many are registered. 0 is a real answer on a new event, not a missing value. |
spotsRemaining | null unless the host published a capacity. |
calendarIsPersonal | true means the event hangs off a person's own calendar rather than a community one, and calendarSlug and calendarUrl are then null. |
description, categories, ticketTypes | null unless you switch on includeDetails. |
source, sourceInput | Which target produced the row: event-url, city, calendar or sample, plus what you typed. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| An event | It has an eventId and neither flag below | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
A real event row carries no ok or charged field, so filter on _sample and _diagnostic being absent. Run it with nothing filled in and you get the sample row on its own.
The errorCode on a diagnostic row names what went wrong:
| Code | What it means |
|---|---|
BAD_URL | Not a lu.ma link, or not one this actor can read. |
UNSUPPORTED_URL | lu.ma/u/<username> is a person's profile, not an event feed. Paste their calendar instead. |
NOT_FOUND | That slug does not exist on lu.ma any more. |
CITY_NOT_FOUND | Luma has no discover page for that city. The error names the nearest matches it does have. |
NO_RESULTS | The feed answered and held nothing. On a calendar, try switching to past events. |
BAD_REQUEST | Luma refused the query as malformed. |
API_ERROR | Luma answered with an error. Re-run it. |
BAD_RESPONSE | Luma answered with something this actor could not read. |
One bad target never stops the others, and a diagnostic row never fails the run.
▶️ How to run it
1. Open Luma Events Scraper and click Try for free. 2. Type city slugs into Cities, or paste links into Luma URLs. Both together is fine. 3. Add a Keyword filter if you want to narrow a city feed. 4. Set Maximum events. Start around 50 to see the output shape, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$2.125 per 1,000 events. Flat on every Apify plan, no volume tiers.
You pay per event row delivered. The sample row and diagnostic rows carry no event charge, and an event that turns up in two of your targets is charged once, not twice. Switching on the full description and ticket tiers costs nothing extra per event.
💡 What people use it for
- Pulling the week ahead in three or four cities and filtering by keyword to find the ones worth
attending.
- Building a list of hosts running events in a niche, with the social links they published.
- Watching a community calendar on a schedule and picking up what was added since last run.
- Reading a calendar's past events to see how often a series actually runs and how full it got.
🚧 What it does not do
- No guest lists. Luma does not publish who registered, so neither does this. You get the count.
- Hidden addresses stay hidden. If the host only reveals the venue after registration,
addressIsHidden is true and the address fields are null.
- A city feed is upcoming-only and short. Roughly 70 to 90 events at a time, so a big run needs
more cities rather than deeper paging into one.
- A category filter and a city do not combine. Luma drops the category on a city page.
- A calendar run can stop a little short of
maxItems. Calendars can list events hosted on other
platforms; those are skipped rather than returned, but they still count against your cap.
- It does not register for anything and it does not log in, so private and invite-only events are
out of reach.
- Rows are a snapshot. A host can move or cancel an event afterwards, and
scrapedAtrecords
when it was read.
🧭 Which events scraper do you need?
| If you want | Use |
|---|---|
| lu.ma events, with hosts and ticket tiers | This one |
| Eventbrite listings by city or keyword | Eventbrite Events Scraper |
| Trade shows and conferences worldwide | 10Times Events Scraper |
| Public events on Facebook | Facebook Events Scraper |
❓ Questions people ask
Do I need a Luma account? No. Nothing to sign up for and no key to apply for.
How do I get past events? Paste a community calendar into Luma URLs and set Past or upcoming to past. City pages have no history to give.
Which cities work? Luma runs discover pages for 87 of them. Give it a slug or a plain name, and if there is no match the error names the nearest cities it does cover.
Can I get the full description? Yes, switch on Fetch the full description and ticket tiers. It adds an extra request per event, so the run is slower, and the per-event price is unchanged.
Can I watch a calendar on a schedule? Yes. Schedule the run, keep maxItems modest, and dedupe on eventId.
Is scraping event listings legal? These are public event pages. Host names and social links are personal data all the same, which GDPR and similar laws cover, so have a reason for collecting them. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the link or city you used and the run ID. The errorCode on the diagnostic row usually names the problem on its own.