List QR codes

Overview

Get a paginated list of QR codes scoped to the authenticated account-user's company, with each row's total_scans computed from scan history. Supports filtering by store, destination type, date range, free-text/field search, and sorting.

Prerequisites

  • A bearer token. Callable with Account tokens.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

GET /api/v1/qr-codes

Authentication

  • Requires a bearer token in the Authorization: Bearer <bearer-token> header.

  • Who can call it: Account tokens.

  • Authentication. Rows are hard-scoped to the caller's own company (the account company).

  • The optional store_id filter must also sit inside your own account tree.

Rate limit

  • No rate limit.

Query parameters

  • Query: store_id (integer, optional) — must Must be an existing location and belong to the auth company hierarchy.
  • Query: destination_type (string, optional) — one of landing_page, review_site, custom_url.
  • Query: exclude_destination_type (string, optional) — one of landing_page, review_site, custom_url.
  • Query: start_date (string Y-m-d, optional) — filters created_at from this day.
  • Query: end_date (string Y-m-d, optional) — filters created_at to this day.
  • Query: search_field (string, optional) — one of name, destination_type, landing_page_id, review_site_id, destination_url, created_at, updated_at, last_scanned_at, store_name, storeId, total_scans.
  • Query: search_value (string, optional, max 255) — paired with search_field. For total_scans accepts exact 5, range 5-10, gte 5+, or lte 5-.
  • Query: search (string, optional, max 255) — fallback name like search (used only when search_field/search_value absent).
  • Query: sort_field (string, optional) — same enum as search_field, plus id.
  • Query: sort_by (string, optional) — asc/ASC/desc/DESC (defaults DESC).
  • Query: per_page (integer, optional, 10–100, default 15; values below 10 are raised to 10).

Response

  • data.current_page (int)
  • data.data[] (array of QrCode rows) — selected columns: id, name, destination_type, store_id, landing_page_id, review_site_id, destination_url, customization, last_scanned_at, created_at, updated_at, qr_code_image_path, plus computed total_scans (int) and the QrCode's appended qr_code_image_url. Also returns store:id,name,storeId, landingPage:id, reviewSite:id.
  • data.per_page (int), data.total (int), data.last_page (int), and the rest of the standard paginator keys.

200 Success · 200

{
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": 123,
        "name": "Clinic front desk",
        "destination_type": "landing_page",
        "store_id": 8748,
        "landing_page_id": 1,
        "review_site_id": null,
        "destination_url": "https://example.com/lp/1?store_id=8748",
        "customization": null,
        "last_scanned_at": "2026-06-15T10:30:00.000000Z",
        "created_at": "2026-06-01T09:00:00.000000Z",
        "updated_at": "2026-06-15T10:30:00.000000Z",
        "qr_code_image_path": "qr-codes/abc.png",
        "unique_code": "a1B2c3d4",
        "qr_code_image_url": "https://s3.example.com/qr-codes/abc.png",
        "total_scans": 42
      }
    ],
    "per_page": 15,
    "total": 120,
    "last_page": 8
  }
}

Errors

StatusMeaning
401The bearer token is missing, expired or invalid
422The request failed validation — the response names the fields
500Unexpected server error

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/qr-codes" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?