Skip to content
Menu
SilktideDevelopers

Get visitors from the busiest campaigns, step by step

GET/v1/results/analytics/campaigns-over-time
View as Markdown

Draws the busiest campaigns as lines over time: unique visitors who arrived through each, step by step through the period. It is the chart on the Campaigns screen in Analytics, and takes the Analytics arguments.

Only visits that carried a campaign are counted. A line's key is the campaign as recorded, the value to filter other queries by with filters[campaign]; label is the name to show.

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 campaign after the busiest. With the default of 5, you get four campaigns and Other. Other is left out when every campaign 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 campaigns.

Request
curl "https://api.eu.silktide.com/v1/results/analytics/campaigns-over-time?view=all&period=custom&from=2026-09-28&to=2026-09-30&limit=3" \
  -H "Authorization: silktide token=$SILKTIDE_API_KEY"
Response: The two busiest campaigns, day by day
{
  "result": {
    "multiSeries": [
      {
        "label": "October newsletter",
        "key": "newsletter-october",
        "total": 10,
        "series": [
          {
            "time": "2026-09-28 00:00:00",
            "visitors": 4
          },
          {
            "time": "2026-09-29 00:00:00",
            "visitors": 3
          },
          {
            "time": "2026-09-30 00:00:00",
            "visitors": 3
          }
        ]
      },
      {
        "label": "autumn-tasting",
        "key": "autumn-tasting",
        "total": 9,
        "series": [
          {
            "time": "2026-09-28 00:00:00",
            "visitors": 3
          },
          {
            "time": "2026-09-29 00:00:00",
            "visitors": 4
          },
          {
            "time": "2026-09-30 00:00:00",
            "visitors": 2
          }
        ]
      },
      {
        "label": "Other",
        "key": "other",
        "total": 26,
        "series": [
          {
            "time": "2026-09-28 00:00:00",
            "visitors": 10
          },
          {
            "time": "2026-09-29 00:00:00",
            "visitors": 9
          },
          {
            "time": "2026-09-30 00:00:00",
            "visitors": 7
          }
        ]
      }
    ],
    "range": {
      "start": "2026-09-28 00:00:00",
      "end": "2026-10-01 00:00:00"
    }
  },
  "selector": "/v1/results/analytics/campaigns-over-time",
  "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, or all for all of the account's analytics. Send this or websiteId.

  • websiteIdintegerat least 1

    Instead of view, a website whose analytics to read. The website must have Analytics set up.

  • sectionIdinteger

    With websiteId, a section of the website. Defaults to 0, the whole website.

  • periodstring

    The date range. Defaults to all. The spaced forms (-7 days, month to date) are older names that keep working. custom needs from and to.

    One ofalltodaylast-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 months

  • fromstring

    With period=custom, the first day, such as 2026-10-01.

  • tostring

    With period=custom, the last day.

  • timezonestring

    The IANA time zone days are read in, such as America/New_York. Defaults to UTC.

  • filtersmap of strings

    Only visits matching every filter, keyed by what is filtered: filters[url]=contains:/blog. Each value is {operator}:{value}, with operator is, not, contains, starts, gt or lt. Keys include url, hostName, entryUrl, exitUrl, event, outgoingUrl, referrer, source, medium, campaign, content, term, countryCode, regionCode, language, deviceType (desktop, tablet or mobile), operatingSystem and browser.

  • intervalstring

    With 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 ofPT1HP1DP7DP1MP1Y

  • limitinteger

    How many series to return, counting Other, from 2 to 50; a number outside that is taken as the nearest end. Defaults to 5: the four busiest, then Other for the rest.

Response

200JSON.

  • resultobjectrequired

    The answer.

    Show 2 fields
    • multiSerieslist of objectsrequired

      The busiest campaigns by visitors, busiest first, then Other when there are more than limit. Empty when the period had none.

      Show 4 fields
      • labelstringrequired

        The campaign's name, as Silktide shows it: the account's label for it where one is set. Other for the rest.

      • keystringrequired

        The campaign as recorded, the same value as campaign in Get campaigns. other for the series that adds up the rest.

      • totalintegerrequired

        The visitors of every step added up. A visitor who came in more than one step is counted in each.

      • serieslist of objectsrequired

        One step per hour, day, week or month of the period, oldest first. A step with no visits reads 0.

        Show 2 fields
        • timestringrequiredmatches ^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$

          When the step starts, as YYYY-MM-DD HH:MM:SS in the request's timezone.

        • visitorsintegerrequired

          Unique visitors in the step.

    • rangeobjectrequired

      The dates the series covers.

      Show 2 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:SS in the request's timezone.

      • 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.

  • selectorstringrequired

    The query that answered, as its path: /v1/results/scores.

  • durationnumberrequired

    Seconds Silktide took to answer.

Errors

StatusTypeWhen
404ModelNotFoundNo view or website with that id exists in the account, or the API key's user cannot see it.
403AccessDeniedThe API key's user cannot read that analytics view.
200ModelNotFoundThe website has no Analytics set up. The body is an error despite the status.
200InvalidRequestNeither 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.
200InvalidArgumentA filter names a key or operator Analytics does not know. The body is an error despite the status.
200Errorperiod 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.
200InvalidArgumentperiod is not one of its values, or is custom without both from and to. The body is an error despite the status.
200Unspecifiedinterval is not one of its values. The body is an error despite the status.
401NotLoggedInNo API key was sent, or it is not a key for this region.(any operation)
429TooManyRequestsToo 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.