Create a QR code
Overview
Create a QR code for a location.
Use this when a location wants in-person review requests.
You'll need the store_id, a name and where the code points (destination_type); optionally customization for the image's colour and size.
The location's plan must include review solicitation (email or text); otherwise 400. With generate_for_sibling_stores, the same code is also created for your account's other locations whose plan includes it.
Returns the code, its image, and its unique id.
Prerequisites
- A bearer token for the account. See Authentication.
- A location id (
store_id) whose plan includes review solicitation.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/qr-codes
Authentication
Account token
store_idmust be a location inside your own account tree; otherwise422.- The code is saved under the account of the user behind the token.
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. A code created with a Partner token is saved under the partner, so the account's token can't see it.
Rate limit
This endpoint has no rate limit.
Request parameters
None.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | The code's name, up to 255 characters. Must be unique for the location. |
store_id | integer | Yes | The location the code is for. Must be inside your account tree. |
destination_type | string | Yes | 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). |
landing_page_id | integer | Conditional | Required when destination_type is landing_page. The landing page template (value in List landing page templates); must be one of your account's templates or a shared one. |
review_site_id | integer | Conditional | Required when destination_type is review_site. The review site (value in List supported review sites). |
destination_url | string | Conditional | Required when destination_type is custom_url. The URL a scan opens. |
customization | object | No | 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). |
generate_for_sibling_stores | boolean | No | Also create the same code for your account's other locations whose plan includes review solicitation. |
Request payload
{
"name": "Lobby",
"store_id": 3007,
"destination_type": "landing_page",
"landing_page_id": 4548,
"customization": {
"color": "#000000",
"width": 240
}
}Response body
The payload is inside data. There is no status field.
| Field | Type | Description |
|---|---|---|
data | object | The new QR code. |
data.id | integer | The QR code's id. Use it as qrCodeId. |
data.name | string | The code's name. |
data.company_id | integer | The account that owns the code. |
data.store_id | integer | The location the code is for. |
data.qr_code_image_path | string | Where the image is stored. |
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.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.created_at | string | When the code was created (ISO 8601). |
data.updated_at | string | When the code was last changed (ISO 8601). |
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.company | object | The owning account. |
data.company.id | integer | The account's id. |
data.company.name | string | The account's name. |
data.store | object or null | The location. |
data.store.id | integer | The location's id. |
data.store.name | string | The location's name. |
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. |
message | string | QR code created successfully |
Response payload
{
"data": {
"data": {
"name": "Lobby",
"store_id": 3007,
"company_id": 5994,
"destination_type": "landing_page",
"landing_page_id": 4548,
"review_site_id": null,
"customization": {
"color": "#000000",
"width": 240
},
"destination_url": "https://production.shoutaboutus.com/lp/4548?store_id=3007",
"updated_at": "2026-10-01T10:00:01.000000Z",
"created_at": "2026-10-01T10:00:00.000000Z",
"id": 3119,
"qr_code_image_path": "qr_codes/qr_3119_1790935201.png",
"unique_code": "k3vpxd",
"qr_code_image_url": "https://d2ny6zb7otrnhl.cloudfront.net/qr_codes/qr_3119_1790935201.png",
"company": {
"id": 5994,
"name": "Acme Coffee"
},
"store": {
"id": 3007,
"name": "Acme Coffee"
},
"landing_page": {
"id": 4548,
"unique_code": "89kri1"
},
"review_site": null
},
"message": "QR code created successfully"
}
}Examples
Success payload
See Response payload.
Error payload
400 Review solicitation not on the plan
{
"message": "Review Solicitation is not enabled for this store. Please enable it in your plan or contact support for assistance.",
"status": "error",
"errors": []
}422 Required fields missing
{
"message": "QR code name is required. (and 2 more errors)",
"errors": {
"name": [
"QR code name is required."
],
"store_id": [
"Store ID is required."
],
"destination_type": [
"Destination type is required."
]
}
}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 Landing page missing
{
"message": "Landing page ID is required.",
"errors": {
"landing_page_id": [
"Landing page ID is required."
]
}
}422 Name taken
{
"message": "The name has already been taken.",
"errors": {
"name": [
"The name has already been taken."
]
}
}| Status | Meaning |
|---|---|
201 | The QR code was created. |
400 | The location's plan doesn't include review solicitation. |
401 | The token is missing, expired or invalid. |
422 | A required field is missing or invalid, store_id is outside your tree, or the name is already used at the location. |
500 | Unexpected server error. |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/qr-codes" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"name": "Lobby", "store_id": 3007, "destination_type": "landing_page", "landing_page_id": 4548, "customization": {"color": "#000000", "width": 240}}'Updated 17 days ago
