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

# Analytics

> Scanstatistieken voor één QR-code of je hele workspace.

> [!NOTE]
>
> De GetQR API is in bèta en beschikbaar voor geselecteerde workspaces. Details kunnen nog veranderen vóór de algemene release.

Haal scantotalen en uitsplitsingen op per land, apparaat, browser en meer, voor één QR-code of voor je hele workspace.

| Methode | Pad | Beschrijving |
| - | - | - |
| `GET` | `/api/v1/qrs/{qrId}/analytics` | [Analytics voor een QR-code ophalen](#analytics-voor-een-qr-code-ophalen) |
| `GET` | `/api/v1/analytics` | [Workspace-analytics ophalen](#workspace-analytics-ophalen) |

Een kant-en-klaar overzicht per QR-code vind je bij [Rapporten](https://docs.getqr.com/nl/api/endpoints/reports.md).

## Wat de cijfers betekenen

* **Scans.** Elke telling staat in het veld `clicks`. Een scan wordt geteld telkens wanneer iemand de korte link van de QR-code opent.
* **Unieke scans.** Met `unique=true` wordt elke bezoeker één keer geteld binnen het datumbereik.
* **Bereik.** De cijfers komen van de korte link van de QR-code. Een QR-code zonder korte link heeft geen scans om te tellen.
* **Geschiedenis.** Analytics kun je niet via de API resetten. Als je een QR-code verwijdert, worden de historische scangegevens niet gewist.

## Headers

**Authorization** `string` *required*

`Bearer` gevolgd door je API-sleutel. Zie [Authenticatie](https://docs.getqr.com/nl/api/authentication.md).

## Queryparameters

Beide endpoints accepteren deze parameters. Ze zijn allemaal optioneel.

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

Dimensie voor de uitsplitsing. `count` geeft het totaal terug. Alle waarden en de vorm van hun antwoord staan bij [Uitsplitsingen](#uitsplitsingen).

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

Vooraf ingesteld datumbereik: `24h`, `7d`, `30d`, `90d`, `1y`, `mtd`, `qtd`, `ytd` of `all`. Zie [Datumbereiken](#datumbereiken). Wordt genegeerd als je `start` meestuurt.

**start** `string`

Begin van een aangepast bereik, ISO 8601, bijvoorbeeld `2026-08-01` of `2026-08-01T00:00:00Z`. Gaat voor op `interval`. Moet vóór `end` liggen.

**end** `string`

Einde van een aangepast bereik, ISO 8601. Standaard het einde van vandaag. Wordt gebruikt samen met `start` of `interval=all`, en genegeerd bij de andere intervallen.

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

IANA-tijdzone waarop de `timeseries`-buckets worden uitgelijnd, bijvoorbeeld `America/New_York`. Een onbekende tijdzone geeft `422`.

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

`true` telt unieke scans in plaats van het totale aantal scans.

Je kunt ook [dimensiefilters](#dimensiefilters) meesturen.

## Datumbereiken

| `interval` | Beslaat | `timeseries`-buckets |
| - | - | - |
| `24h` | De afgelopen 24 uur | Uren |
| `7d` | De afgelopen 7 dagen, inclusief vandaag | Dagen |
| `30d` | De afgelopen 30 dagen, inclusief vandaag | Dagen |
| `90d` | De afgelopen 90 dagen, inclusief vandaag | Dagen |
| `1y` | De afgelopen 365 dagen, inclusief vandaag | Maanden |
| `mtd` | Deze maand tot nu toe | Dagen |
| `qtd` | Dit kwartaal tot nu toe | Dagen |
| `ytd` | Dit jaar tot nu toe | Dagen, of maanden na 180 dagen |
| `all` | Sinds je workspace is aangemaakt | Dagen, of maanden na 180 dagen |

Stuur voor een aangepast bereik `start` en eventueel `end` mee. Bereiken tot 2 dagen gebruiken buckets per uur, bereiken van meer dan 180 dagen buckets per maand, en alles daartussen buckets per dag.

## Dimensiefilters

Beperk de resultaten tot scans die aan een filter voldoen. Verschillende filters worden gecombineerd met AND. Accepteert een filter meerdere waarden, scheid ze dan met komma's: de waarden worden gecombineerd met OR.

| Filter | Waarde | Meerdere waarden |
| - | - | - |
| `country` | ISO 3166-1 alpha-2-landcode, bijvoorbeeld `US` | Ja |
| `region` | ISO 3166-2-regiocode, bijvoorbeeld `US-CA` | Ja |
| `city` | Plaatsnaam, bijvoorbeeld `New York` | Ja |
| `continent` | `AF`, `AN`, `AS`, `EU`, `NA`, `OC` of `SA` | Ja |
| `device` | Apparaattype, bijvoorbeeld `Mobile` of `Desktop` | Ja |
| `browser` | Browsernaam, bijvoorbeeld `Chrome` | Ja |
| `os` | Besturingssysteem, bijvoorbeeld `iOS` of `Windows` | Ja |
| `url` | Bestemmings-URL | Ja |
| `referer` | Verwijzer, bijvoorbeeld `google.com` | Nee |
| `utm_source`, `utm_medium`, `utm_campaign`, `utm_term`, `utm_content` | UTM-waarde, maximaal 190 tekens | Nee |

Een onbekende land- of continentcode geeft `422`. Namen van apparaten, browsers en besturingssystemen worden vergeleken met een hoofdletter aan het begin, dus `mobile` werkt net als `Mobile`.

Bijvoorbeeld scans uit de VS of Canada op mobiele apparaten: `?country=US,CA&device=Mobile`.

## Uitsplitsingen

`count` geeft een object terug. Elke andere waarde geeft een array terug, gesorteerd op `clicks` van hoog naar laag (`timeseries` is gesorteerd op tijd).

| `groupBy` | Elk item bevat |
| - | - |
| `count` | `clicks` (een object, geen array) |
| `timeseries` | `start` (begin van de bucket), `clicks` |
| `continents` | `continent`, `clicks` |
| `regions` | `region`, `country`, `clicks` |
| `countries` | `country`, `city` (altijd `*`), `clicks` |
| `cities` | `city`, `country`, `clicks` |
| `devices` | `device`, `clicks` |
| `browsers` | `browser`, `clicks` |
| `os` | `os`, `clicks` |
| `triggers` | `trigger` (`qr` of `link`), `clicks` |
| `referers` | `referer` (`(direct)` als onbekend), `clicks` |
| `referer_urls` | `refererUrl` (`(direct)` als onbekend), `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` | De UTM-waarde (`utm_source`, `utm_medium`, `utm_campaign`, `utm_term` of `utm_content`), `clicks` |

Een onbekende `groupBy` geeft `422` met de lijst van geldige waarden.

Antwoord bij `groupBy=count`:

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

Antwoord bij `groupBy=countries`:

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

## Analytics voor een QR-code ophalen

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

Geeft scanstatistieken voor één QR-code terug, beperkt tot de korte link ervan. Accepteert de [queryparameters](#queryparameters) en [dimensiefilters](#dimensiefilters) hierboven.

**qrId** `string` *required*

ID van de QR-code. Neem die over uit het antwoord van de lijst of van het aanmaken bij [QR-codes](https://docs.getqr.com/nl/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
}
```

## Workspace-analytics ophalen

`GET /api/v1/analytics`

Geeft scanstatistieken terug over alle QR-codes in je workspace. Accepteert de [queryparameters](#queryparameters) en [dimensiefilters](#dimensiefilters) hierboven, plus deze parameters om het bereik te beperken.

**domain** `string`

Beperkt samen met `key` de resultaten tot de korte link met dit domein, bijvoorbeeld `getqr.sh`. Het domein moet bij je workspace horen.

**key** `string`

Slug van de korte link, bijvoorbeeld `x7Kd2p1`. Gebruik hem samen met `domain`. Beide staan in het [QR-code-object](https://docs.getqr.com/nl/api/endpoints/qr-codes.md).

**qrType** `string`

Door komma's gescheiden QR-codetypes om mee te nemen: `website`, `pdf`, `image`, `video`, `whatsapp`, `social`, `wifi`, `app`, `feedback`, `vcard`, `sms`, `payment`, `location`, `multilink`, `email` of `event`. Zie [QR-types](https://docs.getqr.com/nl/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 }
]
```

## Veelvoorkomende problemen

> [accordion] 400 "QR has no associated link."
>
> De QR-code heeft geen korte link, dus er zijn geen scans om te tellen.

> [accordion] 404 bij filteren op domain en key
>
> Er bestaat in je workspace geen korte link met dat domein en die slug. Kopieer `domain` en `key` uit het QR-code-object.

> [accordion] 422 bij groupBy, interval of een filter
>
> De waarde wordt niet ondersteund. Het foutbericht noemt de parameter en somt de geldige waarden op.

> [accordion] De cijfers komen niet overeen met het dashboard
>
> Controleer of je hetzelfde datumbereik en dezelfde tijdzone gebruikt, en of je unieke scans (`unique=true`) of het totale aantal scans telt.

## Volgende stappen

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

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

> [card] [Analytics in de app](https://docs.getqr.com/nl/analytics/overview.md)

> [card] [Rate limits](https://docs.getqr.com/nl/api/rate-limits.md)


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