📖 Context Slice

Luma API Reference

API reference for Luma event management including cookie-based authentication and web scraping approaches

The Luma API requires you to own or manage an event to fetch its details via the official API endpoints. For public events you don't own, web scraping is the only viable option.

---

What Doesn't Work (API Authentication Issues)

Official API Endpoints That Fail

All these attempts resulted in authentication errors:

1. Get Event endpoint (/v1/event/get)

  • URL: https://public-api.luma.com/v1/event/get?event_api_id={eventId}
  • Error: 400 Bad Request - Missing event identifier
  • Requires: Event ownership/management access

2. Lookup Event endpoint (/v1/calendar/lookup-event)

  • Still requires event ownership

3. Entity Lookup endpoint (/v1/entity/lookup)

  • URL: https://public-api.luma.com/v1/entity/lookup?url={url}
  • Error: 400 Bad Request - Invalid input: expected string, received undefined
  • Not suitable for public events

Why These Fail

The Luma API is designed for event managers/hosts to programmatically manage their own events. It's not a public data API for viewing any event.

---

✅ What Works

Option 1: Cookie-Based Authentication (For Admin/Guest Access)

Important: This approach uses the api2.luma.com endpoint (not the public API) with cookie authentication.

The Cookie That Works

__stripe_mid=588eff62-04c6-4d1f-8b3e-79c32473b15bc7d41c; luma.evt-JWQLBSkGWnuaADY.registered-with=usr-3LEWr3lyQSCOFkQ; luma.auth-session-key=usr-3LEWr3lyQSCOFkQ.08gl83p3j2a9yqcae4j8; luma.evt-sTJB1vG5ovVhnWm.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-XVJmNwrFOIYxZX1.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-ZxCl3Vtn5SNcoLH.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-qswNTyuE7T5QwLb.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-Bk2BNV9DvC99D8p.registered-with=usr-3LEWr3lyQSCOFkQ; luma.did=16vywvlkxqnl92c5vk5g1h9j9j67dj; luma.first-page=%2Fka2o8dzo; __stripe_sid=45525520-b2de-4476-b916-3dad3d6a1acedd8ea7; luma.native-referrer=https%3A%2F%2Fluma.com%2Fcalendar%2Fmanage%2Fcal-G9niBUMKeNUTm4O%2Fevents%3Fe%3Dcalev-wcMNhNFvllMsuxv; __cf_bm=b_x4xwOpG0IkaEphBO6177AsySg11A2FpSD14dHezRY-1764138490-1.0.1.1-VrYx4Ph6IwshFAlPiYEMiFEd_v4QP9l96nIra9OlhPvMmHaYOfVOPvp0xqj07y02elGPUiml0E8_AhuTDOASFLZvChySZFFj7ej1tmlFVhA

How to Use It

Endpoint: GET https://api2.luma.com/event/admin/get-guests

Query Parameters:

  • event_api_id: The event ID (e.g., evt-u4aRgr0hLaNqiQV)
  • pagination_limit: Number of results (e.g., 100)
  • query: Search query (empty for all)
  • sort_column: Sort by field (e.g., registered_or_created_at)
  • sort_direction: desc or asc

Headers:

{

'accept': '/',
'cookie': '',
'x-luma-client-type': 'luma-web',
'origin': 'https://luma.com',
'referer': 'https://luma.com/'
}

Example Code:

const eventId = "evt-u4aRgr0hLaNqiQV";

const response = await fetch(
https://api2.luma.com/event/admin/get-guests?event_api_id=${eventId}&pagination_limit=100&query=&sort_column=registered_or_created_at&sort_direction=desc,
{
headers: {
accept: "/",
cookie:
"__stripe_mid=588eff62-04c6-4d1f-8b3e-79c32473b15bc7d41c; luma.evt-JWQLBSkGWnuaADY.registered-with=usr-3LEWr3lyQSCOFkQ; luma.auth-session-key=usr-3LEWr3lyQSCOOFkQ.08gl83p3j2a9yqcae4j8; luma.evt-sTJB1vG5ovVhnWm.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-XVJmNwrFOIYxZX1.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-ZxCl3Vtn5SNcoLH.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-qswNTyuE7T5QwLb.registered-with=usr-3LEWr3lyQSCOFkQ; luma.evt-Bk2BNV9DvC99D8p.registered-with=usr-3LEWr3lyQSCOFkQ; luma.did=16vywvlkxqnl92c5vk5g1h9j9j67dj; luma.first-page=%2Fka2o8dzo; __stripe_sid=45525520-b2de-4476-b916-3dad3d6a1acedd8ea7; luma.native-referrer=https%3A%2F%2Fluma.com%2Fcalendar%2Fmanage%2Fcal-G9niBUMKeNUTm4O%2Fevents%3Fe%3Dcalev-wcMNhNFvllMsuxv; __cf_bm=b_x4xwOpG0IkaEphBO6177AsySg11A2FpSD14dHezRY-1764138490-1.0.1.1-VrYx4Ph6IwshFAlPiYEMiFEd_v4QP9l96nIra9OlhPvMmHaYOfVOPvp0xqj07y02elGPUiml0E8_AhuTDOASFLZvChySZFFj7ej1tmlFVhA",
"x-luma-client-type": "luma-web",
origin: "https://luma.com",
referer: "https://luma.com/",
},
}
);

