Overview
Two families of endpoints are available:- Dashboard analytics (
/api/v1/analytics/*) — the aggregated KPI, timeseries, funnel, retention, and activity data that backs the console dashboard. These use Customer JWT authentication (Authorization: Bearer <token>) and are scoped to the authenticated user’stenant_idandapp_id. They power the console UI, so response shapes track the dashboard. - Event export (
/api/v1/sdk/events/export*) — raw SDK event access for your own pipelines. These authenticate with an API key that has theexport_datapermission (x-api-keyheader), the stable programmatic surface.
All endpoints are scoped to a single
tenant_id + app_id. There is no way to query across tenants or applications.Dashboard Analytics
Analytics data has a processing delay of up to ~5 minutes from event ingestion.
KPI Dashboard
Response:
metric is one of the supported metric identifiers (see Metric identifiers). trend is up, down, or flat.
KPI Timeseries
Response:
compare is set, each metric object also carries a compare_data array (same shape as data) and a compare_label. When segment is not overall, each point additionally carries a breakdown_value.
Funnel Analysis
Response:
Retention Cohorts
Response:
retention values are the percentage of the cohort still active on day N.
Activity Feed
Metric identifiers
kpis and kpis/timeseries accept these metric identifiers:
Event Export
Export raw SDK events for your own warehouse or analysis. All export endpoints authenticate with an API key that has theexport_data permission, sent in the x-api-key header. Grant the permission when you create the key in the dashboard.
Export request dates use full ISO 8601 timestamps (e.g.
2026-02-01T00:00:00Z), not date-only strings.Paginated export (synchronous)
Response:
limit + offset until meta.hasMore is false.
Direct download
format parameter (json — default — or csv).
Async bulk export
For large windows, start an asynchronous export and be notified when it is ready. 1. Start the exportevent_names and callback_url are optional. The response is 202 Accepted with the export record:
status becomes completed, download_url and the summary fields below are populated.
Export record fields:
3. Download the export
Once
status is completed, fetch the file from the download_url:
Content-Disposition: attachment; filename="export-{id}.json"). Returns 409 if the export is not yet completed or has passed its expires_at, and 404 for an unknown id. Uses the same x-api-key + export_data auth.
4. Optional callback
If you supplied a callback_url, AppDNA sends a POST to it when the export completes or fails:

