Get visitors from the busiest sources, step by step
/v1/results/analytics/sources-over-timeDraws the busiest sources as lines over time: unique visitors from each, step by step through the period. It is the chart on the Sources screen in Analytics, and takes the Analytics arguments.
Unlike Get sources, a line is one source across every medium it arrived through. Direct visits are the line whose key is empty.
Send a period with a start, such as last-30-days or custom with from and to. Left out, period is all, and this query answers with an error.
limit counts the Other line, which adds up every source after the busiest. With the default of 5, you get four sources and Other. Other is left out when every source already has a line.
A line's total adds up its steps, so a visitor who came on two different days counts twice in it. For the number of unique visitors over the whole period, use Get sources.
curl "https://api.eu.silktide.com/v1/results/analytics/sources-over-time?view=all&period=custom&from=2026-09-28&to=2026-09-30&limit=3" \
-H "Authorization: silktide token=$SILKTIDE_API_KEY"{
"result": {
"multiSeries": [
{
"label": "Direct",
"key": "",
"total": 128,
"series": [
{
"time": "2026-09-28 00:00:00",
"visitors": 41
},
{
"time": "2026-09-29 00:00:00",
"visitors": 43
},
{
"time": "2026-09-30 00:00:00",
"visitors": 44
}
]
},
{
"label": "Google",
"key": "Google",
"total": 93,
"series": [
{
"time": "2026-09-28 00:00:00",
"visitors": 26
},
{
"time": "2026-09-29 00:00:00",
"visitors": 35
},
{
"time": "2026-09-30 00:00:00",
"visitors": 32
}
]
},
{
"label": "Other",
"key": "other",
"total": 104,
"series": [
{
"time": "2026-09-28 00:00:00",
"visitors": 40
},
{
"time": "2026-09-29 00:00:00",
"visitors": 28
},
{
"time": "2026-09-30 00:00:00",
"visitors": 36
}
]
}
],
"range": {
"start": "2026-09-28 00:00:00",
"end": "2026-10-01 00:00:00"
}
},
"selector": "/v1/results/analytics/sources-over-time",
"duration": 0.09
}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.intervalstringWith
period=custom, the length of each step: an hour, a day, a week starting on Monday, a month or a year. Ignored with any other period. Left out, steps are hours for a single day, months for exactly twelve months, and days otherwise.One of
PT1HP1DP7DP1MP1YlimitintegerHow many series to return, counting
Other, from2to50; a number outside that is taken as the nearest end. Defaults to5: the four busiest, thenOtherfor the rest.
Response
200JSON.
resultobjectrequiredThe answer.
Show 2 fieldsHide fields
multiSerieslist of objectsrequiredThe busiest sources by visitors, busiest first, then
Otherwhen there are more thanlimit. Empty when the period had none.Show 4 fieldsHide fields
labelstringrequiredThe source's name, as Silktide shows it: the account's label for it where one is set.
Otherfor the rest.keystringrequiredThe source as recorded, the same value as
sourcein Get sources: empty for direct visits.otherfor the series that adds up the rest.totalintegerrequiredThe visitors of every step added up. A visitor who came in more than one step is counted in each.
serieslist of objectsrequiredOne step per hour, day, week or month of the period, oldest first. A step with no visits reads
0.Show 2 fieldsHide fields
timestringrequiredmatches^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$When the step starts, as
YYYY-MM-DD HH:MM:SSin the request'stimezone.visitorsintegerrequiredUnique visitors in the step.
rangeobjectrequiredThe dates the series covers.
Show 2 fieldsHide fields
startstringrequiredmatches^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$When the first step starts, as
YYYY-MM-DD HH:MM:SSin the request'stimezone.endstringrequiredmatches^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$When the range ends, as
YYYY-MM-DD HH:MM:SS: midnight after its last day, so the range runs up to but not including it.
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 | Error | period is all or left out, which means all. Over-time queries need a period with a start. 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 | Unspecified | interval is not one of its values. 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.