API reference / Events
Search events in a city
Written and maintained by The ProspectAPIs team
GET/v1/events
GET /v1/events is the ProspectAPIs operation searchEvents, in the Events group of the REST API. Public Luma and Partiful events in one city, soonest first, in one record shape, read without an account. Billed per event returned at GET /pricing events.price_per_event_usd once events are available; an empty page is free. Launching soon: answers 503 and charges nothing until GET /pricing reports events available. sources gives each platform's status: ok, not_covered (the platform does not cover the city or filter; Partiful publishes no category) or unreadable with a reason. Pass next_cursor back as cursor for the next page. Cost: Launching soon. Send your API key as a Bearer token in the Authorization header.
How this fits with the rest of the events API, with worked examples, is in the event discovery guide.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| city required | query | string | A city slug such as sf, nyc or london, or a city name; GET /v1/events/cities lists them. |
| platform | query | string | luma, partiful, or both comma-separated (default both). |
| since | query | string (date) | Only rounds announced on or after this date (inclusive), YYYY-MM-DD. |
| until | query | string (date) | Only rounds announced on or before this date (inclusive), YYYY-MM-DD. |
| category | query | string: ai, tech, crypto, arts, climate, fitness, wellness, food, books, games, family, running | Luma's category: ai, tech, crypto, arts, climate, fitness, wellness, food, books, games, family or running. |
| min_guests | query | integer | At least this many guests; only events that show their count match. |
| max_guests | query | integer | At most this many guests. |
| host | query | string | A host or organiser name or handle contains this text. |
| speaker | query | string | A listed speaker, a host or the title names this person. |
| q | query | string | The title contains this text. |
| free | query | boolean | true for free events only, false for paid only. |
| limit | query | integer | Page size, 1 to 100 (default 25). |
| cursor | query | string | The previous page's next_cursor, passed back unchanged. |
An unknown query parameter is refused with a 400 rather than ignored, so a typo never widens a search you pay for.
Responses
| Status | Meaning |
|---|---|
| 200 | A page of events. |
| 400 | The request was invalid (e.g. a bad filter or input); nothing was charged. |
| 401 | The API key is missing or invalid. |
| 402 | Out of credits. The body carries top_up_url; nothing was charged. |
| 429 | Too many requests; retry after the window. |
| 503 | Events are not available yet, or every platform asked for is unreadable and nothing is stored for this search. Nothing is charged. |
Every error answers with the same JSON body, an error string and sometimes a code; the errors page lists each status and when it happens. A per-key 429 carries Retry-After; see rate limits.
200 response fields
A page of events. The body is a EventList.
| Field | Type | Description |
|---|---|---|
| data required | array of Event | One public event, the same shape for every platform. A field the platform does not publish is null, never guessed. |
| data[].id required | string | The platform and its own id, such as luma.evt-AbC123. |
| data[].platform required | string: luma, partiful | |
| data[].platform_event_id required | string | The platform's own stable id. |
| data[].url required | string (uri) | |
| data[].title required | string | |
| data[].start_at required | string (date-time) | UTC. |
| data[].end_at | string (date-time) or null | |
| data[].start_local | string or null | Local time with the offset. |
| data[].end_local | string or null | |
| data[].timezone required | string or null | |
| data[].city | string or null | |
| data[].city_slug | string or null | |
| data[].country_code | string or null | |
| data[].venue | object or null | |
| data[].online | boolean | |
| data[].category | string or null | Luma's own category slug; null on Partiful. |
| data[].categories required | array of string | |
| data[].guest_count | integer or null | Null when the host hides the guest list. |
| data[].guest_count_exact | boolean or null | |
| data[].hosts required | array of object | |
| data[].speakers | array of object | |
| data[].organizer | object or null | |
| data[].ticket | object or null | |
| data[].cover_url | string or null | |
| data[].first_seen_at | string (date-time) or null | |
| data[].last_seen_at | string (date-time) or null | |
| next_cursor required | string or null | |
| count required | integer | |
| city required | object | |
| city.slug | string | |
| city.name | string | |
| city.timezone | string | |
| sources required | array of EventSource | |
| sources[].platform required | string: luma, partiful | |
| sources[].status required | string: ok, not_covered, unreadable, stored | |
| sources[].reason | string | |
| sources[].read_at | string (date-time) | |
| sources[].events_seen | integer | |
| sources[].complete | boolean | |
| sources[].cached | boolean |
| Header | Meaning |
|---|---|
| RateLimit-Limit | Requests this API key may make per minute. |
| RateLimit-Remaining | Requests left in the current one-minute window. |
| RateLimit-Reset | Seconds until the current window resets. |
Code samples
Each sample sends the same request. Set PROSPECTAPIS_KEY in your environment first. Values come from the spec's examples; replace them with your own.
curl -G https://api.prospectapis.com/v1/events \
-H "Authorization: Bearer $PROSPECTAPIS_KEY" \
--data-urlencode "city=city" \
--data-urlencode "since=2026-10-01" \
--data-urlencode "limit=10"const params = new URLSearchParams({ city: "city", since: "2026-10-01", limit: "10" });
const res = await fetch(`https://api.prospectapis.com/v1/events?${params}`, {
headers: { Authorization: `Bearer ${process.env.PROSPECTAPIS_KEY}` },
});
if (!res.ok) throw new Error(`${res.status}: ${(await res.json().catch(() => ({}))).error ?? res.statusText}`);
const data = await res.json();
console.log(data);import os, requests
res = requests.get(
"https://api.prospectapis.com/v1/events",
headers={"Authorization": f"Bearer {os.environ['PROSPECTAPIS_KEY']}"},
params={"city": "city", "since": "2026-10-01", "limit": 10},
timeout=30,
)
res.raise_for_status()
data = res.json()
print(data)Billing
Billing reserves before it serves: the call holds what it may cost, serves at most what that hold covers, and refunds the rest when the response closes. Any non-2xx answer refunds the whole hold, so a failed call costs nothing. The response reports your balance in X-Credits-Remaining.
Related
The event discovery guide covers this area end to end. Previous operation: Find the contacts a website lists. Next operation: List event cities. Every operation, grouped by area, is on the API reference index.
Create a free account to get a key, then run the samples above with your own values.
Was this page helpful?