Luma Events Scraper API (lu.ma)
Pricing
from $2.07 / 1,000 events
Luma Events Scraper API (lu.ma)
Scrape lu.ma events by city, community calendar, category or event link. Each row has the name, start and end time with the timezone, venue or online flag, hosts with their links, ticket price and guest count. Past events from calendars too. $2.125 per 1,000 events.
Pricing
from $2.07 / 1,000 events
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
Share
Scrape Luma events by city, calendar or link and get one row per event: the 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: San Francisco had 82 events when we counted, New York 70, London 52 and Berlin 16. Past events live on community calendars, and you reach those by pasting the calendar and setting Past or upcoming to past.
| Input | lu.ma event, city, calendar or category links, or plain city names |
| Output | One row per event: name, times with the timezone, venue and coordinates or online, hosts and their links, price, registrations |
| Ceiling | 5,000 events per run |
| Account needed | None |
| Price | $2.125 per 1,000 events, flat on every plan. The free plan's $5 a month covers about 2,300 |
π 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 data you get from each Luma event
| What you get | Field |
|---|---|
| The event, its ids and its page | eventId, slug, url, name |
| Start and end, in UTC and in the event's own clock | startAt, endAt, startAtLocal, endAtLocal, timezone, durationMinutes |
| Online or at a venue | locationType, isOnline |
| The venue's address and coordinates, unless the host hides them | venueName, addressFull, addressShort, city, cityState, region, country, countryCode, latitude, longitude, addressIsHidden |
| Who hosts it, with the social links each host filled in | hostName, hostUsername, hostCount, hosts |
| The calendar it belongs to | calendarName, calendarSlug, calendarUrl, calendarIsPersonal, calendarIsVerified |
| Price and tickets | isFree, price, priceMax, priceCurrency, priceIsFlexible, isSoldOut, spotsRemaining |
| Registration and how many have signed up | requiresApproval, registrationStatus, waitlistActive, guestCount, ticketCount |
| Visibility, type and images | visibility, eventType, coverImageUrl, socialImageUrl |
| With the full details switched on: description, Luma's tags, every ticket tier | description, categories, ticketTypes |
| Which of your targets found it, and when | source, sourceInput, position, scrapedAt |
βΆοΈ How to scrape Luma events
- Open Luma Events Scraper and click Try for free.
- Type city slugs into Cities, or paste links into Luma URLs. Both together is fine.
- Add a Keyword filter if you want to narrow a city feed.
- Set Maximum events. Start around 50 to see the output shape, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Run it with nothing filled in and you get one labelled sample row, which is not charged.
π° How much does it cost to scrape Luma events?
$2.125 per 1,000 events. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 2,300 events.
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 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 servers of your own, given as URLs, are used; the box's other options are ignored. |
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 run in September 2026:
{"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 | How to read it |
|---|---|
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.
| 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 turned the query down 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.
π‘ What people use it for
- Pulling the week ahead in three or four cities and filtering by keyword to find the ones worth attending.
- Watching a community calendar on a schedule and picking up what was added since the last run,
deduping on
eventId. - 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,
addressIsHiddenistrueand the address fields arenull. - A city feed is upcoming-only and short. 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. - It is not an official Luma tool. Dami's Studio is independent and is not affiliated with or endorsed by Luma, or by any other company named on this page.
π§ Which events scraper do you need?
| If you want | Use |
|---|---|
| Upcoming Eventbrite events in a city, with venue, organiser and ticket prices | Eventbrite Events Scraper |
| Luma events by city or community calendar, with hosts and ticket prices | This one |
| Public Facebook events by keyword, city or Page | Facebook Events Scraper |
| Hackathons and student competitions in India, from Unstop | Unstop Scraper |
β Questions people ask
Do I need a Luma account to scrape events?
No. Nothing to sign up for and no key to apply for.
How do I get past Luma events?
Paste a community calendar into Luma URLs and set Past or upcoming to past. City pages have no history to give.
Which cities does Luma cover?
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 and ticket tiers?
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 call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/luma-events-scraper. Either way the
run happens on your Apify account at the same price.
Is it legal to scrape Luma events?
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 the legality of web scraping 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.