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:
trial_to_paid_d7 / trial_to_paid_d30 count a trial-conversion renewal or a later non-trial purchase of the same subscription product.
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. A callback_url must be an HTTPS URL whose host resolves only to public internet addresses; anything else (HTTP, a private, loopback or link-local address, an internal host name) is refused with 400. 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 POSTs this body to it when the export completes (a failed export sends no callback, so poll the status endpoint above). The target is checked again before the POST, redirects are not followed, and the callback is not retried:
download_url is a path, not a full URL: prefix it with the API host you called (for example https://api.appdna.ai) and send your x-api-key, as in step 3.

