---
title: "Global search"
method: GET
path: "/search"
tags: ["Search"]
---

# Global search

`GET /search`

## Request

- Base URL: `https://joinways.app/api/v1`
- URL: `https://joinways.app/api/v1/search`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://joinways.app/oauth/authorize`, token URL `https://joinways.app/api/oauth/token`, scopes: `mcp.read`)

Searches events, companies and people of the workspace (same engine as the app's search), best match first. Not paginated. **Role permission:** none (any member).

## Query parameters

- `q` string, required
- `types` string[]
- `limit` integer

## Response `200`

Search results.

- object
  - `results` SearchResult[], required
    - `id` string, uuid
    - `type` 'event' | 'company' | 'person'
    - `title` string
    - `subtitle` string, nullable
    - `highlighted_title` string, nullable
    - `highlighted_subtitle` string, nullable
    - `relevance_score` number
    - `event_start_date` string, nullable: Events only.
    - `event_end_date` string, nullable
    - `event_status` string, nullable
    - `event_location` string, nullable
    - `event_location_color` string, nullable
    - `event_owner_name` string, nullable
    - `company_website` string, nullable: Companies only.

## Other responses

- `400`: Validation failed (`invalid_request`). For a body that fails the schema, `details` holds `formErrors` and `fieldErrors`.
- `401`: Missing, invalid, expired or revoked bearer token (`unauthorized`).
- `429`: Too many requests (`rate_limited`). `details.reason`: `per-ip`, `per-account-minute`, `per-account-day`, or `email_rate_limited` (email budget). Always carries `Retry-After`: wait that many seconds.

---

[API](https://skmtc.dev/joinways/apis/joinways-public-api.md) · [All operations](https://skmtc.dev/joinways/apis/joinways-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/joinways/apis/joinways-public-api/revisions/39e84309953e?raw)
