---
title: "Read a site's visitor numbers"
description: "Page views of the live site by people, with pages, sources, countries and devices, over a period."
canonical: "https://atelier201.com/docs/api/analytics/get"
updated: "2026-11-06"
---

# Read a site's visitor numbers

Requires `sites:read`. Visitor figures are null when the owner turned visitor
counting off, which only the owner can change, in the dashboard.

```http
GET https://api.atelier201.com/v1/sites/{site_id}/analytics
```

## Authorizations

- `Authorization` (bearer, in header, required)

## Path parameters

- `site_id` (`string`, required): The site's id, or its slug (the address before .atelier201.page).

## Query parameters

- `period` (`enum<string>`, one of: `today, 7d, 30d, 90d, 12m`): today, 7d, 30d, 90d or 12m. Default 30d.

## Response

**200**: Read a site's visitor numbers

- `data` (`object`, required)
- `data.period` (`enum<string>`, required, one of: `today, 7d, 30d, 90d, 12m`)
- `data.from` (`string`, required): First UTC day covered.
- `data.to` (`string`, required): Last UTC day covered: yesterday when today's live read was not available.
- `data.visitor_counting` (`boolean`, required): False when the owner turned visitor counting off: the visitor figures are then null.
- `data.totals` (`object`, required)
- `data.totals.views` (`number`, required)
- `data.totals.visitors` (`number,null`, required)
- `data.totals.visits` (`number,null`, required)
- `data.totals.bounce_rate` (`number,null`, required): Share of visits with a single page view, 0 to 1.
- `data.totals.visit_seconds` (`number,null`, required)
- `data.totals.views_per_visit` (`number,null`, required)
- `data.previous` (`object | null`, required): The same number of days just before. Null when there is no data then, and for today.
- `data.previous.views` (`number`, required)
- `data.previous.visitors` (`number,null`, required)
- `data.previous.visits` (`number,null`, required)
- `data.previous.bounce_rate` (`number,null`, required): Share of visits with a single page view, 0 to 1.
- `data.previous.visit_seconds` (`number,null`, required)
- `data.previous.views_per_visit` (`number,null`, required)
- `data.series` (`object[]`, required)
- `data.series.at` (`string`, required)
- `data.series.views` (`number`, required)
- `data.series.visitors` (`number,null`, required)
- `data.pages` (`object[]`, required)
- `data.pages.key` (`string`, required)
- `data.pages.views` (`number`, required)
- `data.pages.visitors` (`number,null`, required)
- `data.sources` (`object[]`, required): Where views arrived from. Clicks inside the site are not arrivals, so these add up to fewer than the total.
- `data.sources.key` (`string`, required)
- `data.sources.views` (`number`, required)
- `data.sources.visitors` (`number,null`, required)
- `data.countries` (`object[]`, required)
- `data.countries.key` (`string`, required)
- `data.countries.views` (`number`, required)
- `data.countries.visitors` (`number,null`, required)
- `data.devices` (`object[]`, required)
- `data.devices.key` (`string`, required)
- `data.devices.views` (`number`, required)
- `data.devices.visitors` (`number,null`, required)
- `data.browsers` (`object[]`, required)
- `data.browsers.key` (`string`, required)
- `data.browsers.views` (`number`, required)
- `data.browsers.visitors` (`number,null`, required)
- `data.os` (`object[]`, required)
- `data.os.key` (`string`, required)
- `data.os.views` (`number`, required)
- `data.os.visitors` (`number,null`, required)
- `data.bot_views` (`number`, required): Views by bots, kept apart from every figure above.
- `data.updated_at` (`string,null`, required): When the last full day was rolled up. Null before the first night.
- `request_id` (`string`, required)

```json
{
  "data": {
    "period": "today",
    "from": "<string>",
    "to": "<string>",
    "visitor_counting": true,
    "totals": {
      "views": 123.45,
      "visitors": null,
      "visits": null,
      "bounce_rate": null,
      "visit_seconds": null,
      "views_per_visit": null
    },
    "previous": {
      "views": 123.45,
      "visitors": null,
      "visits": null,
      "bounce_rate": null,
      "visit_seconds": null,
      "views_per_visit": null
    },
    "series": [
      {
        "at": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "pages": [
      {
        "key": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "sources": [
      {
        "key": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "countries": [
      {
        "key": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "devices": [
      {
        "key": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "browsers": [
      {
        "key": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "os": [
      {
        "key": "<string>",
        "views": 123.45,
        "visitors": null
      }
    ],
    "bot_views": 123.45,
    "updated_at": null
  },
  "request_id": "<string>"
}
```

**400**: Possible codes: invalid_request, unknown_field, invalid_parameter, invalid_cursor

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**401**: Possible codes: authentication_required, invalid_api_key, api_key_expired, api_key_revoked

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**402**: Possible codes: insufficient_credits

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**403**: Possible codes: insufficient_scope, feature_not_available, admin_required

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**404**: Possible codes: resource_not_found

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**409**: Possible codes: conflict, result_not_ready, idempotency_key_reused

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**410**: Possible codes: result_expired

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**413**: Possible codes: request_too_large

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**422**: Possible codes: request_too_large_for_plan

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**429**: Possible codes: rate_limited

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**500**: Possible codes: internal_error

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**503**: Possible codes: service_unavailable

- `error` (`object`, required)
- `error.type` (`string`, required)
- `error.code` (`string`, required)
- `error.message` (`string`, required)
- `error.param` (`string`)
- `error.docs_url` (`string`, required)
- `error.action_url` (`string<uri>`)
- `error.details` (`Record<string, object>`)
- `request_id` (`string`, required)

```json
{
  "error": {
    "type": "<string>",
    "code": "<string>",
    "message": "<string>",
    "param": "<string>",
    "docs_url": "<string>",
    "action_url": "<string>",
    "details": {}
  },
  "request_id": "<string>"
}
```

**Example request**

```bash
curl --request GET \
  --url 'https://api.atelier201.com/v1/sites/<site_id>/analytics' \
  --header 'Authorization: <api-key>'
```
