Skip to content
ProspectAPIs

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.

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.

bash
curl "https://api.prospectapis.com/v1/events?city=sf&category=ai&min_guests=100" \
  -H "Authorization: Bearer $PROSPECTAPIS_KEY"
200 OK
{
  "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.

bash
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

FieldMeaning
idOur id for the event: the platform and its own id, such as luma.evt-AbC123 or partiful.AbC123xyz.
platformluma or partiful.
platform_event_idThe platform's own stable id for the event.
urlThe event's public page on its platform.
titleThe event's name.
start_at, end_atStart and end in UTC (ISO 8601). end_at is null when the host gave no end.
start_local, end_localThe same instants in the event's own time zone, with the offset, such as 2026-11-03T17:00:00-08:00.
timezoneThe event's IANA time zone.
city, city_slug, country_codeThe 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.
venuename, address, lat and lng where the platform shows them; null when the host hides the address.
onlinetrue for an online event.
category, categoriesLuma's own category slug (ai, tech, crypto and so on), unchanged. Partiful publishes no category, so both are null and [].
guest_count, guest_count_exactThe 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).
hostsEach host's platform id, name, role and public handles (x_handle, linkedin, instagram) where the platform shows them.
speakersPeople the platform names as speakers. Neither platform publishes a speaker list today, so this is []; the speaker filter matches hosts and the title instead.
organizerThe organising calendar or page: its platform id, name and url (a Luma calendar). Null on Partiful.
ticketis_free, price_min, price_max (in the currency's major unit), currency, sold_out and requires_approval, where shown.
cover_urlThe event's cover image.
first_seen_at, last_seen_atWhen 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?