Skip to main content
POST /api/sites/{id}/query runs a read-only SQL query against your site’s analytics data and returns rows with typed column metadata — the programmatic form of the SQL query builder. You write a SELECT against virtual tables that are already scoped to your site.
string
required
A single read-only SELECT (or WITH … SELECT) against the site-scoped virtual tables.

The scoped tables

All three are automatically filtered to the site in the URL — you never write a site_id filter, and a query cannot reach another site’s data. scoped_stripe_revenue is append-only. Deduplicate Stripe webhook replays by stripe_event_id before aggregating:
See query Stripe revenue for the table schema and currency caveats.

Response

array
The result rows, each an object keyed by the column names you selected.
array
One entry per selected column, in order.
object
Metadata about the result set.
columns preserves order and gives each column’s type, so you can render results without inferring shapes.

Limits

The query runs read-only, so it can never modify your data:
  • A single SELECT (or WITH … SELECT) reading the scoped tables and your own CTEs — writes, schema changes, multiple statements, and reads outside the scoped tables are rejected.
  • A query runs for at most 10 seconds and returns at most 1,000 rows.
A SQL error comes back as a 400 with the database’s message so you can fix the query.

Frequently asked questions

No. All three scoped tables are automatically filtered to the site in the URL of POST /api/sites/{id}/query. You never write a site_id filter, and a query cannot reach another site’s data.
At most 1,000 rows, and the query runs for at most 10 seconds. Both limits apply to every call to POST /api/sites/{id}/query.
The endpoint returns a 400 with the database’s own error message, so you can fix the query. Writes, schema changes, multiple statements, and reads outside the scoped tables are rejected the same way — the query runs read-only and can never modify your data.

SQL query builder

The same capability, in the dashboard.

Analytics read API

Fixed reports when you don’t need raw SQL.

Custom dashboards

Turn a query into a saved chart.

Metric definitions

The events and columns you can query.