Reporting endpoints
The read-only Omnipresence reporting API: the two routes, the eight resources they expose, every shared parameter, and how paging works.
Updated October 20, 2026
Read-only, versioned, and backed by the same read layer as the dashboard. Two routes cover it.
List your projects
GET /api/v1/projects
Authorization: Bearer omni_sk_...httpEvery project the key's account owns, with the ids the next route needs.
Read one resource
GET /api/v1/projects/:id/:resourcehttpWhere :resource is one of:
| Resource | What comes back |
|---|---|
overview | The rates, share of voice and counts behind the overview screen |
prompts | Tracked prompts, windowed |
ai-searches | Fan-out searches |
sources | Sources, with ownership and citation state |
citations | One row per cited or retrieved source per run |
runs | One row per probe |
opportunities | The deduped source opportunity list |
timeseries | A daily series for one metric |
Shared parameters
| Parameter | Values |
|---|---|
from, to | YYYY-MM-DD. Omitted, a default window applies. |
mode | grounded, training or all. Default all. |
limit | 1 to 200. Default 50. |
cursor | The opaque cursor from a previous response, for runs and citations. |
search | Case-insensitive substring match. |
kind | tracked, research or all. |
external_id | Your own prompt id, for joining to a study. |
The timeseries metrics
timeseries needs a metric, one of:
mention_rateshare_of_voicefanout_presence
An unknown metric returns a 400 that names the valid ones, so you do not have to guess from a response shape.
Response shape
JSON, with the payload under data. Figures are numbers rather than formatted strings, dates are ISO 8601, and money is in cents. A list carries the total and tells you whether it was truncated, so you can tell a short page from the end of the data.
Paging
Ask for the window you want, take the page size you want up to 200, and follow the cursor. Never page by incrementing an offset: runs and citations page on a keyset so a run is never split across two pages and nothing is skipped when new data lands mid-read.
A worked example
The grounded Visibility Score for last month, and the prompts behind it:
GET /api/v1/projects/PROJECT_ID/overview?from=2026-09-01&to=2026-09-30&mode=grounded
GET /api/v1/projects/PROJECT_ID/prompts?from=2026-09-01&to=2026-09-30&limit=200httpFor a one-off pull rather than something recurring, the CSV or XLSX export from the Runs screen is less work and carries the same records.
Questions about reporting endpoints
- Will the numbers match the dashboard?
- Yes. The API is backed by the same read layer as the console and the MCP, so a figure pulled here is the figure on screen.
- Can I write through the API?
- No. Every write lives on the MCP connection, which keeps the audit trail in one place.
- Why does a list stop at 200?
- That is the maximum page size. Follow the cursor the response gives you rather than raising the limit.