List QR templates

Overview

Get a paginated list of QR code templates scoped to the authenticated user's company, with filtering (store, type, date range), full-text search, and sorting. Each row is decorated with a total_scans count.

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/template/list

Authentication

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

  • Who can call it: Account tokens.

  • Authentication. Templates are hard-scoped to the auth user's own company (no partner-tree walk).

  • The optional store_id filter must also sit inside your own account tree. It must resolve into the auth company's hierarchy.

Rate limit

  • No rate limit.

Query parameters

  • Query: store_id (integer, optional) — must be an existing location and belong to the auth company (an ownership check).
  • Query: template_type (string, optional) — one of standard, hangtag, custom.
  • Query: start_date (string Y-m-d, optional) — the earliest created_at to include; swapped with end_date when the two are reversed.
  • Query: end_date (string Y-m-d, optional) — the latest created_at to include.
  • Query: search_field (string, optional) — one of name, description, template_type, created_at, updated_at, store_name, storeId, total_scans.
  • Query: search_value (string, optional) — LIKE value; for total_scans supports exact 5, range 5-10, gte 5+, lte 5-. Rejects angle brackets (NameNoAngleBrackets).
  • Query: search (string, optional, max 255) — fallback name LIKE search, used only when search_field/search_value absent.
  • Query: sort_field (string, optional) — same allowed list as search_field (plus id).
  • Query: sort_by (string, optional) — asc/ASC/desc/DESC; defaults to DESC. Default sort when you omit it is created_at DESC.
  • Query: per_page (integer, optional, 10–100, default 15; values below 10 are raised to 10).

Response

  • data.current_page (integer)
  • data.data[] (array) — template rows, each selecting id, name, description, template_type, store_id, created_at, updated_at, plus included store (id, name, storeId) and an injected total_scans (integer, non-deleted scan count).
  • data.per_page (integer)
  • data.total (integer)
  • last_page, from, to, links, etc. (standard paginator fields)

200 Success · 200

{
  "data": {
    "current_page": 1,
    "data": [
      {
        "id": 10,
        "name": "Standard A6",
        "description": "Front counter card",
        "template_type": "standard",
        "store_id": 8748,
        "unique_code": "t9X8y7z6",
        "created_at": "2026-06-15T10:30:00.000000Z",
        "updated_at": "2026-06-15T10:30:00.000000Z",
        "store": { "id": 8748, "name": "Downtown Branch", "storeId": "ST-8748" },
        "total_scans": 7
      }
    ],
    "per_page": 15,
    "total": 50,
    "last_page": 4
  }
}

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/template/list" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?