Skip to main content
GET
Search active packs
Free-text search over active packs. Public, no authentication required. The search covers exactly the packs the active-pack listing returns, with the same ACTIVE, trade-window, and eligibility gating, so it never surfaces a pack the listing hides.

When to use

Use this endpoint to power a pack search box. Pack names are often editorial and say nothing about their contents, so the search also matches what is inside each pack: leg team names, match titles, market titles, and league names. A user searching for a team or league finds every active pack that carries it, even when the pack name mentions neither.

Matching

  • Matching is case- and accent-insensitive: koln matches 1. FC Köln, fenerbahce matches Fenerbahçe.
  • The search tokenizes the query, so word order does not matter and words can match across different fields: man city finds a Manchester City pack, and vitality 9z finds a pack holding both teams in different legs.
  • Every word in the query must appear somewhere for a pack to match.
  • query must be 2-100 characters. A query shorter than 2 characters after trimming returns an empty array rather than an error, matching /markets/search.

Ranking

Results come back in three relevance tiers:
  1. Packs whose name matches the query.
  2. Packs where a single leg’s team names or match title carries the whole query. A query spread across different legs does not earn this tier.
  3. Packs matched across any other fields, such as market titles or league names.
Within a tier, packs keep the listing’s order (earliest deadline first).

Limits and availability

  • limit caps the number of results at 1-50. The default is 20.
  • When packs are paused platform-wide, the search returns an empty array, matching the listing.

Caching

Responses carry Cache-Control: public, max-age=30, stale-while-revalidate=60, so results can trail the live listing by up to a minute.

Query Parameters

query
string
required

Free-text query, matched case- and accent-insensitively against the pack name, its legs' team names, match titles, market titles, and league names. A query shorter than 2 characters after trimming returns an empty array.

Required string length: 2 - 100
Example:

"liverpool"

limit
number
default:20

Maximum number of results to return.

Required range: 1 <= x <= 50

Response

Matching active packs, ranked by relevance

id
string
required
name
string
required
parlayType
enum<string>
required
Available options:
CLOB,
NEGRISK
status
enum<string>
required
Available options:
ACTIVE,
CLOSED,
DRAFT,
HIDDEN
wasteStrategy
enum<string>
required

Waste-disposition strategy for parlays bought from this pack

Available options:
HOLD,
SELL
earliestDeadline
string
required

ISO timestamp of the earliest leg deadline

legs
object[]
required
payout
object
required

Always computed with stake = "10"

properties
object[]
required

Property-key tags attached to this pack (used by filter pages)

inDeadlineWindow
boolean
required

Mirrors the deadline gate the active-pack listing applies. False packs are hidden from users even when ACTIVE.

packOutcome
enum<string>
required

LOST the moment any resolved leg mismatches, WON only when every leg resolves matching, PENDING otherwise

Available options:
WON,
LOST,
PENDING
eligible
boolean

True when the pack would be accepted by a quote against current orderbook state. False signals clients to disable the buy CTA and surface ineligibleReason.

ineligibleReason
string | null

Single-line reason from the most recent quote attempt when eligible=false. Null when eligible.