Get how often each event was sent, step by step
/v1/results/analytics/events-over-timeCounts how often events were sent across the period, one line per event in
multiSeries, and every event together in total and series. Send
type=custom for only the events your site sends, or type=built-in for
only those the Silktide Script records itself.
Send a period other than all. A series needs a start date, and all,
the default, has none: the answer is an error with status 200 and type
Error. Check for error before reading result.
How long a step is depends on the period: an hour when it covers a single
day, a month for last-12-months, and a day otherwise.
Without limit, every event sent in the period has a series of its own, which
for a busy site can be dozens. limit=5 keeps the four busiest and adds the
rest together as one series keyed other. total and series are the same
either way.
key is the event as your site sends it, the value to filter by
(filters[event]=is:newsletter_signup); label is the name shown for it in
Silktide. For view, period and filters, see Analytics.
curl "https://api.eu.silktide.com/v1/results/analytics/events-over-time?view=all&period=custom&from=2026-11-01&to=2026-11-03&type=custom&limit=2" \
-H "Authorization: silktide token=$SILKTIDE_API_KEY"{
"result": {
"multiSeries": [
{
"label": "Newsletter sign-up",
"key": "newsletter_signup",
"total": 19,
"series": [
{
"time": "2026-11-01 00:00:00",
"events": 4
},
{
"time": "2026-11-02 00:00:00",
"events": 9
},
{
"time": "2026-11-03 00:00:00",
"events": 6
}
]
},
{
"label": "Other",
"key": "other",
"total": 12,
"series": [
{
"time": "2026-11-01 00:00:00",
"events": 3
},
{
"time": "2026-11-02 00:00:00",
"events": 0
},
{
"time": "2026-11-03 00:00:00",
"events": 9
}
]
}
],
"range": {
"start": "2026-11-01 00:00:00",
"end": "2026-11-04 00:00:00"
},
"total": 31,
"series": [
{
"time": "2026-11-01 00:00:00",
"events": 7
},
{
"time": "2026-11-02 00:00:00",
"events": 9
},
{
"time": "2026-11-03 00:00:00",
"events": 15
}
]
},
"selector": "/v1/results/analytics/events-over-time",
"duration": 0.021
}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.typestringcustomfor only the events your site sends,built-infor only those the Silktide Script records itself, such aspage_loadandclick. Left out, both.One of
custombuilt-inlimitinteger2 to 50The most series
multiSeriesholds, countingOther: the busiest events less one, then the rest added together asOther. Left out, every event has its own series.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
PT1HP1DP7DP1MP1YpreviousPeriodstring1to 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 5 fieldsHide fields
multiSerieslist of objectsrequiredOne series per event sent in the period, most sent first. Empty when none were.
Show 5 fieldsHide fields
labelstringrequiredWhat the event is called in Silktide, as
eventNamein Get events.Otherfor the serieslimitadds the rest into.keystringrequiredThe event, by the name your site sends or a built-in one such as
page_load.otherforOther.totalintegerrequiredHow many times it was sent in the period.
serieslist of objectsrequiredOne entry per step, oldest first, with a
0for a step with none.Show 3 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.eventsintegerrequiredHow many times events were sent in the step.
previousEventsintegerWith
previousPeriod=1,eventsin the matching step of the period before.
previousTotalintegerWith
previousPeriod=1,totalin the period before.
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.
totalintegerrequiredHow many times any event was sent in the period: every series added together.
serieslist of objectsrequiredEvery series added together, one entry per step, oldest first. Empty when no event was sent.
Show 3 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.eventsintegerrequiredHow many times events were sent in the step.
previousEventsintegerWith
previousPeriod=1,eventsin the matching step of the period before.
previousTotalintegerWith
previousPeriod=1,totalin the period before.
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. |
| 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.