Headstream

Reports and dashboards

Updated 2026-11-02

Reports

Open Reports in the dashboard, or run any report with one request:

curl -X POST https://headstream.app/api/v1/reports/run \
  -H "Authorization: Bearer hsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"siteId":"SITE_ID","spec":{"kind":"breakdown","dimension":"utm_campaign","days":30}}'

A spec has a kind. days is 1 to 365 and defaults to 30.

kindOther fieldsShows
summaryfiltersVisitors, pageviews, sessions, bounce rate
trendmetric, filtersVisitors or pageviews per day
breakdowndimension, limit, filtersTop values for a dimension
revenue_trendmodelRevenue per day
revenue_breakdowndimension, modelRevenue by channel, campaign, source or landing_path
revenue_changemodelWaterfall of what moved revenue, by channel
flowmetric, modelSankey flows
funnelstepsDrop-off across steps
mapfiltersVisitors by country
goalsGoals and conversion rates
self_reportedSelf-reported answers against tracking

model is first_touch, last_touch, linear or u_shaped, and defaults to linear.

Revenue reports need Stripe, which is in beta. Amounts are in minor currency units, so 1250 means $12.50.

Dimensions and filters

Dimensions are path, referrer_host, utm_source, utm_campaign, country, city, device and browser. For breakdown, limit is 1 to 25.

filters narrows a report. For example, { "country": "US" }.

Funnels

{ "kind": "funnel", "days": 30, "steps": ["/pricing", "/signup", "signup"] }

A funnel has 2 to 6 steps. A step is an exact path, a path ending in *, or a custom event name. A visitor counts when they complete the steps in order within seven days. Each step returns visitors, shareOfFirst and shareOfPrevious.

Flows

flow with metric set to sessions shows channel, then landing page, then next step. With metric set to revenue, it shows channel, then landing page, then revenue.

Dashboards

A dashboard holds saved reports, and each one reruns on live data when opened. Create one:

curl -X POST https://headstream.app/api/v1/dashboards \
  -H "Authorization: Bearer hsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"siteId":"SITE_ID","name":"Weekly"}'

Then add a report, with {id} set to the new dashboard's ID:

curl -X POST https://headstream.app/api/v1/dashboards/{id}/reports \
  -H "Authorization: Bearer hsk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"siteId":"SITE_ID","title":"Top campaigns","spec":{"kind":"breakdown","dimension":"utm_campaign"}}'

The AI assistant

The sidebar assistant, built on Claude, answers from live reports and can build dashboards for you.

Check a number

Every core metric has a Why this number page, with the definition and raw rows. See the API docs and trust.

See which marketing makes money.

Get started free