---
title: "Scan events for a code"
method: GET
path: "/api/v1/codes/{linkId}/scans"
tags: ["Public API v1"]
---

# Scan events for a code

`GET /api/v1/codes/{linkId}/scans`

## Request

- Base URL: `https://scanduro.com`
- URL: `https://scanduro.com/api/v1/codes/{linkId}/scans`
- Auth: HTTP bearer

Country granularity and nothing finer, stated in every response so it does not have to be
remembered from the documentation. No IP address is stored, so none can be returned.

## Path parameters

- `linkId` string, required

## Query parameters

- `limit` integer

## Response `200`

Scan events, newest first.

- object
  - `data` PublicScan[], required
    - `scannedAt` string, date-time, required
    - `country` string, required
    - `device` 'mobile' | 'tablet' | 'desktop', required
    - `os` string, required
    - `browser` string, required
    - `referrer` string, required
    - `unique` boolean, required
  - `total` integer, required
  - `granularity` 'country', required

## Other responses

- `401`: No key, a malformed key, an unknown key, a revoked key or an expired key. Deliberately one response for all five: telling the caller which applies would make the endpoint an oracle for enumerating valid keys.
- `403`: Either the plan does not include API access (`plan_required`) or the key does not carry the required scope (`missing_scope`). The credential itself is valid in both cases.
- `404`: No such code in this workspace. Another tenant's id reads as absent, not as forbidden.
- `429`: Per-key limit reached. Retry-After gives the seconds remaining in the window.

---

[API](https://skmtc.dev/scanduro/apis/scanduro-public-api.md) · [All operations](https://skmtc.dev/scanduro/apis/scanduro-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/scanduro/apis/scanduro-public-api/revisions/cdb36d96cad7?raw)
