GET /v1/analytics
GET /v1/analytics
| Scope | Idempotency-Key | Operation ID |
|---|---|---|
delivery.read | — | tenantAnalytics |
Delivery analytics for the calling tenant.
The credential's own deliveries only: volume, the customer request funnel, times,
spend, geographic demand and Bulk Delivery, read from committed facts and rows.
The window is whole UTC days, from and to inclusive (default the last 30 days to today,
at most 92). A figure with nothing to measure is null. Supply ranking, pricing
internals and platform fees are not part of a tenant's analytics (P7).
Request
Signed with your API credential: see Authentication.
| Parameter | In | Required | Description |
|---|---|---|---|
from | query | No | |
to | query | No | |
days | query | No | Days ending today (or at to); not with from |
Responses
200
The report.
| Field | Type | Required | Description |
|---|---|---|---|
from | string, date | Yes | |
to | string, date | Yes | |
volume | object | Yes | |
volume.requests | integer | Yes | Customer requests started |
volume.created | integer | Yes | |
volume.completed | integer | Yes | |
volume.failed | integer | Yes | |
volume.cancelled | integer | Yes | |
volume.reassigned | integer | Yes | |
volume.relayed | integer | Yes | |
daily | array of object | Yes | |
daily[].day | string, date | Yes | |
daily[].requested | integer | Yes | |
daily[].completed | integer | Yes | |
funnel | object | Yes | |
funnel.started | integer | Yes | |
funnel.recipient_confirmed | integer | Yes | |
funnel.quoted | integer | Yes | |
funnel.dispatched | integer | Yes | |
funnel.abandoned | object | Yes | |
funnel.abandoned.at_recipient | integer | Yes | |
funnel.abandoned.at_quote | integer | Yes | |
funnel.abandoned.at_dispatch | integer | Yes | |
funnel.recipient_confirmation_rate | string or null | Yes | A ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$. |
funnel.quote_conversion_rate | string or null | Yes | A ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$. |
funnel.dispatch_rate | string or null | Yes | A ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$. |
time | object | Yes | |
time.assignment | object | Yes | |
time.assignment.measured | integer | Yes | |
time.assignment.p50_seconds | integer or null | Yes | |
time.assignment.p90_seconds | integer or null | Yes | |
time.pickup | object | Yes | |
time.pickup.measured | integer | Yes | |
time.pickup.p50_seconds | integer or null | Yes | |
time.pickup.p90_seconds | integer or null | Yes | |
time.handover | object | Yes | |
time.handover.measured | integer | Yes | |
time.handover.p50_seconds | integer or null | Yes | |
time.handover.p90_seconds | integer or null | Yes | |
time.delivery | object | Yes | |
time.delivery.measured | integer | Yes | |
time.delivery.p50_seconds | integer or null | Yes | |
time.delivery.p90_seconds | integer or null | Yes | |
time.total | object | Yes | |
time.total.measured | integer | Yes | |
time.total.p50_seconds | integer or null | Yes | |
time.total.p90_seconds | integer or null | Yes | |
time.relay_handoff | object | Yes | |
time.relay_handoff.measured | integer | Yes | |
time.relay_handoff.p50_seconds | integer or null | Yes | |
time.relay_handoff.p90_seconds | integer or null | Yes | |
time.eta_accuracy | object | Yes | |
time.eta_accuracy.measured | integer | Yes | |
time.eta_accuracy.within | integer | Yes | |
time.eta_accuracy.rate | string or null | Yes | A ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$. |
commercial | object | Yes | |
commercial.revenue | array of object | Yes | |
commercial.revenue[].currency | string | Yes | One of: GHS. |
commercial.revenue[].deliveries | integer | Yes | |
commercial.revenue[].total | string | Yes | Exact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$. |
commercial.revenue[].fee_min | string | Yes | Exact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$. |
commercial.revenue[].fee_median | string | Yes | Exact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$. |
commercial.revenue[].fee_p90 | string | Yes | Exact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$. |
commercial.revenue[].fee_max | string | Yes | Exact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$. |
commercial.revenue[].distance_km_median | string | Yes | Verified road distance in km, two places. Pattern ^[0-9]+\.[0-9]{2}$. |
commercial.revenue[].distance_km_p90 | string | Yes | Verified road distance in km, two places. Pattern ^[0-9]+\.[0-9]{2}$. |
commercial.revenue[].distance_km_max | string | Yes | Verified road distance in km, two places. Pattern ^[0-9]+\.[0-9]{2}$. |
geography | object | Yes | |
geography.demand | array of object | Yes | |
geography.demand[].gateway | string | Yes | |
geography.demand[].zone | string | Yes | |
geography.demand[].deliveries | integer | Yes | |
geography.classifications | array of object | Yes | |
geography.classifications[].classification | string | Yes | One of: INTRA_ZONE, INTER_ZONE, INTER_GATEWAY. |
geography.classifications[].deliveries | integer | Yes | |
geography.hours | array of object | Yes | |
geography.hours[].hour | integer | Yes | Hour of the day, UTC (Ghana local time) 0–23. |
geography.hours[].deliveries | integer | Yes | |
bulk | object | Yes | |
bulk.bulk_deliveries | integer | Yes | |
bulk.children | integer | Yes | Recipients, removed ones excluded |
bulk.delivered | integer | Yes | |
bulk.finished | integer | Yes | |
bulk.recipients_per_bulk | string or null | Yes | Pattern ^[0-9]+\.[0-9]{2}$. |
bulk.completion_rate | string or null | Yes | A ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$. |
bulk.currency | string or null | Yes | |
bulk.revenue | string | Yes | Exact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$. |
400
Structural validation failed or an Idempotency-Key is missing.
The error envelope: code, message, detail, request_id.
401
Unknown, revoked or wrong-environment credential, bad signature, or expired session.
The error envelope: code, message, detail, request_id.
403
Tenant access denied (existence is not disclosed), insufficient scope, MFA/step-up required, partner blocked or module disabled.
The error envelope: code, message, detail, request_id.
429
Rate limit reached; honour Retry-After.
The error envelope: code, message, detail, request_id.
500
Unexpected failure. Only code and request_id are returned.
The error envelope: code, message, detail, request_id.