Luma Events Scraper & Monitor
Pricing
from $0.05 / 1,000 luma events
Luma Events Scraper & Monitor
Collect public Luma events by city, category, calendar or exact URL, enrich event details, and track reliable NEW, UPDATED and confirmed ENDED changes.
Pricing
from $0.05 / 1,000 luma events
Rating
0.0
(0)
Developer
Luka
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Collect public Luma events by city, category, calendar, or exact event URL. Get clean event rows with stable identities, enrich public details, or safely track NEW, UPDATED, and confirmed ENDED changes across scheduled runs.
🚀 Start in 60 seconds
The default collects upcoming San Francisco events. Copy this input into the Actor, press Start, and open the Dataset:
{"workflow": "collect","citySlugs": ["sf"],"detailLevel": "core","maxResults": 100}
Every successful event has a stable luma:event:<event-id> identity, canonical URL, start/end time, timezone, location, registration context, organizer calendar, and source-published fields. Missing optional fields remain null; nothing is guessed.
🎯 Choose the right workflow
| Goal | Choose | Result |
|---|---|---|
| Export current events | workflow: collect + detailLevel: core | Fast normalized event rows |
| Get descriptions, categories and ticket types | workflow: collect + detailLevel: detailed | Public detail-enriched rows, up to 100 events |
| Track changes | workflow: monitor | Only delivered NEW, UPDATED, and confirmed ENDED changes |
For monitoring, schedule the same input and keep the same stateNamespace. The first run creates a baseline by default. Repeat runs compare the current complete scope with that baseline; one missing observation never ends an event.
📦 What you get

| Group | Fields |
|---|---|
| Identity | stableId, sourceId, eventId, slug, url |
| Event | title, description, startAt, endAt, timezone, eventType, visibility |
| Location | locationType, fullAddress, address, city, region, country, countryCode, latitude, longitude, virtualUrl |
| Registration | isFree, price, maxPrice, currency, isSoldOut, spotsRemaining, requiresApproval, registrationAvailability, waitlistActive |
| Organizer | calendarId, calendarName, calendarUrl, public social links, hosts |
| Detail | categoryNames, featuredGuests, ticketTypes, media URLs |
| Audit | observedAt, sourceTargets, sourceClass, coverageStatus |
Example event:
{"recordType": "event","stableId": "luma:event:evt-NRWoIJ0rk2BEm8a","url": "https://luma.com/a16zgrokbotbuildnight","title": "Grok Bot build night for women","startAt": "2026-09-04T00:00:00.000Z","timezone": "America/Los_Angeles","city": "San Francisco","country": "United States","latitude": 37.779409,"longitude": -122.3926127,"isFree": true,"calendarName": "SpaceXAI Community","sourceClass": "PUBLIC_FIRST_PARTY"}
🎛️ Input guide
citySlugs— public city slugs such assf,nyc,london, orberlin.categorySlugs— public categories such asai,climate, orstartups.calendarUrls— exact public Luma calendar URLs.eventUrls— exact public event URLs.period— upcoming, past, or both for calendar targets.detailLevel— Core is the low-cost default; Detailed opens one public detail response per event.- Date, format, price, include-keyword, and exclude-keyword filters narrow delivered rows deterministically.
maxResults, per-target pages, details, runtime, transfer, and buyer-charge guards stop surprise cost. A stopped walk reportsCAPPED.
You may combine up to eight source targets. Duplicate events are merged by stable event ID. Exact URLs do not silently add the default city.
💰 Pricing
Core event rows cost $0.05 per 1,000 events, below the current category leader's advertised $0.07 per 1,000 results. A successful collection also has a $0.001 verified-source charge per run; failed or blocked runs do not pay it. At the 100-event default, the total is $0.006, versus about $0.00705 for the leader.
| Paid event | Price |
|---|---|
| Core event | $0.05 / 1,000 |
| Detailed event | $2.00 / 1,000 |
| Comparable monitoring scan | $0.004 / scan |
| Delivered change | $0.05 / 1,000 |
Detailed replaces the Core row price; the same row is not charged twice. Monitoring charges its scan only when coverage is complete and comparable. Coverage rows are free.
✅ Coverage you can trust
Every run returns a free coverage row and an OUTPUT summary:
COMPLETE— the selected public window completed and is safe for state.EMPTY_CONFIRMED— the completed public source returned no events.FILTERED— useful filters were applied; absence is not comparable.CAPPED— a declared limit stopped a full walk.PARTIAL,BLOCKED, orFAILED— the scope is not safe for removal decisions.
Only COMPLETE or EMPTY_CONFIRMED with comparable target receipts may update monitoring state. ENDED requires two consecutive complete comparable misses. FAILED, FILTERED, PARTIAL, CAPPED, and BLOCKED never create false removals or commit degraded state.
🔌 API and automation
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('luminar/luma-events-scraper-monitor').call({workflow: 'collect',citySlugs: ['sf', 'nyc'],detailLevel: 'core',maxResults: 200});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Use the Dataset views for event columns, changes, and coverage. Use KVS OUTPUT for counts, field coverage, limits, billing events, and the recommended next action. Sequential Apify schedules are the simplest reliable monitoring setup.
⚠️ Not yet supported
Private attendee lists, login-only event data, CAPTCHA solving, automatic email/SMS alerts, outbound messaging, and inferred popularity or investment scores are outside this Actor. Public field coverage varies by event; the Actor reports actual coverage instead of promising universal optional fields.
❓ FAQ and support
Why is an event field null?
The selected public Luma surface did not publish it. Detailed mode may add public description, categories, ticket types, and calendar fields.
Why did monitoring return no rows?
The first run normally seeds a quiet baseline. Later unchanged runs also return no paid changes; inspect the free coverage row and OUTPUT.
Can a failed run end events?
No. Unsafe coverage never evaluates removals or advances state.
How do I keep two monitors separate?
Give each scope a different stateNamespace, then keep each Task input unchanged between sequential runs.
For reproducible support, share the run ID, public input, coverage status, and OUTPUT summary. Never share account cookies or private attendee data.