---
title: "Search fitness & wellness experiences"
method: GET
path: "/public/v1/experiences/search"
tags: ["Public API"]
---

# Search fitness & wellness experiences

`GET /public/v1/experiences/search`

## Request

- Base URL: `https://ilove.sweatpals.com/api`
- URL: `https://ilove.sweatpals.com/api/public/v1/experiences/search`
- Auth: none declared

Find upcoming fitness and wellness experiences (classes, run clubs, workouts, retreats, wellness sessions) that match what the user asked for, ranked by semantic relevance to `query`.

Use it whenever the user wants something to do, join or attend — "a beginner yoga class this weekend in Austin", "free run clubs near me", "sound bath under $30". Put the activity and vibe in `query`; put place, dates and budget in the dedicated parameters rather than in `query`.

Location: send `lat` + `lng` (+ optional `radius_km`) when you know the user's position, otherwise `market` with a city slug from `GET /public/v1/markets` or a plain city name ("Austin" or "Austin, TX"). Without either, results are not location-filtered.
Dates default to the next 90 days. Only public, published experiences are returned, one entry per recurring series (its next matching date).

Pagination: when `next_cursor` is non-null, call again with the same parameters plus `cursor`. A page can contain fewer than `limit` results (e.g. when `price_max` filters some out) — keep going while `next_cursor` is non-null.

Example: `GET /public/v1/experiences/search?query=sunrise%20trail%20run&market=austin-tx&date_from=2026-10-01&date_to=2026-10-07&price_max=20&limit=5`

Send the user to each result's `url` to view and book; call `GET /public/v1/experiences/{id}` for full details.

## Query parameters

- `query` string, required
- `lat` number
- `lng` number
- `radius_km` number
- `market` string
- `date_from` string
- `date_to` string
- `price_max` number
- `currency` string
- `limit` number
- `cursor` string

## Response `200`

Matching experiences, most relevant first.

- PublicExperiencesSearchResponseDto
  - `results` PublicExperienceSummaryDto[], required
    - `id` string, required: Occurrence id; pass it to `GET /experiences/{id}`.
    - `event_id` string, required: Series id shared by every occurrence of a recurring experience (informational).
    - `title` string, required
    - `short_description` string, nullable, required: Plain-text summary, at most 300 characters.
    - `start` string, required: Start in ISO 8601 with the venue's UTC offset.
    - `end` string, nullable, required: End in ISO 8601 with the venue's UTC offset.
    - `timezone` string, required: IANA time zone of the venue.
    - `venue` PublicVenueDto, required
      - `name` string, nullable, required: Venue or place name as the host entered it.
      - `address` string, nullable, required: "City, Region, Country" of the venue; street addresses are not exposed.
      - `lat` number, nullable, required
      - `lng` number, nullable, required
    - `is_online` boolean, required
    - `market` PublicMarketRefDto, required
      - `slug` string, required: Stable market identifier; pass it as `market` to search.
      - `name` string, required: City name.
      - `region` string, nullable, required: State / region name.
    - `price` PublicPriceDto, required
      - `amount` number, nullable, required: Lowest ticket price checkout charges now (active time-based offers applied), in major units (e.g. 25.5 = $25.50); 0 when free, the minimum donation when donation-based, null when unknown.
      - `currency` string, nullable, required: ISO 4217 currency of `amount`; null when free or unknown.
      - `is_free` boolean, required
      - `is_donation_based` boolean, required: Pay-what-you-want; `amount` is the minimum donation when set.
    - `host` PublicHostDto, required
      - `id` string, required
      - `name` string, required: Host (community or person) display name.
      - `url` string, required: Host page on Sweatpals.
    - `tags` string[], required: Activity tags (e.g. Running, Yoga).
    - `availability` 'available' | 'limited' | 'sold_out' | 'waitlist' | 'unknown', required: `limited` = 5 or fewer spots left; `waitlist` = sold out with an open waitlist; `unknown` = could not be determined (never implies sold out).
    - `spots_remaining` number, nullable, required: Spots left; null when capacity is unlimited or unknown.
    - `image_url` string, nullable, required
    - `url` string, required: Canonical event page; send the user here to view and book.
  - `next_cursor` string, nullable, required: Pass as `cursor` (with the same other params) for the next page; null on the last page. Pages may hold fewer than `limit` results.
  - `market` PublicMarketRefDto, required
    - `slug` string, required: Stable market identifier; pass it as `market` to search.
    - `name` string, required: City name.
    - `region` string, nullable, required: State / region name.
  - `query` string, required: The query as interpreted (trimmed).

## Other responses

- `400`: A parameter is missing or invalid (INVALID_PARAMETER).
- `429`: Rate limit exceeded (RATE_LIMITED).

---

[API](https://skmtc.dev/sweatpals/apis/sweatpals-public-api.md) - [All operations](https://skmtc.dev/sweatpals/apis/sweatpals-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sweatpals/apis/sweatpals-public-api/revisions/164492d152a9?raw)
