Ulsav Docs
Events

Discovery

What the public search shows, which filters and sorts exist, and why an Event is missing from results

Discovery is the public search across every Organization's Events. Nothing to configure: an Event is either eligible or it is not.

Results read the operational tables directly, so they reflect an Event's current state rather than a copy that can drift.

What is eligible

Four conditions must all hold.

ConditionValue
Publicationpublished
Visibilitypublic
Moderationactive
Schedulescheduled or postponed

Everything else is absent from results, and most of it is absent without an error.

StateIn search?Why
Draft, private, unlistedNoNot public
Archived, cancelled, completedNoNothing left to buy
Suspended or bannedNoModeration gate
PostponedYesStill happening, just later

Postponed is included on purpose: the Event still happens, so it stays findable with its notice attached.

Filters

FilterAcceptsNotes
qFree textName, summary, venue, city, category, topic names
categoryOne catalogue slugThe format axis
topicsOne or more slugsMatches any of them
modein_person, online, hybridExact participation mode
onlinetrue or falseTrue includes hybrid; false excludes online
dateFromRFC 3339Keeps Events ending at or after this moment
dateToRFC 3339Keeps Events starting at or before this moment
cityIdGazetteer city IDExact city
cityNameCity nameCase-insensitive match
venueIdVenue IDOne venue
pricefree or paidBased on active Passes
seriesIdEventSeries IDMember Events of one series
nearlat,lngOrigin for distance
radiusKm0 to 500Requires near
bboxminLng,minLat,maxLng,maxLatMap viewport

The date pair overlaps rather than contains: an Event that started yesterday and runs today still matches dateFrom today.

Price is about the offer. An Event with one free and one paid Pass matches both free and paid.

Topics match any, not all: music, food returns Events tagged with either.

Sorts

SortDefault whenOrder
dateNo query and no originEarliest start first
relevanceA query is present, with or without an originFull-text rank, highest first
distanceNo query, and an origin is presentNearest first

Two combinations are rejected with a 400: relevance without a query, and distance without an origin.

Text search covers name, summary, venue, city, category, and topic names. Alongside that it runs a plain substring match on the Event name, the venue name, and topic names, so a partial word still finds something.

Queries are parsed as web-search syntax, so or and quoted phrases work.

Pagination

Results page 20 at a time, up to 100. Each page carries a cursor bound to its filter.

Changing a filter mid-scroll invalidates the cursor, and the API returns an invalid-cursor error instead of mixing two result sets.

There is no offset parameter, so a page stays stable when an Event is published between requests.

Date searches page cleanly. Distance can repeat the boundary card, because the cursor stores the distance rounded to three decimals. Relevance is worse: the cursor loses the rank, so a second page returns an incomplete set instead of the next slice.

Use date when a query has more matches than one page.

What a result carries

A card renders from one call.

FieldNotes
IdentityID, slug, name, summary
OrganizerOrganization display name
ScheduleStart and end instants, timezone
PlaceCity, region, country, precision
DistancePresent only for distance searches
PriceMode, lowest price, optional strike-through price, currency
ArtworkCover and poster URLs
StyleThe Event's presentation selection
CollectionsOwning series or group, only when published and non-private
Paused flagTrue when sales are paused

Price follows the cheapest active Pass, with a strike-through when an active Pass carries a higher list price. An Event with no active Pass reports mode none, not "free".

A series or group is attached only when it is published, non-private, and owned by the same Organization, so private collections never leak.

Location follows the exact-venue setting: off drops the venue name and address and rounds coordinates to two decimals.

City facets

The popular-cities endpoint returns up to 50 cities with their eligible Event counts, ordered by count then name. It uses the same rules as search, so a city with only private or cancelled Events drops off.

A worked example

A buyer types "music", picks Bengaluru, and filters to free.

The API receives q=music&cityName=Bengaluru&price=free, sorts by relevance, and returns 20 matches, each with its price, organizer, and rounded map point.

Priya's unlisted sound-check does not appear though it matches every term. Her public festival does: published, public, active, scheduled, with a free Pass.

On this page