Analytics
Totals over time.
| Endpoint | What it does |
|---|---|
GET /v1/analytics/summary |
Retrieve an analytics summary |
GET /v1/analytics/time-series |
Retrieve an analytics time series |
Try any of them in the API tester.
Retrieve an analytics summary
Section titled “Retrieve an analytics summary”GET /v1/analytics/summary
Totals over a day window, broken down by currency, flow, channel and outcome.
Days are UTC. Ghana is UTC+0 year round, so a UTC day is also a local day.
Figures are NEVER summed across currencies: every row carries its own currency, and a total over two of them is a number with no meaning. Each transaction is counted exactly once, under its terminal outcome, so the counts across outcomes partition your terminal volume rather than overlapping.
A window is always applied: omitting one defaults to the last 30 days, and a window wider than 185 days is refused rather than silently truncated. The applied window is echoed back.
freshness is when this rollup was last written. These numbers come from a projection of the event stream, not from the transaction table, so a stalled projection would otherwise look like a quiet week.
Authentication: a secret key (server-side only) with the scope transaction.read.
Parameters
Section titled “Parameters”| Field | Type | Required | Allowed values and limits | What it is |
|---|---|---|---|---|
from |
string | no | First UTC day to include, as YYYY-MM-DD, inclusive. Defaults to 29 days before to. | |
to |
string | no | Last UTC day to include, as YYYY-MM-DD, inclusive. Defaults to today in UTC. | |
currency |
string | no | Restrict to one ISO 4217 code, for example GHS. Figures are never summed across currencies whether this is set or not. | |
flow |
string | no | One of: collection, payout, refund |
Restrict to one flow. A refund is its own flow, not a payout, even though the underlying row is stored as one. |
channel |
string | no | Restrict to one rail. unknown selects the rows whose terminal event did not carry a rail — currently every payout and refund. |
Response 200
Section titled “Response 200”| Field | Type | What it is |
|---|---|---|
data |
array | |
freshness |
object | |
freshness.buckets |
integer | How many rollup buckets exist for this merchant, across all time. Zero means the projection has never written for you. |
freshness.last_updated_at |
string (date-time) | When this merchant’s rollup was last written, in UTC. Absent if it never has been. |
object |
string | |
window |
object | |
window.days |
integer | Inclusive day count. |
window.from |
string | First UTC day included. |
window.to |
string | Last UTC day included. |
Errors
Section titled “Errors”401: the key is missing, wrong or revoked403: the key lacks the scope, or your account may not do this422: a field is invalid;errorsnames it429: too many requests; wait forRetry-After500: Internal Server Error503: the payment partner is unreachable; safe to retry
Every error is a JSON problem with a stable code. See Errors.
Retrieve an analytics time series
Section titled “Retrieve an analytics time series”GET /v1/analytics/time-series
The same figures per UTC day, ascending.
channel is a filter here rather than a dimension: a series crossed by day, currency, flow, outcome and rail at once is a payload a chart cannot use. Ask for one rail if you want a per-rail series.
A day with no activity is an ABSENT point, not a zero one, so that no traffic stays distinguishable from a projection that wrote nothing. Use freshness to tell those apart, and draw the continuous axis client-side.
Authentication: a secret key (server-side only) with the scope transaction.read.
Parameters
Section titled “Parameters”| Field | Type | Required | Allowed values and limits | What it is |
|---|---|---|---|---|
from |
string | no | First UTC day to include, as YYYY-MM-DD, inclusive. Defaults to 29 days before to. | |
to |
string | no | Last UTC day to include, as YYYY-MM-DD, inclusive. Defaults to today in UTC. | |
currency |
string | no | Restrict to one ISO 4217 code, for example GHS. | |
flow |
string | no | One of: collection, payout, refund |
Restrict to one flow. |
channel |
string | no | Restrict to one rail. |
Response 200
Section titled “Response 200”| Field | Type | What it is |
|---|---|---|
data |
array | Ascending by day. A day with no activity is absent rather than zero. |
freshness |
object | |
freshness.buckets |
integer | How many rollup buckets exist for this merchant, across all time. Zero means the projection has never written for you. |
freshness.last_updated_at |
string (date-time) | When this merchant’s rollup was last written, in UTC. Absent if it never has been. |
object |
string | |
window |
object | |
window.days |
integer | Inclusive day count. |
window.from |
string | First UTC day included. |
window.to |
string | Last UTC day included. |
Errors
Section titled “Errors”401: the key is missing, wrong or revoked403: the key lacks the scope, or your account may not do this422: a field is invalid;errorsnames it429: too many requests; wait forRetry-After500: Internal Server Error503: the payment partner is unreachable; safe to retry
Every error is a JSON problem with a stable code. See Errors.

