Skip to main content

Reporting API

Read-only access to a tenant's data for dashboards, spreadsheets and BI tools, with the same list parameters as CrudApi. Use a secret key: a test key reads test data, a live key live data.

GET /api/v1/reporting lists the datasets and their columns: payments, attempts, refunds, disputes, links and events (the payment journey). Secrets, IP addresses, user agents and gateway forms aren't in them.

GET /api/v1/reporting/{dataset} takes:

ParameterExample
filterpayments.status eq 'succeeded' and payments.amount ge 100000eq ne gt ge lt le, and, or, not, parentheses, contains(…,'x'), startswith, endswith (case-insensitive). Qualify every column as dataset.column. Text is single-quoted ('' for a quote), numbers and true/false are bare, eq null / ne null test for empty.
orderBycreated_at:desc,amount:asc
displayid,amount,statusOnly these columns.
limit, offsetlimit=500Up to 1000 rows a page; has_more says whether there's another.
groupBystatusOne row per value with count and, where the dataset has one, the sum of amount.
counttrueAdds the total number of matching rows.
curl -G https://pay.example.com/api/v1/reporting/payments -H "Authorization: Bearer sk_live_…" \
--data-urlencode "filter=payments.created_at ge '2026-10-01' and payments.status eq 'succeeded'" \
--data-urlencode "groupBy=connector"

Times are ISO 8601 text in UTC, so ge '2026-10-01' works. A mistake answers 400 invalid_query with what to fix.

For every table rather than these datasets, connect CrudApi.