VoidhashDocs
DevelopersHelp centerGuidesAPI reference
Dashboard
Essentials
API overview
Authentication
Event capture
Push device API
Webhooks
Webhook delivery
Webhook events
Projects & keys
Projects
API keys
Audit log
Customers & access
Persons
Products
Perks
Sandbox
Paywalls
Paywalls
Paywall locations
Components
Component registry
Assets
Experiments & flags
Experiments
Feature flags
Analytics & events
Analytics
Analytics alerts
Cohorts
Group types
Groups
Events
Ingest policy
VoidQL
Tracking domains
Ads
Ads
Ad accounts
Meta measurement
Payments & stores
Payment providers
Payment provider products
Purchase history imports
Payment sources
Webhooks & notifications
Webhooks
Push notifications
Push configurations
Automations
Organization & team
Organizations
Members
Invitations
Billing
Your account
Profile
Session
Notices
Connected apps
Terms of Service
Developer tools
Schema
SDK
Compute insights
Compute charts
Measure metrics
List the people behind a metric
Report acquisition
Report acquisition cohorts
Report tracking health
List live users

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

POST
/api/v1/projects/{projectId}/analytics/reports/charts

Authorization

AuthorizationBearer <token>

A project secret key: vh_sk_... for production, vh_sk_test_... for test. Keep it on your servers.

In: header

Path parameters

projectId*string

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.

queries*array<>

The charts to compute, 1 to 20.

Items1 <= items <= 20

Examples

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

StatustypecodeWhen
400invalid_requestinvalid_report_requestWith a message saying what to change.
400invalid_requestinvalid_time_rangeWith 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
  • Measure metrics POST
  • List the people behind a metric 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.

PreviousCompute insightsNextMeasure metrics

On this page

AuthorizationPath parametersRequest bodyExamplesResponse bodyErrorsMore in Analytics