---
title: "Admin Message Search"
method: GET
path: "/v1/me/admin/message-search"
tags: ["identity"]
---

# Admin Message Search

`GET /v1/me/admin/message-search`

Every recent thread that says `q`, across every workspace, one row each.

THE CONSOLE'S RAIL SEARCH. Typing `>` in the Stormy Logs session box turns
it from "filter these titles" into "find the thread where that was said" —
so this answers in about a second over threads a person could plausibly be
looking for, rather than exhaustively over the estate's whole history.
`runtime/message_search.py` holds the measurements that set that boundary
and why the turn half is scoped to recent sessions while the goal half is
not.

Authorisation is `list_customer_teams`' own local-operator gate, and the
team list it returns is the exact scope of the read — the same contract as
`/admin/activity` above, so this can never reach a workspace the caller
could not already list.

`team_name` rides on every hit because the console names each row by it and
has no other way to resolve a workspace it has not drawn yet.

## Query parameters

- `q` string, required — what was said
- `days` integer
- `limit` integer
- `sessions` integer

## Headers

- `authorization` string, nullable
- `x-darwin-token` string, nullable

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

## Changes

> 32 revisions in range; 1 not diffed.

- **2026-09-19** `eb3323cbeb64` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/stormy/apis/stormy-control-plane/changes/v1/me/admin/message-search/get.md)

---

[API](https://skmtc.dev/stormy/apis/stormy-control-plane.md) · [All operations](https://skmtc.dev/stormy/apis/stormy-control-plane/llms.txt) · [OpenAPI document](https://skmtc.dev/stormy/apis/stormy-control-plane/revisions/b09e3c4ee2af?raw)
