> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getqr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Analíticas

> Estadísticas de escaneos de un código QR o de todo tu espacio de trabajo.

> [!NOTE]
>
> La API de GetQR está en beta y solo está disponible para algunos espacios de trabajo. Los detalles pueden cambiar antes del lanzamiento general.

Obtén totales de escaneos y desgloses por país, dispositivo, navegador y más, para un solo código QR o para todo tu espacio de trabajo.

| Método | Ruta | Descripción |
| - | - | - |
| `GET` | `/api/v1/qrs/{qrId}/analytics` | [Obtener las analíticas de un código QR](#obtener-las-analíticas-de-un-código-qr) |
| `GET` | `/api/v1/analytics` | [Obtener las analíticas del espacio de trabajo](#obtener-las-analíticas-del-espacio-de-trabajo) |

Para un resumen ya preparado por código QR, consulta [Informes](https://docs.getqr.com/es/api/endpoints/reports.md).

## Qué significan los números

* **Escaneos.** Todos los recuentos están en el campo `clicks`. Se cuenta un escaneo cada vez que alguien abre el enlace corto del código QR.
* **Escaneos únicos.** Con `unique=true`, cada visitante se cuenta una sola vez en el rango de fechas.
* **Alcance.** Los números proceden del enlace corto del código QR. Un código QR sin enlace corto no tiene escaneos que contar.
* **Historial.** Las analíticas no se pueden restablecer con la API. Eliminar un código QR no borra sus datos históricos de escaneos.

## Cabeceras

**Authorization** `string` *required*

`Bearer` seguido de tu clave de API. Consulta [Autenticación](https://docs.getqr.com/es/api/authentication.md).

## Parámetros de consulta

Los dos endpoints aceptan estos parámetros. Todos son opcionales.

**groupBy** `string` (default: count)

Dimensión del desglose. `count` devuelve el total. Consulta [Desgloses](#desgloses) para ver todos los valores y la forma de su respuesta.

**interval** `string` (default: 30d)

Rango de fechas predefinido: `24h`, `7d`, `30d`, `90d`, `1y`, `mtd`, `qtd`, `ytd` o `all`. Consulta [Rangos de fechas](#rangos-de-fechas). Se ignora si envías `start`.

**start** `string`

Inicio de un rango personalizado, ISO 8601, por ejemplo `2026-08-01` o `2026-08-01T00:00:00Z`. Tiene prioridad sobre `interval`. Debe ser anterior a `end`.

**end** `string`

Fin de un rango personalizado, ISO 8601. Por defecto, el final del día de hoy. Se usa junto con `start` o con `interval=all`, y se ignora con los demás intervalos.

**timezone** `string` (default: UTC)

Zona horaria IANA con la que se alinean los intervalos de `timeseries`, por ejemplo `America/New_York`. Una zona horaria desconocida devuelve `422`.

**unique** `boolean` (default: false)

`true` cuenta los escaneos únicos en lugar del total de escaneos.

También puedes enviar [filtros de dimensión](#filtros-de-dimensión).

## Rangos de fechas

| `interval` | Cubre | Intervalos de `timeseries` |
| - | - | - |
| `24h` | Las últimas 24 horas | Horas |
| `7d` | Los últimos 7 días, incluido hoy | Días |
| `30d` | Los últimos 30 días, incluido hoy | Días |
| `90d` | Los últimos 90 días, incluido hoy | Días |
| `1y` | Los últimos 365 días, incluido hoy | Meses |
| `mtd` | Lo que va de mes | Días |
| `qtd` | Lo que va de trimestre | Días |
| `ytd` | Lo que va de año | Días, o meses a partir de 180 días |
| `all` | Desde que se creó tu espacio de trabajo | Días, o meses a partir de 180 días |

Para un rango personalizado, envía `start` y, opcionalmente, `end`. Los rangos de hasta 2 días usan intervalos por horas, los de más de 180 días usan intervalos mensuales y todo lo intermedio usa intervalos diarios.

## Filtros de dimensión

Limita los resultados a los escaneos que coincidan con un filtro. Los distintos filtros se combinan con AND. Si un filtro acepta varios valores, sepáralos con comas: los valores se combinan con OR.

| Filtro | Valor | Varios valores |
| - | - | - |
| `country` | Código de país ISO 3166-1 alfa-2, por ejemplo `US` | Sí |
| `region` | Código de región ISO 3166-2, por ejemplo `US-CA` | Sí |
| `city` | Nombre de la ciudad, por ejemplo `New York` | Sí |
| `continent` | `AF`, `AN`, `AS`, `EU`, `NA`, `OC` o `SA` | Sí |
| `device` | Tipo de dispositivo, por ejemplo `Mobile` o `Desktop` | Sí |
| `browser` | Nombre del navegador, por ejemplo `Chrome` | Sí |
| `os` | Sistema operativo, por ejemplo `iOS` o `Windows` | Sí |
| `url` | URL de destino | Sí |
| `referer` | Referente, por ejemplo `google.com` | No |
| `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content` | Valor UTM, hasta 190 caracteres | No |

Un código de país o de continente desconocido devuelve `422`. Los nombres de dispositivo, navegador y sistema operativo se comparan con la primera letra en mayúscula, así que `mobile` funciona igual que `Mobile`.

Por ejemplo, escaneos desde EE. UU. o Canadá en dispositivos móviles: `?country=US,CA&device=Mobile`.

## Desgloses

`count` devuelve un objeto. Todos los demás valores devuelven un array, ordenado por `clicks` de mayor a menor (`timeseries` se ordena por tiempo).

| `groupBy` | Cada elemento contiene |
| - | - |
| `count` | `clicks` (un objeto, no un array) |
| `timeseries` | `start` (inicio del intervalo), `clicks` |
| `continents` | `continent`, `clicks` |
| `regions` | `region`, `country`, `clicks` |
| `countries` | `country`, `city` (siempre `*`), `clicks` |
| `cities` | `city`, `country`, `clicks` |
| `devices` | `device`, `clicks` |
| `browsers` | `browser`, `clicks` |
| `os` | `os`, `clicks` |
| `triggers` | `trigger` (`qr` o `link`), `clicks` |
| `referers` | `referer` (`(direct)` si se desconoce), `clicks` |
| `referer_urls` | `refererUrl` (`(direct)` si se desconoce), `clicks` |
| `top_links` | `id`, `domain`, `key`, `shortLink`, `url`, `createdAt`, `qr` (`id`, `qrType`, `title`), `clicks` |
| `top_urls` | `url`, `clicks` |
| `top_types` | `qr_type`, `clicks` |
| `utm_sources`, `utm_mediums`, `utm_campaigns`, `utm_terms`, `utm_contents` | El valor UTM (`utm_source`, `utm_medium`, `utm_campaign`, `utm_term` o `utm_content`), `clicks` |

Un `groupBy` desconocido devuelve `422` con la lista de valores válidos.

Respuesta cuando `groupBy=count`:

```json theme={null}
{ "clicks": 142 }
```

Respuesta cuando `groupBy=countries`:

```json theme={null}
[
  { "country": "US", "city": "*", "clicks": 87 },
  { "country": "DE", "city": "*", "clicks": 31 },
  { "country": "GB", "city": "*", "clicks": 24 }
]
```

## Obtener las analíticas de un código QR

`GET /api/v1/qrs/{qrId}/analytics`

Devuelve las estadísticas de escaneos de un código QR, limitadas a su enlace corto. Acepta los [parámetros de consulta](#parámetros-de-consulta) y los [filtros de dimensión](#filtros-de-dimensión) anteriores.

**qrId** `string` *required*

ID del código QR. Tómalo de la respuesta del listado o de la creación de [Códigos QR](https://docs.getqr.com/es/api/endpoints/qr-codes.md).

```bash Total scans, last 30 days theme={null}
curl "https://getqr.com/api/v1/qrs/qr_1EPcVfeHZAY2iNoVLsgW2Aqf/analytics?groupBy=count&interval=30d" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```bash Unique scans theme={null}
curl "https://getqr.com/api/v1/qrs/qr_1EPcVfeHZAY2iNoVLsgW2Aqf/analytics?groupBy=count&interval=30d&unique=true" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```bash By country, last 7 days theme={null}
curl "https://getqr.com/api/v1/qrs/qr_1EPcVfeHZAY2iNoVLsgW2Aqf/analytics?groupBy=countries&interval=7d" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
{
  "clicks": 142
}
```

## Obtener las analíticas del espacio de trabajo

`GET /api/v1/analytics`

Devuelve las estadísticas de escaneos de todos los códigos QR de tu espacio de trabajo. Acepta los [parámetros de consulta](#parámetros-de-consulta) y los [filtros de dimensión](#filtros-de-dimensión) anteriores, además de estos parámetros de alcance.

**domain** `string`

Junto con `key`, limita los resultados al enlace corto con este dominio, por ejemplo `getqr.sh`. El dominio debe pertenecer a tu espacio de trabajo.

**key** `string`

Slug del enlace corto, por ejemplo `x7Kd2p1`. Úsalo junto con `domain`. Ambos están en el [objeto de código QR](https://docs.getqr.com/es/api/endpoints/qr-codes.md).

**qrType** `string`

Tipos de código QR que se incluyen, separados por comas: `website`, `pdf`, `image`, `video`, `whatsapp`, `social`, `wifi`, `app`, `feedback`, `vcard`, `sms`, `payment`, `location`, `multilink`, `email` o `event`. Consulta [Tipos de QR](https://docs.getqr.com/es/api/guides/qr-types.md).

```bash Devices, last 7 days theme={null}
curl "https://getqr.com/api/v1/analytics?groupBy=devices&interval=7d" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```bash Devices, website QR codes only theme={null}
curl "https://getqr.com/api/v1/analytics?groupBy=devices&interval=30d&qrType=website" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```bash One short link theme={null}
curl "https://getqr.com/api/v1/analytics?groupBy=count&domain=getqr.sh&key=x7Kd2p1" \
  -H "Authorization: Bearer $GETQR_API_KEY"
```

```json 200 theme={null}
[
  { "device": "Mobile", "clicks": 980 },
  { "device": "Desktop", "clicks": 240 }
]
```

## Problemas habituales

> [accordion] 400 "QR has no associated link."
>
> El código QR no tiene enlace corto, así que no hay escaneos que contar.

> [accordion] 404 al filtrar por dominio y clave
>
> No existe en tu espacio de trabajo ningún enlace corto con ese dominio y ese slug. Copia `domain` y `key` del objeto de código QR.

> [accordion] 422 en groupBy, interval o un filtro
>
> El valor no se admite. El mensaje de error indica el parámetro y enumera los valores válidos.

> [accordion] Los números no coinciden con el panel
>
> Comprueba que usas el mismo rango de fechas y la misma zona horaria, y si cuentas escaneos únicos (`unique=true`) o el total de escaneos.

## Siguientes pasos

> [card] [Informes](https://docs.getqr.com/es/api/endpoints/reports.md)

> [card] [Códigos QR](https://docs.getqr.com/es/api/endpoints/qr-codes.md)

> [card] [Analíticas en la app](https://docs.getqr.com/es/analytics/overview.md)

> [card] [Límites de tasa](https://docs.getqr.com/es/api/rate-limits.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.