Luma Events Scraper API (lu.ma) avatar

Luma Events Scraper API (lu.ma)

Pricing

from $2.07 / 1,000 events

Go to Apify Store
Luma Events Scraper API (lu.ma)

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

8 days ago

Last modified

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.

Inputlu.ma event, city, calendar or category links, or plain city names
OutputOne row per event: name, times with the timezone, venue and coordinates or online, hosts and their links, price, registrations
Ceiling5,000 events per run
Account neededNone
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 getField
The event, its ids and its pageeventId, slug, url, name
Start and end, in UTC and in the event's own clockstartAt, endAt, startAtLocal, endAtLocal, timezone, durationMinutes
Online or at a venuelocationType, isOnline
The venue's address and coordinates, unless the host hides themvenueName, addressFull, addressShort, city, cityState, region, country, countryCode, latitude, longitude, addressIsHidden
Who hosts it, with the social links each host filled inhostName, hostUsername, hostCount, hosts
The calendar it belongs tocalendarName, calendarSlug, calendarUrl, calendarIsPersonal, calendarIsVerified
Price and ticketsisFree, price, priceMax, priceCurrency, priceIsFlexible, isSoldOut, spotsRemaining
Registration and how many have signed uprequiresApproval, registrationStatus, waitlistActive, guestCount, ticketCount
Visibility, type and imagesvisibility, eventType, coverImageUrl, socialImageUrl
With the full details switched on: description, Luma's tags, every ticket tierdescription, categories, ticketTypes
Which of your targets found it, and whensource, sourceInput, position, scrapedAt

▶️ How to scrape Luma events

  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.

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
}
FieldDefaultWhat it is
startUrlsnone, the box starts with https://lu.ma/sfAny lu.ma link, one per line. Event pages, city pages, community calendars and category pages all work, and a bare slug works too.
citiesnoneLuma discover cities. Use the slug (sf, nyc, london, berlin, tokyo, bengaluru) or the plain name. Luma runs discover pages for 87 cities.
searchQuerynoneKeyword filter applied to every city and calendar feed, for example hackathon or yoga.
categoryanytech, ai, crypto, climate, food, arts, fitness, wellness. See the warning below.
maxItems50Hard cap on rows across every target, 1 to 5,000.
periodupcomingpast pulls a calendar's history instead. Only affects community calendars.
includeDetailsoffOne extra request per event, adding the description, Luma's own tags and every ticket tier with its price.
proxyConfigurationnoneOptional. 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"
}
FieldHow to read it
eventIdStable. Use it to dedupe across runs and across targets.
startAtLocal, endAtLocalThe event's own wall clock, already in timezone. startAt and endAt are the UTC pair.
addressIsHiddenSome hosts only reveal the address after you register. When this is true, the address fields are null and stay that way.
isFree, price, priceMax, priceCurrencyprice and priceMax are the cheapest and dearest tier in major currency units. All null on a free event.
priceIsFlexibleTrue when the host lets attendees pick what to pay.
hostsEvery host, with the social links each one has filled in. hostName and hostUsername repeat the first.
guestCount, ticketCountHow many are registered. 0 is a real answer on a new event, not a missing value.
spotsRemainingnull unless the host published a capacity.
calendarIsPersonaltrue means the event hangs off a person's own calendar rather than a community one, and calendarSlug and calendarUrl are then null.
description, categories, ticketTypesnull unless you switch on includeDetails.
source, sourceInputWhich 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.

RowHow to spot itCharged
An eventIt has an eventId and neither flag belowyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

A real event row carries no ok or charged field, so filter on _sample and _diagnostic being absent.

CodeWhat it means
BAD_URLNot a lu.ma link, or not one this actor can read.
UNSUPPORTED_URLlu.ma/u/<username> is a person's profile, not an event feed. Paste their calendar instead.
NOT_FOUNDThat slug does not exist on lu.ma any more.
CITY_NOT_FOUNDLuma has no discover page for that city. The error names the nearest matches it does have.
NO_RESULTSThe feed answered and held nothing. On a calendar, try switching to past events.
BAD_REQUESTLuma turned the query down as malformed.
API_ERRORLuma answered with an error. Re-run it.
BAD_RESPONSELuma 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, addressIsHidden is true and the address fields are null.
  • 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 scrapedAt records 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 wantUse
Upcoming Eventbrite events in a city, with venue, organiser and ticket pricesEventbrite Events Scraper
Luma events by city or community calendar, with hosts and ticket pricesThis one
Public Facebook events by keyword, city or PageFacebook Events Scraper
Hackathons and student competitions in India, from UnstopUnstop 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.

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.