API reference
Event discovery
Written and maintained by The ProspectAPIs team
The event discovery API finds public events on Luma and Partiful in a city and returns them in one record shape, whatever the platform: when and where, the guest count where the host shows it, the hosts and organiser with their platform ids, and the ticket price. Every event is read from the public pages anyone can open, never through an account.
Launching soon, nothing is charged. These routes answer 503 until pricing lists event discovery as available.
GET /v1/events
Events in one city (a slug such as sf, nyc or london, or a city name), soonest first. Filter with platform (luma, partiful), since and until (days in the city's own time; since defaults to today), category (Luma's: ai, tech, crypto, arts, climate, fitness, wellness, food, books, games, family, running), min_guests and max_guests (only events that show their count match), host, speaker (a host, a listed speaker, or a name in the title), q (title) and free. Page with cursor: pass back next_cursor exactly as returned.
curl "https://api.prospectapis.com/v1/events?city=sf&category=ai&min_guests=100" \
-H "Authorization: Bearer $PROSPECTAPIS_KEY"{
"data": [
{
"id": "luma.evt-AbC123",
"platform": "luma",
"platform_event_id": "evt-AbC123",
"url": "https://luma.com/example-demo-night",
"title": "Example Robotics Demo Night",
"start_at": "2026-11-05T02:00:00.000Z",
"end_at": "2026-11-05T05:00:00.000Z",
"start_local": "2026-11-04T18:00:00-08:00",
"end_local": "2026-11-04T21:00:00-08:00",
"timezone": "America/Los_Angeles",
"city": "San Francisco",
"city_slug": "sf",
"country_code": "US",
"venue": { "name": "Example Hall", "address": "1 Example St, San Francisco, CA", "lat": 37.78, "lng": -122.40 },
"online": false,
"category": "ai",
"categories": ["ai"],
"guest_count": 240,
"guest_count_exact": true,
"hosts": [{ "id": "usr-AbC123", "name": "Alex Example", "role": "host", "x_handle": "alexexample" }],
"speakers": [],
"organizer": { "id": "cal-AbC123", "name": "Example Robotics", "url": "https://luma.com/example-robotics" },
"ticket": { "is_free": true, "price_min": null, "price_max": null, "currency": null, "sold_out": false, "requires_approval": true },
"cover_url": "https://images.example.com/cover.png",
"first_seen_at": "2026-11-03T18:02:11Z",
"last_seen_at": "2026-11-03T18:02:11Z"
}
],
"next_cursor": null,
"count": 1,
"city": { "slug": "sf", "name": "San Francisco", "timezone": "America/Los_Angeles" },
"sources": [
{ "platform": "luma", "status": "ok", "read_at": "2026-11-03T18:02:11Z", "events_seen": 351, "complete": true, "cached": false },
{ "platform": "partiful", "status": "not_covered", "reason": "category_not_published" }
]
}The example shows a fictional event.
Sources and freshness
sources says, for each platform, whether it was read (ok, with when and how many events it showed), does not cover this city or filter (not_covered), or could not be read right now (unreadable, with a reason). One platform that cannot be read never fails the call; the route answers 503 only when every platform asked for is unreadable and we hold nothing for the search, and that costs nothing. A city is read from each platform at most once every 15 minutes; inside that window the answer comes from what we stored, and cached is true. We keep every event we have seen, so a city holds more than one platform page shows at once. Later pages read only what is stored.
GET /v1/events/cities
Every city we cover, with its slug, time zone and which platforms cover it: Luma covers 87 cities, Partiful 9 (San Francisco, New York, Los Angeles, Austin, Boston, Chicago, Washington DC, London and Miami). Free.
GET /v1/events/:id
One event read fresh from its platform, with Luma's categories and Partiful's hosts by name. An unknown id answers 404 and is free.
POST /v1/events/enrich
One event's speakers, sponsors, agenda and side events. Send {"url": "https://luma.com/..."} (a Luma or Partiful event page) or {"id": "luma.evt-..."}. Each of the four sections comes back as {status, reason, items}: ok when something was found, not_published when the page was read and lists none, unreadable when we could not tell. An empty list never stands alone, so "no speakers found" and "could not read the speakers" never look the same.
Neither platform publishes a speaker or sponsor list, so those come from the text the host wrote. Every such item says so: "source": "description", the heading it sat under, and a confidence from 0 to 1. Luma's own session list, when an event has one, is "source": "platform". A speaker who is also a host carries the host's own profile link; nobody else's link is guessed. Side events are the event pages the description links, each read for its title and start. Launching soon, nothing is charged.
curl -X POST "https://api.prospectapis.com/v1/events/enrich" \
-H "Authorization: Bearer $PROSPECTAPIS_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://luma.com/example-demo-night"}'Record fields
| Field | Meaning |
|---|---|
| id | Our id for the event: the platform and its own id, such as luma.evt-AbC123 or partiful.AbC123xyz. |
| platform | luma or partiful. |
| platform_event_id | The platform's own stable id for the event. |
| url | The event's public page on its platform. |
| title | The event's name. |
| start_at, end_at | Start and end in UTC (ISO 8601). end_at is null when the host gave no end. |
| start_local, end_local | The same instants in the event's own time zone, with the offset, such as 2026-11-03T17:00:00-08:00. |
| timezone | The event's IANA time zone. |
| city, city_slug, country_code | The event's own city (it can be a neighbouring city in the metro area), the catalog city it was found in, and the ISO country code. |
| venue | name, address, lat and lng where the platform shows them; null when the host hides the address. |
| online | true for an online event. |
| category, categories | Luma's own category slug (ai, tech, crypto and so on), unchanged. Partiful publishes no category, so both are null and []. |
| guest_count, guest_count_exact | The guest count where the host shows it, and true when it is the platform's exact count. Both are null when the host hides the guest list (never 0). |
| hosts | Each host's platform id, name, role and public handles (x_handle, linkedin, instagram) where the platform shows them. |
| speakers | People the platform names as speakers. Neither platform publishes a speaker list today, so this is []; the speaker filter matches hosts and the title instead. |
| organizer | The organising calendar or page: its platform id, name and url (a Luma calendar). Null on Partiful. |
| ticket | is_free, price_min, price_max (in the currency's major unit), currency, sold_out and requires_approval, where shown. |
| cover_url | The event's cover image. |
| first_seen_at, last_seen_at | When we first and last saw the event on its platform. |
Watching a city
Create a watchlist with "kind": "events" and "filters": {"city": "sf", "category": "ai"} (any filter above but dates and paging) to get each new matching event pushed to your webhook as event.discovered, once per event, when we first see it.
Next steps
Create a free account to get a key; every account starts with a free $1 balance. An event's hosts lead into company profiles and email checks for the people you want to meet there. Our guide to researching prospects with an AI agent shows how to turn a guest list or a host into a short, cited brief before you go.
Was this page helpful?