<!-- https://developers.silktide.com/v1/analytics/audience/get-browser-sizes | Analytics / Audience -->

# List the sizes of browser window visitors used

`GET /v1/results/analytics/browser-sizes`

Lists how wide visitors' browser windows were, grouped into sizes, with the visitors and page views at each, smallest first. It answers with a plain list, not a [table](https://developers.silktide.com/v1/concepts/tables.md).

A size is a range of window widths, not a kind of device: a phone turned sideways, or a narrow desktop window, can count as `Tablet`. Each size runs from the breakpoint of the size before it up to its own. By default there are three:

| Size | Window width |
| --- | --- |
| `Mobile` | up to 425 pixels |
| `Tablet` | 426 to 1,024 |
| `Desktop` | wider than 1,024 (its breakpoint reads `1440`) |

With `simple` set to `false`, there are seven: `Mobile (small)` up to 320, `Mobile (medium)` up to 375, `Mobile (large)` up to 425, `Tablet` up to 768, `Desktop (small)` up to 1,024, `Desktop (medium)` up to 1,440 and `Desktop (large)` wider (its breakpoint reads `2560`).

Two things can make the figures differ from other queries. `limit` counts distinct window widths, before they are grouped, so only the ten most-visited widths are counted by default; on a busy website, send a larger `limit` to count them all. And `visitors` adds up each width's visitors, so a visitor who resized their window can be counted more than once. `pageViews` adds up correctly.

## Request

### Query parameters

- `view` (string, optional, matches `^(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`.
- `websiteId` (integer, optional, at least 1): Instead of `view`, a website whose analytics to read. The website must have Analytics set up.
- `sectionId` (integer, optional): With `websiteId`, a section of the website. Defaults to `0`, the whole website.
- `period` (string, optional): 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 of: `all`, `today`, `last-7-days`, `last-30-days`, `last-90-days`, `month-to-date`, `last-month`, `year-to-date`, `last-12-months`, `custom`, `-7 days`, `-30 days`, `-90 days`, `-1 month`, `month to date`, `year to date`, `-12 months`.
- `from` (string, optional): With `period=custom`, the first day, such as `2026-10-01`.
- `to` (string, optional): With `period=custom`, the last day.
- `timezone` (string, optional): The IANA time zone days are read in, such as `America/New_York`. Defaults to `UTC`.
- `filters` (map of strings, optional): 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`.
- `simple` (boolean, optional): `false` for seven finer sizes, from `Mobile (small)` to `Desktop (large)`, instead of `Mobile`, `Tablet` and `Desktop`. Defaults to `true`. In a query string, send `0` or `false`.
- `limit` (integer, optional, at least 1): How many distinct window widths to count, most visitors first, before they are grouped into sizes. Defaults to `10`.

## Response

Status `200`.

- `result` (list of objects, required): The answer.
  - `screenSizeName` (string, required): The size: `Mobile`, `Tablet` or `Desktop`, or with `simple` false, `Mobile (small)`, `Mobile (medium)`, `Mobile (large)`, `Tablet`, `Desktop (small)`, `Desktop (medium)` or `Desktop (large)`.
  - `breakpoint` (integer, required, at least 1): The widest browser window the size covers, in CSS pixels, such as `425`. The widest size also covers every window wider than its breakpoint.
  - `pageViews` (integer, required): Page views in a window of the size.
  - `visitors` (integer, required): Visitors in a window of the size, added up across the window widths it covers, so someone seen at two widths counts twice.
- `selector` (string, required): The query that answered, as its path: `/v1/results/scores`.
- `duration` (number, required): Seconds 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. |
| 401 | `NotLoggedIn` | No API key was sent, or it is not a key for this region. |
| 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. |
| 503 | - | Silktide is busy. Retry after the number of seconds in the `Retry-After` header. |

## Access

- Permission: View analytics view (View all analytics for `view=all`)
- Plan feature: none
- Edition: Silktide 4 and Silktide 5
- Cost: free
- Stability: stable, since 1.0.0

## Example: Mobile, tablet and desktop

```bash
curl "https://api.eu.silktide.com/v1/results/analytics/browser-sizes?view=all&period=last-90-days" \
  -H "Authorization: silktide token=$SILKTIDE_API_KEY"
```

Response:

```json
{
  "result": [
    {
      "screenSizeName": "Mobile",
      "breakpoint": 425,
      "pageViews": 1111,
      "visitors": 442
    },
    {
      "screenSizeName": "Tablet",
      "breakpoint": 1024,
      "pageViews": 208,
      "visitors": 84
    },
    {
      "screenSizeName": "Desktop",
      "breakpoint": 1440,
      "pageViews": 706,
      "visitors": 278
    }
  ],
  "selector": "/v1/results/analytics/browser-sizes",
  "duration": 0.01
}
```
