List the pages visits ended on
/v1/results/analytics/exit-pagesLists exit pages: the last tracked page of each visit, and how many visits ended on each. It is the Exit pages table in Analytics, and takes the Analytics arguments and the table arguments.
Not every exit is bad. A visit that ends on a contact page or a confirmation page may have done what it came for. exitRate says how often a page is where people stop: of every view of the page, the share that was the last of its visit.
pageViews here counts visits that ended on the page, not every view of it; Get pages counts those, and so does pageViewsOfPage when you ask for it. The scroll figures and duration are the page's own, across all its views. On this query, filters[url] matches the exit page.
Rows are sorted by pageViews, busiest first, and can be sorted only by url or pageViews: exitRate cannot be sorted by. pageViewsOfPage and bounceRate are added only when columns names them. When you send columns, also send a sort naming one of them, unless pageViews is among them: without it, this query answers with an error.
curl "https://api.eu.silktide.com/v1/results/analytics/exit-pages?view=all&period=last-30-days&rowsPerPage=2" \
-H "Authorization: silktide token=$SILKTIDE_API_KEY"{
"result": {
"page": 1,
"minPage": 1,
"maxPage": 7,
"numRows": 14,
"rowsPerPage": 2,
"rows": [
{
"url": "https://fakewinebarrel.com/contact-us/",
"pageViews": 265,
"exitRate": 74,
"averageScroll": 65.17,
"reach25": 100,
"reach50": 79.2,
"reach75": 31.4,
"reach100": 0,
"duration": 32.92,
"pageTitle": "Contact Us | The Wine Barrel",
"pageName": "Contact Us"
},
{
"url": "https://fakewinebarrel.com/",
"pageViews": 118,
"exitRate": 19,
"averageScroll": 86.83,
"reach25": 100,
"reach50": 100,
"reach75": 92.8,
"reach100": 3.7,
"duration": 22.46,
"pageTitle": "The Wine Barrel | Fine wines, delivered",
"pageName": "Fine wines, delivered"
}
]
},
"selector": "/v1/results/analytics/exit-pages",
"duration": 0.08
}Request
Query parameters
viewstringmatches^(all|[1-9]\d*)$The analytics view to read: its id, the number after
/analytics/in its address in Silktide, orallfor all of the account's analytics. Send this orwebsiteId.websiteIdintegerat least 1Instead of
view, a website whose analytics to read. The website must have Analytics set up.sectionIdintegerWith
websiteId, a section of the website. Defaults to0, the whole website.periodstringThe date range. Defaults to
all. The spaced forms (-7 days,month to date) are older names that keep working.customneedsfromandto.One of
alltodaylast-7-dayslast-30-dayslast-90-daysmonth-to-datelast-monthyear-to-datelast-12-monthscustom-7 days-30 days-90 days-1 monthmonth to dateyear to date-12 monthsfromstringWith
period=custom, the first day, such as2026-10-01.tostringWith
period=custom, the last day.timezonestringThe IANA time zone days are read in, such as
America/New_York. Defaults toUTC.filtersmap of stringsOnly visits matching every filter, keyed by what is filtered:
filters[url]=contains:/blog. Each value is{operator}:{value}, with operatoris,not,contains,starts,gtorlt. Keys includeurl,hostName,entryUrl,exitUrl,event,outgoingUrl,referrer,source,medium,campaign,content,term,countryCode,regionCode,language,deviceType(desktop,tabletormobile),operatingSystemandbrowser.columnsstringThe columns to return, comma-separated, such as
url,pageViews. Left out, the table's default columns. Send a string even in a JSON body: an array is ignored.sortstringThe column to sort by, then
:afor ascending or:dfor descending, such aspageViews:d. Left out, the table's own order.searchstringOnly rows matching this text. What it searches depends on the table, most often the URL or title.
pageintegerat least 1The page of rows to return, from
1. Defaults to1.rowsPerPageintegerat least 1How many rows a page holds. Defaults to
100.previousPeriodstring1to add the figures of the period before, the same length and ending where this one starts, asprevious…fields. Left out or0, none. Needs aperiodwith a start: withall, nothing is added.One of
01
Response
200JSON.
resultobjectrequiredThe answer.
Show 6 fieldsHide fields
pageintegerrequiredat least 1The page returned. Not always the page asked for, when that was out of range.
minPageintegerrequiredat least 1The first page. Always
1.maxPageintegerrequiredThe last page at this
rowsPerPage. With no rows,0or1depending on the table.numRowsintegerrequiredHow many rows there are across every page.
rowsPerPageintegerrequiredat least 1How many rows a page holds.
rowslist of objectsrequiredThe rows on this page.
Show 14 fieldsHide fields
urlstringrequireduriThe exit page's address. Filter other queries to visits that ended on it with
filters[exitUrl].pageViewsintegerrequiredVisits that ended on the page.
exitRateintegerrequiredcan be null0 to 100The share of the page's views that were the last of their visit, as a whole percentage. Null when the page had no views in the period.
averageScrollnumber0 to 100How far down the page its views scrolled on average, as a percentage of its height. Across all the page's views, not only the visits that ended on it. Absent when no scrolling was recorded for it.
reach25number0 to 100The percentage of the page's views that scrolled at least 25% of the way down, to one decimal place. Absent when no scrolling was recorded for it.
reach50number0 to 100The percentage of the page's views that scrolled at least 50% of the way down, to one decimal place. Absent when no scrolling was recorded for it.
reach75number0 to 100The percentage of the page's views that scrolled at least 75% of the way down, to one decimal place. Absent when no scrolling was recorded for it.
reach100number0 to 100The percentage of the page's views that scrolled at least 100% of the way down, to one decimal place. Absent when no scrolling was recorded for it.
durationnumberAverage time spent on the page per view, in seconds. Absent when no time was recorded for it.
pageTitlestringThe page's
<title>, as the Silktide Script recorded it. Empty when it recorded none. Absent where page names are not available.pageNamestringThe page's name, as Silktide shows it: the account's label for it where one is set, otherwise its main heading, its title without the website's name, or its path. Absent where page names are not available.
pageViewsOfPageintegerEvery view of the page in the period, the figure
exitRateis a share of. Only whencolumnsnames it.bounceRateinteger0 to 100The share of the page's visits that viewed only one page and left, as a whole percentage. Only when
columnsnames it.previousPageViewsintegerVisits that ended on the page in the period before. Only with
previousPeriod=1and aperiodother thanall.0when it had none then.
selectorstringrequiredThe query that answered, as its path:
/v1/results/scores.durationnumberrequiredSeconds Silktide took to answer.
Errors
| Status | Type | When |
|---|---|---|
| 404 | ModelNotFound | No view or website with that id exists in the account, or the API key's user cannot see it. |
| 403 | AccessDenied | The API key's user cannot read that analytics view. |
| 200 | ModelNotFound | The website has no Analytics set up. The body is an error despite the status. |
| 200 | InvalidRequest | Neither view nor websiteId was sent. The error's own status is 400 and properties.field is view. The body is an error despite the status. |
| 200 | InvalidArgument | A filter names a key or operator Analytics does not know. The body is an error despite the status. |
| 200 | InvalidArgument | period is not one of its values, or is custom without both from and to. The body is an error despite the status. |
| 200 | - | sort names a column the table cannot sort by. Sort by url or pageViews only. The body is an error despite the status. |
| 200 | - | columns leaves out pageViews and no sort names one of the columns asked for. The body is an error despite the status. |
| 401 | NotLoggedIn | No API key was sent, or it is not a key for this region.(any operation) |
| 429 | TooManyRequests | Too many requests to this path in five seconds. Retry after the number of seconds in the Retry-After header, which properties.retryAfter repeats.(any operation) |
| 503 | - | Silktide is busy. Retry after the number of seconds in the Retry-After header.(any operation) |
Every error has the same body. See Errors.
Access
- Permission
- View analytics view (View all analytics for `view=all`)
- Plan feature
- None
- Edition
- Silktide 4 and Silktide 5
- Cost
- Free
- Available since
- v1.0.0
Try it
Sends a real request to your account from this browser. Your key stays in this tab and goes only to the Silktide API.