if (response.ok) {
const data = await response.json();
console.log(Total Attendees: ${data.entries?.length || 0});

data.entries?.forEach((guest) => {
console.log(${guest.name} (${guest.email}) - ${guest.approval_status});
});
} else {
console.error("Failed:", response.status, await response.text());
}

What You Get:

  • Full guest list with names, emails, approval status
  • Registration answers
  • Ticket information
  • Check-in status
  • User profile data

Important Notes:

  • ⚠️ This uses an internal API endpoint (api2.luma.com), not the public API
  • ⚠️ Cookies may expire and need to be refreshed from a browser session
  • ⚠️ This requires that you're registered/have access to the event
  • ✅ Works even if you don't own/manage the event (unlike the official API)

Option 2: Web Scraping (For Public Event Info)

For public Luma events, use web scraping to extract event details:

Method

const eventUrl = "https://lu.ma/event/evt-u4aRgr0hLaNqiQV";

const response = await fetch(eventUrl);
const html = await response.text();
// Parse the HTML to extract event details

Better Approach: Use Jina Reader

Use a tool like webfetch with Jina Reader to get clean markdown:

// Using webfetch tool

const markdown = await webfetch({
url: "https://lu.ma/event/evt-u4aRgr0hLaNqiQV",
format: "markdown",
});

Example Output

From the scraped page, you can extract:

  • Event title: "Wordware Presents Sauna (2:00pm) + Friendsgiving Dinner (3:30pm): SF Only"
  • Event description (full text)
  • Timing details: "2:00pm - Sauna Product Presentation", "3:30pm - Turkey in the Sauna Dinner"
  • Event details and agenda

---

Event ID Format

Luma event IDs follow this format:

  • Pattern: evt-{alphanumeric}
  • Example: evt-u4aRgr0hLaNqiQV

You can extract the event ID from URLs like:

https://luma.com/event/evt-u4aRgr0hLaNqiQV?pk=g-cu8K8nGIpxISixT

---

API Reference

Official Luma API documentation: https://docs.lu.ma/

Key Endpoints (For Event Owners Only)

  • Get Event: GET https://public-api.luma.com/v1/event/get?event_api_id={eventId}
  • Get Guests: GET https://public-api.luma.com/v1/event/get-guests?event_api_id={eventId}
  • Create Event: POST https://public-api.luma.com/v1/event/create

Authentication

API key via header:

x-luma-api-key: your-api-key-here

Important: Even with a valid API key, you can only access events you own/manage.

---

Best Practice

For Getting Guest Lists (Attendees):

1. Use cookie-based auth with api2.luma.com if you have access/are registered
2. Extract cookies from your browser session (DevTools → Network → Copy cookie header)
3. Note: Cookies expire, so you may need to refresh them periodically

For Fetching Public Event Details:

1. Use web scraping (via webfetch or similar)
2. Don't waste time trying official API endpoints - they won't work without event ownership
3. Parse the event page directly to get all public information

For Managing Your Own Events:

1. Use the official Luma API (public-api.luma.com)
2. Get your API key from Settings → Options → API Keys
3. Requires Luma Plus subscription

Cookie Expiration

The cookie authentication method may stop working when:

  • Session expires (typically after some time)
  • You log out of Luma
  • Cookies are cleared from your browser

To refresh:

1. Log into Luma in your browser
2. Open DevTools → Network tab
3. Make any request to luma.com
4. Find the request and copy the Cookie header value
5. Update your code with the new cookie string