Compute charts
Computes up to 20 of the built-in charts over a time range: revenue, subscribers, trials, churn, audience, paywalls, acquisition, web, app, locations, push and data health.
Each result carries the caller's key, the absolute range it covered and a shape saying how to read it: series, table, funnel, cohorts, curves, histogram, heatmap, flow, stats, points, markers or options. Money is in integer minor units of currency, the organization's reporting currency. A chart reads only the filters and options that apply to it. A secret key reports its own environment; a person's own credentials choose with x-environment: production (the default), test or all.
Guide: Analytics overview
A project secret key: vh_sk_... for production, vh_sk_test_... for test. Keep it on your servers.
In: header
Path parameters
The project's id, proj_.... A secret key works only in the project it belongs to.
Request body
application/json
TypeScript definitions
Use the request body type in TypeScript.
The charts to compute, 1 to 20.
1 <= items <= 20Examples
curl -X POST "https://api.voidhash.com/api/v1/projects/proj_tz4a98xxat96iws9zmbrgj3a/analytics/reports/charts" \ -H "Authorization: Bearer vh_sk_..." \ -H "Content-Type: application/json" \ -d '{ "queries": [ { "chartId": "mrr_trend", "key": "mrr", "timeRange": { "preset": "custom", "start": "2026-01-01T00:00:00.000Z", "end": "2026-04-01T00:00:00.000Z" }, "granularity": "month" }, { "chartId": "paywall_funnel", "key": "onboarding-funnel", "timeRange": { "preset": "custom", "start": "2026-03-01T00:00:00.000Z", "end": "2026-04-01T00:00:00.000Z" }, "options": { "placementId": "pw_loc_m4x1c6v8b3n5q0w2e7h7d2k9" } } ] }'{ "results": [ { "key": "mrr", "chartId": "mrr_trend", "resolvedTimeRange": { "start": "2026-01-01T00:00:00.000Z", "end": "2026-04-01T00:00:00.000Z" }, "currency": "USD", "result": { "shape": "series", "unit": "money", "buckets": [ "2026-01-01T00:00:00.000Z", "2026-02-01T00:00:00.000Z", "2026-03-01T00:00:00.000Z" ], "series": [ { "key": "mrr", "label": null, "values": [ 1182400, 1241900, 1288350 ] } ] } }, { "key": "onboarding-funnel", "chartId": "paywall_funnel", "resolvedTimeRange": { "start": "2026-03-01T00:00:00.000Z", "end": "2026-04-01T00:00:00.000Z" }, "currency": null, "result": { "shape": "funnel", "steps": [ { "key": "viewed", "label": null, "count": 4210 }, { "key": "started", "label": null, "count": 512 }, { "key": "purchased", "label": null, "count": 301 } ] } } ]}{ "error": { "type": "invalid_request", "code": "invalid_report_request", "message": "At most 20 insight queries are allowed per batch" }}{ "error": { "type": "unauthenticated", "code": "invalid_api_key", "message": "This secret key is not valid." }}{ "error": { "type": "permission_denied", "code": "permission_denied", "message": "Insufficient permissions." }}{ "error": { "type": "not_found", "code": "project_not_found", "message": "There is no project proj_tz4a98xxat96iws9zmbrgj3a, or this credential cannot use it.", "param": "projectId" }}{ "error": { "type": "internal", "code": "internal_error", "message": "Something went wrong on our side. Try again, and contact support with the Request-Id header if it keeps failing." }}Response body
application/json
application/json
application/json
application/json
application/json
application/json
Errors
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request | invalid_report_request | With a message saying what to change. |
| 400 | invalid_request | invalid_time_range | With a message saying what to change. |
It can also fail with the errors every operation shares, such as unauthenticated; see Errors.
More in Analytics
- Compute insights
POST - Report acquisition
POST - Report acquisition cohorts
POST - Report tracking health
POST - List live users
POST
Something wrong or missing on this page? Tell us by email or on Discord.