Skip to main content

GET /v1/analytics

GET /v1/analytics

ScopeIdempotency-KeyOperation 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.

ParameterInRequiredDescription
fromqueryNo
toqueryNo
daysqueryNoDays ending today (or at to); not with from

Responses​

200​

The report.

FieldTypeRequiredDescription
fromstring, dateYes
tostring, dateYes
volumeobjectYes
volume.requestsintegerYesCustomer requests started
volume.createdintegerYes
volume.completedintegerYes
volume.failedintegerYes
volume.cancelledintegerYes
volume.reassignedintegerYes
volume.relayedintegerYes
dailyarray of objectYes
daily[].daystring, dateYes
daily[].requestedintegerYes
daily[].completedintegerYes
funnelobjectYes
funnel.startedintegerYes
funnel.recipient_confirmedintegerYes
funnel.quotedintegerYes
funnel.dispatchedintegerYes
funnel.abandonedobjectYes
funnel.abandoned.at_recipientintegerYes
funnel.abandoned.at_quoteintegerYes
funnel.abandoned.at_dispatchintegerYes
funnel.recipient_confirmation_ratestring or nullYesA ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$.
funnel.quote_conversion_ratestring or nullYesA ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$.
funnel.dispatch_ratestring or nullYesA ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$.
timeobjectYes
time.assignmentobjectYes
time.assignment.measuredintegerYes
time.assignment.p50_secondsinteger or nullYes
time.assignment.p90_secondsinteger or nullYes
time.pickupobjectYes
time.pickup.measuredintegerYes
time.pickup.p50_secondsinteger or nullYes
time.pickup.p90_secondsinteger or nullYes
time.handoverobjectYes
time.handover.measuredintegerYes
time.handover.p50_secondsinteger or nullYes
time.handover.p90_secondsinteger or nullYes
time.deliveryobjectYes
time.delivery.measuredintegerYes
time.delivery.p50_secondsinteger or nullYes
time.delivery.p90_secondsinteger or nullYes
time.totalobjectYes
time.total.measuredintegerYes
time.total.p50_secondsinteger or nullYes
time.total.p90_secondsinteger or nullYes
time.relay_handoffobjectYes
time.relay_handoff.measuredintegerYes
time.relay_handoff.p50_secondsinteger or nullYes
time.relay_handoff.p90_secondsinteger or nullYes
time.eta_accuracyobjectYes
time.eta_accuracy.measuredintegerYes
time.eta_accuracy.withinintegerYes
time.eta_accuracy.ratestring or nullYesA ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$.
commercialobjectYes
commercial.revenuearray of objectYes
commercial.revenue[].currencystringYesOne of: GHS.
commercial.revenue[].deliveriesintegerYes
commercial.revenue[].totalstringYesExact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$.
commercial.revenue[].fee_minstringYesExact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$.
commercial.revenue[].fee_medianstringYesExact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$.
commercial.revenue[].fee_p90stringYesExact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$.
commercial.revenue[].fee_maxstringYesExact decimal with two places; never a JSON number. Pattern ^-?[0-9]+\.[0-9]{2}$.
commercial.revenue[].distance_km_medianstringYesVerified road distance in km, two places. Pattern ^[0-9]+\.[0-9]{2}$.
commercial.revenue[].distance_km_p90stringYesVerified road distance in km, two places. Pattern ^[0-9]+\.[0-9]{2}$.
commercial.revenue[].distance_km_maxstringYesVerified road distance in km, two places. Pattern ^[0-9]+\.[0-9]{2}$.
geographyobjectYes
geography.demandarray of objectYes
geography.demand[].gatewaystringYes
geography.demand[].zonestringYes
geography.demand[].deliveriesintegerYes
geography.classificationsarray of objectYes
geography.classifications[].classificationstringYesOne of: INTRA_ZONE, INTER_ZONE, INTER_GATEWAY.
geography.classifications[].deliveriesintegerYes
geography.hoursarray of objectYes
geography.hours[].hourintegerYesHour of the day, UTC (Ghana local time) 0–23.
geography.hours[].deliveriesintegerYes
bulkobjectYes
bulk.bulk_deliveriesintegerYes
bulk.childrenintegerYesRecipients, removed ones excluded
bulk.deliveredintegerYes
bulk.finishedintegerYes
bulk.recipients_per_bulkstring or nullYesPattern ^[0-9]+\.[0-9]{2}$.
bulk.completion_ratestring or nullYesA ratio to four places; null with nothing to measure. Pattern ^[0-9]+\.[0-9]{4}$.
bulk.currencystring or nullYes
bulk.revenuestringYesExact 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.