List QR codes
Overview
Get an account's QR codes with scan counts.
Use this to manage codes or pick one to print.
You'll need an account token.
Returns one entry per code, newest first unless you sort, 15 to a page by default.
Prerequisites
- A bearer token for the account. See Authentication.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
GET /api/v1/qr-codes
Authentication
Account token
- Lists only the codes of the account of the user behind the token.
store_id, when sent, must be a location inside your own account tree; otherwise422.
QR codes belong to the account that created them, and every QR endpoint matches on that account exactly; it doesn't walk the partner tree. A Partner token sees nothing, even for a location inside the partner's own tree: list endpoints return an empty result, and single-record endpoints return
404 QR code not found. The 404 means "not visible to this token", not "this QR code doesn't exist". Use an Account token for every endpoint in this section.
Rate limit
This endpoint has no rate limit.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
store_id | query | integer | No | Only this location's codes. Must be inside your account tree. |
destination_type | query | string | No | Only codes with this destination: landing_page, review_site or custom_url. |
exclude_destination_type | query | string | No | Leave out codes with this destination. |
start_date | query | string | No | Only codes created on or after this day (YYYY-MM-DD). Swapped with end_date when the two are reversed. |
end_date | query | string | No | Only codes created on or before this day (YYYY-MM-DD). |
search_field | query | string | No | The field to search with search_value: name, destination_type, landing_page_id, review_site_id, destination_url, created_at, updated_at, last_scanned_at, store_name, storeId, total_scans. |
search_value | query | string | No | What to search for in search_field, up to 255 characters (matches part of the value). For total_scans: 5 (exactly), 5-10 (range), 5+ (at least) or 5- (at most). |
search | query | string | No | Search the code's name, up to 255 characters. Used only when search_field and search_value aren't sent. |
sort_field | query | string | No | The field to sort by: id or any search_field value. Defaults to created_at. |
sort_by | query | string | No | Sort direction: asc or desc. Defaults to desc. |
per_page | query | integer | No | Codes per page, 10 to 100 (below 10 is raised to 10; above 100 returns 422). Defaults to 15. |
page | query | integer | No | Page number. Defaults to 1. |
Request body
None.
Request payload
None.
Response body
The payload is inside data: a page of results.
| Field | Type | Description |
|---|---|---|
data | array of objects | The QR codes on this page. |
data[].id | integer | The QR code's id. Use it as qrCodeId. |
data[].name | string | The code's name. |
data[].destination_type | string | Where a scan goes: landing_page (a landing page template), review_site (the location's landing page URL on a review site) or custom_url (any URL). |
data[].store_id | integer | The location the code is for. |
data[].landing_page_id | integer or null | The landing page template, for landing_page. |
data[].review_site_id | integer or null | The review site, for review_site. |
data[].destination_url | string or null | The URL a scan opens. |
data[].customization | object or null | How the image looks: color (a hex colour such as #000000, a colour name, or [r, g, b]) and width (pixels, 64 to 2048; 300 when left out). |
data[].last_scanned_at | string or null | When the code was last scanned (ISO 8601), or null. |
data[].created_at | string | When the code was created (ISO 8601). |
data[].updated_at | string | When the code was last changed (ISO 8601). |
data[].qr_code_image_path | string | Where the image is stored. |
data[].total_scans | integer | How many times the code has been scanned. |
data[].unique_code | string | The code's public id, used in the link the image encodes. |
data[].qr_code_image_url | string or null | URL of the QR code image (PNG). |
data[].store | object or null | The location. |
data[].store.id | integer | The location's id. |
data[].store.name | string | The location's name. |
data[].store.storeId | string | The location's own reference (storeId). |
data[].landing_page | object or null | The landing page template, or null. |
data[].landing_page.id | integer | The template's id. |
data[].landing_page.unique_code | string | The template's encoded id. |
data[].review_site | object or null | The review site ({"id": …}), or null. |
current_page | integer | This page number. |
first_page_url | string | Link to the first page. |
from | integer or null | Position of the first item on this page, or null when empty. |
last_page | integer | The last page number. |
last_page_url | string | Link to the last page. |
links | array of objects | Page links, for building a pager. |
links[].url | string or null | The page's link, or null. |
links[].label | string | Link text. |
links[].page | integer or null | Page number, or null. |
links[].active | boolean | Whether this is the current page. |
next_page_url | string or null | Link to the next page, or null. |
path | string | The list URL without the query. |
per_page | integer | Items per page. |
prev_page_url | string or null | Link to the previous page, or null. |
to | integer or null | Position of the last item on this page, or null when empty. |
total | integer | Items in all pages. |
Response payload
{
"data": {
"current_page": 1,
"data": [
{
"id": 2963,
"name": "Default QR Code",
"destination_type": "landing_page",
"store_id": 3007,
"landing_page_id": 1,
"review_site_id": null,
"destination_url": "https://production.shoutaboutus.com/lp/1?store_id=3007",
"customization": {
"color": "#000000",
"width": 240
},
"last_scanned_at": null,
"created_at": "2026-09-23T10:43:44.000000Z",
"updated_at": "2026-09-23T10:43:45.000000Z",
"qr_code_image_path": "qr_codes/qr_2963_1790160225.png",
"total_scans": 0,
"unique_code": "g7qkum",
"qr_code_image_url": "https://d2ny6zb7otrnhl.cloudfront.net/qr_codes/qr_2963_1790160225.png",
"store": {
"id": 3007,
"name": "Acme Coffee",
"storeId": "Sydney"
},
"landing_page": {
"id": 1,
"unique_code": "9ocy"
},
"review_site": null
},
{
"id": 2964,
"name": "Default QR Code",
"destination_type": "landing_page",
"store_id": 3008,
"landing_page_id": 1,
"review_site_id": null,
"destination_url": "https://production.shoutaboutus.com/lp/1?store_id=3008",
"customization": {
"color": "#000000",
"width": 240
},
"last_scanned_at": null,
"created_at": "2026-09-23T11:28:44.000000Z",
"updated_at": "2026-09-23T11:28:45.000000Z",
"qr_code_image_path": "qr_codes/qr_2964_1790162925.png",
"total_scans": 0,
"unique_code": "o43ou5",
"qr_code_image_url": "https://d2ny6zb7otrnhl.cloudfront.net/qr_codes/qr_2964_1790162925.png",
"store": {
"id": 3008,
"name": "Acme Coffee - Circular Quay",
"storeId": "Sydney"
},
"landing_page": {
"id": 1,
"unique_code": "9ocy"
},
"review_site": null
}
],
"first_page_url": "https://production-api.shoutaboutus.com/api/v1/qr-codes?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "https://production-api.shoutaboutus.com/api/v1/qr-codes?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://production-api.shoutaboutus.com/api/v1/qr-codes?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"next_page_url": null,
"path": "https://production-api.shoutaboutus.com/api/v1/qr-codes",
"per_page": 15,
"prev_page_url": null,
"to": 2,
"total": 2
}
}Examples
Success payload
See Response payload (without store_id, so both locations are listed).
No codes match, or the token is a Partner token:
{
"data": {
"current_page": 1,
"data": [],
"first_page_url": "https://production-api.shoutaboutus.com/api/v1/qr-codes?page=1",
"from": null,
"last_page": 1,
"last_page_url": "https://production-api.shoutaboutus.com/api/v1/qr-codes?page=1",
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://production-api.shoutaboutus.com/api/v1/qr-codes?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
],
"next_page_url": null,
"path": "https://production-api.shoutaboutus.com/api/v1/qr-codes",
"per_page": 15,
"prev_page_url": null,
"to": null,
"total": 0
}
}Error payload
422 Location outside your tree
{
"message": "The selected store id does not belong to your company hierarchy.",
"errors": {
"store_id": [
"The selected store id does not belong to your company hierarchy."
]
}
}422 Invalid filter
{
"message": "The start date field must match the format Y-m-d. (and 1 more error)",
"errors": {
"start_date": [
"The start date field must match the format Y-m-d."
],
"sort_field": [
"The selected sort field is invalid."
]
}
}422 per_page above 100
{
"message": "The per page field must not be greater than 100.",
"errors": {
"per_page": [
"The per page field must not be greater than 100."
]
}
}| Status | Meaning |
|---|---|
200 | A page of QR codes, or an empty page. |
401 | The token is missing, expired or invalid. |
422 | store_id is outside your tree, a filter or sort value is invalid, or per_page is above 100. |
500 | Unexpected server error. |
Example request
curl --request GET \
--url "https://production-api.shoutaboutus.com/api/v1/qr-codes?store_id=3007&per_page=15" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 17 days ago
