Skip to navigation

Summarize signals over time

Counts signals into period buckets. Use it to chart signal volume over time, split by signal name or by a signal-payload key such as team_id.

Signals count against their effective timestamp in UTC. This is the same basis billing uses, so these figures reconcile with an invoice.

The endpoint reads a pre-aggregated hourly rollup, not the raw signals. An hour is therefore the finest interval. One request may span at most 250 periods.

A grouped request keeps the 100 groups with the most signals. It sums the rest under the key “other”. Each period total stays complete, but a group inside “other” loses its own figure. Read groups.truncated to learn how many groups lost it. Zero means every group kept its own figure.

Results are paged with limit and cursor. A page is never truncated in silence.

For a wide per-customer spreadsheet over arbitrary payload fields, use the batch export at /signals/summary/batch instead.

Authentication

AuthorizationBearer
API Key authentication using Bearer token

Query parameters

startDatestringRequired

Window start, inclusive. Accepts an ISO 8601 date or date-time. Date-only values (e.g. 2026-06-30) are treated as UTC; date-times without an explicit timezone offset are ambiguous, so include one (e.g. 2026-06-30T00:00:00-05:00) when precision matters.

endDatestringRequired

Window end, inclusive — a date-only value means through the end of that UTC day. Accepts an ISO 8601 date or date-time. Date-only values (e.g. 2026-06-30) are treated as UTC; date-times without an explicit timezone offset are ambiguous, so include one (e.g. 2026-06-30T00:00:00-05:00) when precision matters.

intervalenumRequired

Period size. Buckets align to UTC hours, calendar days, ISO weeks that start on Monday, or calendar months. An hour is the finest period available.

The first and last bucket report bounds clipped to your window.

A request may span at most 250 periods. That is about 10 days at hour, 8 months at day, and 20 years at month. A longer window returns 400 WINDOW_TOO_LARGE.

Allowed values:
customerIdstringOptional>=1 character
Narrow the summary to one customer. Accepts a Paid customer ID or, as a fallback, your external customer ID. Mutually exclusive with externalCustomerId. Omit both to summarize every customer.
externalCustomerIdstringOptional>=1 character
Your external customer ID. Mutually exclusive with customerId.
signalNameslist of stringsOptional
Narrow the summary to these signal names. Repeat the parameter for more than one. Omit to count every signal.
groupByenumOptional

Split each period into one series per group. signalName groups by the signal's name. dimension groups by a signal-payload key named in dimensionKey — signals per team, for example. Omit for one total per period.

A grouped request keeps the 100 groups with the most signals. It sums the rest under the key "other".

Each period total stays complete, but a group inside "other" loses its own figure. Read groups.truncated to learn how many groups lost it. To name every group, narrow the request with signalNames, customerId, or a shorter window.

Allowed values:
dimensionKeystringOptional1-64 characters

The signal-payload key to group by. Required when groupBy is dimension; rejected otherwise. The key must be one your organization has declared for grouping — an undeclared key is refused rather than answered by a full scan. A signal whose payload lacks the key, or holds it empty, groups under an empty groupKey.

formatenumOptionalDefaults to json

json returns the series as a JSON body. csv returns the same points as a text/csv table with a single header row.

A CSV cannot carry a cursor, so it is returned whole or refused. A result that does not fit one page returns 400 rather than a file that is quietly missing rows. Use json to page, or raise limit.

Group truncation never refuses a CSV. The "other" row is in the file, so nothing is hidden.

Allowed values:
limitintegerOptional1-5000Defaults to 1000

Maximum points to return in this page. The response is never silently truncated: when more points exist, hasMore is true and nextCursor is set.

cursorstringOptional>=1 character
Continue from a previous response's nextCursor. Every other parameter must be unchanged.

Response

200
intervalenum
Period bucket size, echoed from the query.
Allowed values:
datalist of objects

Points ordered by period, then by group key. Only periods and groups that recorded signals appear — a period with no signals is absent rather than zero, so a chart fills its own gaps.

paginationobject
groupByenumOptional
How the points are grouped. Absent when not grouped.
Allowed values:
dimensionKeystringOptional

The signal-payload key the points are grouped by, echoed from the query. Present only when groupBy is dimension.

groupsobjectOptional
How many groups kept their own series, and how many were summed under "other". Present only when groupBy is set.

Errors

400
Bad Request Error
403
Forbidden Error
404
Not Found Error
408
Request Timeout Error
429
Too Many Requests Error
500
Internal Server Error