---
title: "Consultar las visitas de un sitio"
description: "Vistas de página del sitio publicado por parte de los visitantes, con datos de páginas, fuentes, países y dispositivos durante un periodo."
canonical: "https://atelier201.com/docs/es/api/analytics/get"
updated: "2026-11-06"
---

# Consultar las visitas de un sitio

Requiere `sites:read`. Las cifras de visitantes son null si el propietario ha desactivado el recuento de visitas. Solo el propietario puede cambiar esta opción en el panel.

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

## Authorizations

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

## Path parameters

- `site_id` (`string`, required): El ID del sitio o su slug (la dirección antes de .atelier201.page).

## Query parameters

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

## Response

**200**: Consulta las visitas de un sitio

- `data` (`object`, required)
- `data.period` (`enum<string>`, required, one of: `today, 7d, 30d, 90d, 12m`)
- `data.from` (`string`, required): Primer día UTC incluido.
- `data.to` (`string`, required): Último día UTC incluido: ayer si no estaban disponibles los datos en tiempo real de hoy.
- `data.visitor_counting` (`boolean`, required): False si el propietario ha desactivado el recuento de visitantes. En ese caso, las cifras de visitantes son 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): Proporción de visitas con una sola visualización de página, de 0 a 1.
- `data.totals.visit_seconds` (`number,null`, required)
- `data.totals.views_per_visit` (`number,null`, required)
- `data.previous` (`object | null`, required): El mismo número de días inmediatamente anterior. Null si no hay datos de ese periodo y para hoy.
- `data.previous.views` (`number`, required)
- `data.previous.visitors` (`number,null`, required)
- `data.previous.visits` (`number,null`, required)
- `data.previous.bounce_rate` (`number,null`, required): Proporción de visitas con una sola visualización de página, de 0 a 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): Procedencia de las visualizaciones. Los clics dentro del sitio no cuentan como visitas, por lo que el total es inferior al de visualizaciones.
- `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): Visualizaciones de bots, separadas de todas las cifras anteriores.
- `data.updated_at` (`string,null`, required): Momento en que se consolidaron los datos del último día completo. Null antes de la primera consolidación nocturna.
- `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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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**: Códigos posibles: 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>'
```
