Admin API
Analytics
Visitors, the buying funnel, sources and heatmaps.
- GETVisitors, the buying funnel, top pages and sources; optionally for one page or product
- GETWhere buyers tap, how far they scroll and where they rage tap, for one page
- GETPages with tap and scroll data, most viewed first
- GETRecent visits step by step: where buyers came from, what they saw and where they stopped
Visitors, the buying funnel, top pages and sources; optionally for one page or product
GET/admin/2026-11/analytics
Query parameters
periodenumOne of
today7d30d90dDefault "30d"
page_idID (pag_...)Only sessions that saw this payment page or product.
Response 200
availablebooleanrequiredFalse when the events store cannot be reached; numbers are then zero.
periodenumrequiredOne of
today7d30d90dtotalsobjectrequiredtotals.visitorsintegerrequiredtotals.sessionsintegerrequiredtotals.page_viewsintegerrequiredtotals.purchasesintegerrequiredtotals.revenueintegerrequiredPaise, from purchases seen on the store.
totals.conversion_rate_bpintegerrequiredSessions with a purchase per 10,000 sessions.
seriesarray of objectrequiredseries[].datestringrequiredseries[].visitorsintegerrequiredseries[].sessionsintegerrequiredseries[].purchasesintegerrequiredseries[].revenueintegerrequiredfunnelarray of objectrequiredfunnel[].stepenumrequiredOne of
visitedviewed_itemadd_to_cartcheckoutpaymentpurchasefunnel[].sessionsintegerrequiredpagesarray of objectrequiredpages[].pathstringrequiredpages[].page_typestringrequiredpages[].page_idstringrequiredpages[].viewsintegerrequiredpages[].visitorsintegerrequiredsourcesarray of objectrequiredsources[].sourcestringrequiredsources[].sessionsintegerrequiredsources[].purchasesintegerrequireddevicesarray of objectrequireddevices[].devicestringrequireddevices[].sessionsintegerrequiredprevious_funnelarray of objectrequiredThe same funnel for the period before, to compare.
previous_funnel[].stepenumrequiredOne of
visitedviewed_itemadd_to_cartcheckoutpaymentpurchaseprevious_funnel[].sessionsintegerrequiredfailuresarray of objectrequiredWhy payments failed, by cause code from the taxonomy.
failures[].causestringrequiredfailures[].sessionsintegerrequiredpathsarray of objectrequiredTop journeys: source, page types in order, then paid or left.
paths[].stepsarray of stringrequiredpaths[].sessionsintegerrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/analytics \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/analytics', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"available": false,
"period": "today",
"totals": {
"visitors": 1,
"sessions": 1,
"page_views": 1,
"purchases": 1,
"revenue": 49900,
"conversion_rate_bp": 1
},
"series": [
{
"date": "string",
"visitors": 1,
"sessions": 1,
"purchases": 1,
"revenue": 49900
}
],
"funnel": [
{
"step": "visited",
"sessions": 1
}
],
"pages": [
{
"path": "string",
"page_type": "string",
"page_id": "string",
"views": 1,
"visitors": 1
}
],
"sources": [
{
"source": "string",
"sessions": 1,
"purchases": 1
}
],
"devices": [
{
"device": "string",
"sessions": 1
}
],
"previous_funnel": [
{
"step": "visited",
"sessions": 1
}
],
"failures": [
{
"cause": "string",
"sessions": 1
}
],
"paths": [
{
"steps": [
"string"
],
"sessions": 1
}
]
}Where buyers tap, how far they scroll and where they rage tap, for one page
GET/admin/2026-11/analytics/heatmap
Query parameters
periodenumOne of
today7d30d90dDefault "7d"
deviceenumOne of
mobiledesktopDefault "mobile"
pathstringrequiredPage path, such as /p/masterclass
Response 200
availablebooleanrequiredpathstringrequireddeviceenumrequiredOne of
mobiledesktopviewsintegerrequireddoc_heightintegerrequiredTypical page height in CSS pixels on this device.
clicksarray of objectrequiredTaps grouped into cells; x and y are cell centres as shares of the page.
clicks[].xnumberrequiredclicks[].ynumberrequiredclicks[].nintegerrequiredclicks[].rageintegerrequiredscrollarray of objectrequiredShare of page views (basis points) that reached each depth, every 5 percent.
scroll[].depthintegerrequiredscroll[].share_bpintegerrequiredtargetsarray of objectrequiredtargets[].targetstringrequiredtargets[].tapsintegerrequiredtargets[].rageintegerrequiredsectionsarray of objectrequiredPage views in which each section was half on screen.
sections[].sectionstringrequiredsections[].viewsintegerrequiredform_startsintegerrequiredPage views where the buyer started the buy form.
sessionsintegerrequiredVisits that saw this page.
purchasesintegerrequiredOf those visits, the ones that paid.
exitsintegerrequiredVisits that left the store from this page without paying.
dead_tapsintegerrequiredTaps on things that are not buttons or links (often pictures or text).
median_depthintegerrequiredMedian deepest scroll, percent of the page.
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/analytics/heatmap \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/analytics/heatmap', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"available": false,
"path": "string",
"device": "mobile",
"views": 1,
"doc_height": 1,
"clicks": [
{
"x": 1,
"y": 1,
"n": 1,
"rage": 1
}
],
"scroll": [
{
"depth": 1,
"share_bp": 1
}
],
"targets": [
{
"target": "string",
"taps": 1,
"rage": 1
}
],
"sections": [
{
"section": "string",
"views": 1
}
],
"form_starts": 1,
"sessions": 1,
"purchases": 1,
"exits": 1,
"dead_taps": 1,
"median_depth": 1
}Pages with tap and scroll data, most viewed first
GET/admin/2026-11/analytics/heatmap/pages
Query parameters
periodenumOne of
today7d30d90dDefault "7d"
deviceenumOne of
mobiledesktopDefault "mobile"
Response 200
availablebooleanrequireddataarray of objectrequireddata[].pathstringrequireddata[].page_typestringrequireddata[].page_idstringrequireddata[].viewsintegerrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/analytics/heatmap/pages \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/analytics/heatmap/pages', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"available": false,
"data": [
{
"path": "string",
"page_type": "string",
"page_id": "string",
"views": 1
}
]
}Recent visits step by step: where buyers came from, what they saw and where they stopped
GET/admin/2026-11/analytics/journeys
Query parameters
periodenumOne of
today7d30d90dDefault "7d"
outcomeenumOne of
allpurchasedreached_checkoutadded_to_cartbrowsedDefault "all"
page_idID (pag_...)limitintegerDefault 30 ยท 1 to 100
Response 200
availablebooleanrequireddataarray of objectrequireddata[].session_idstringrequireddata[].started_atstringrequireddata[].sourcestringrequireddata[].devicestringrequireddata[].in_appstringrequireddata[].outcomeenumrequiredOne of
purchasedreached_checkoutadded_to_cartbrowseddata[].valueintegerrequireddata[].stepsarray of objectrequireddata[].steps[].atstringrequireddata[].steps[].typestringrequireddata[].steps[].pathstringrequireddata[].steps[].page_typestringrequired
Errors
| 400 | validation_failed | A field in the request is missing or invalid. See param. |
| 401 | authentication_required | Send a valid access token or session. |
| 403 | missing_scope | The app token does not have the scope this endpoint needs. |
| 429 | rate_limited | Too many requests. Wait for the time in RateLimit-Reset. |
| 500 | internal_error | Something went wrong on our side. Quote the trace_id to support. |
curl https://api.storelyne.com/admin/2026-11/analytics/journeys \
-H "Authorization: Bearer pat_live_..."const res = await fetch('https://api.storelyne.com/admin/2026-11/analytics/journeys', {
method: 'GET',
headers: {
'Authorization': `Bearer ${process.env.STORELYNE_TOKEN}`,
},
});
const data = await res.json();{
"available": false,
"data": [
{
"session_id": "string",
"started_at": "string",
"source": "string",
"device": "string",
"in_app": "string",
"outcome": "purchased",
"value": 1,
"steps": [
{
"at": "string",
"type": "string",
"path": "string",
"page_type": "string"
}
]
}
]
}