Get query fan-out

GET
/brands/{brandId}/query-fanout

The searches engines ran while answering this brand's prompts. Engines that don't expose their searches still contribute runs, so coverageRate is the honest denominator.

Authorization

BearerAuth
headerAuthorizationBearer <token>

An organization key (signal_…) created under Organization Settings → API Keys.

Path Parameters

brandId*string

Brand identifier.

Query Parameters

start*string

Inclusive lower bound of the window, an ISO 8601 timestamp such as 2026-01-01T00:00:00Z. Aligned down to the quarter hour, the grain analytics are aggregated at; where a response repeats the window, it repeats the aligned one. A bare YYYY-MM-DD is rejected: that is /prompts/{promptId}/snapshot's spelling and means a local calendar day there.

Formatdate-time
end*string

Exclusive upper bound of the window, an ISO 8601 timestamp, also aligned down to the quarter hour. The window is half-open: a run at exactly end is outside it. start and end inside one quarter-hour bucket leave an empty window and are rejected.

Formatdate-time
model?string

Restrict to one model, e.g. chatgpt. See GET /models.

tags?string

Comma-separated prompt tags. Only prompts carrying at least one of them are counted.

page?integer

Page number, 1-based.

Range1 <= value
Default1
limit?integer

Items per page. Values above the maximum are clamped, not rejected. The default is large enough that most windows fit on the first page.

Range1 <= value <= 1000
Default1000
q?string

Case-insensitive substring match on the search, across every search run in the window.

Response Body

Get query fan-out

application/json
  1. response
brandId*string
range*

The window the response was computed over, echoed back as the half-open instants it resolved to.

totalQueries*integer
uniqueQueries*integer
fanoutRuns*integer

Runs that searched at all. Engines that don't expose their searches contribute runs but no queries.

totalRuns*integer
avgQueriesPerRun*number
coverageRate*number

Share of fan-out query instances whose answer mentioned the brand. Ratio 0–1; multiply by 100 for a percentage.

Range0 <= value <= 1
data*array<>

This page of the distinct sub-queries over the window, ordered by the runs that ran them. The totals cover every query.

pagination*
Example Request
curl -X GET 'https://app.signal.metricshive.com/api/v1/brands/string/query-fanout?start=2019-08-24T14%3A15%3A22Z&end=2019-08-24T14%3A15%3A22Z'
Example Response
{
  "brandId": "string",
  "range": {
    "start": "2019-08-24T14:15:22Z",
    "end": "2019-08-24T14:15:22Z"
  },
  "totalQueries": 0,
  "uniqueQueries": 0,
  "fanoutRuns": 0,
  "totalRuns": 0,
  "avgQueriesPerRun": 0,
  "coverageRate": 0,
  "data": [
    {
      "query": "string",
      "runs": 0,
      "promptCount": 0
    }
  ],
  "pagination": {
    "page": 0,
    "limit": 0,
    "total": 0,
    "totalPages": 0
  }
}