Edit a QR code
Overview
Change a code's name, design, or destination.
Use this to refresh a code without reprinting; the scan destination changes, the printed image doesn't.
You'll need the qr_code_id and the changes. Only the fields you send change.
The location's plan must include review solicitation (email or text); otherwise 400.
Returns the updated code.
Prerequisites
- A bearer token for the account. See Authentication.
- The QR code's id (
qrCodeId), from List QR codes.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
PUT /api/v1/qr-codes/{qrCodeId}
Authentication
Account token
- The QR code must have been created under your token's account; otherwise
404.
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 |
|---|---|---|---|---|
qrCodeId | path | integer | Yes | The QR code's id (id in List QR codes). Digits only. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | A new name, up to 255 characters. Must be unique for the location. |
destination_type | string | No | 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). |
Request payload
{
"name": "Front desk",
"destination_type": "custom_url",
"destination_url": "https://example.com/promo"
}Response body
The payload is inside data.
| Field | Type | Description |
|---|---|---|
status | string | success. |
data | object | The updated 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.last_scanned_at | string or null | When the code was last scanned (ISO 8601), or null. |
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.deleted_at | string or null | Always null here. |
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 updated successfully |
Response payload
{
"data": {
"status": "success",
"data": {
"id": 2963,
"name": "Front desk",
"company_id": 5994,
"store_id": 3007,
"qr_code_image_path": "qr_codes/qr_2963_1790935500.png",
"destination_type": "custom_url",
"landing_page_id": null,
"review_site_id": null,
"destination_url": "https://example.com/promo",
"last_scanned_at": null,
"customization": {
"color": "#000000",
"width": 240
},
"created_at": "2026-09-23T10:43:44.000000Z",
"updated_at": "2026-10-01T10:05:00.000000Z",
"deleted_at": null,
"unique_code": "g7qkum",
"qr_code_image_url": "https://d2ny6zb7otrnhl.cloudfront.net/qr_codes/qr_2963_1790935500.png",
"company": {
"id": 5994,
"name": "Acme Coffee"
},
"store": {
"id": 3007,
"name": "Acme Coffee"
},
"landing_page": null,
"review_site": null
},
"message": "QR code updated successfully"
}
}Examples
Success payload
See Response payload.
Error payload
400 No plan
{
"message": "Store plan not found.",
"status": "error",
"errors": []
}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": []
}404 Not found
{
"message": "QR code not found",
"status": "error",
"errors": []
}422 URL missing
{
"message": "Destination URL is required when destination type is custom_url.",
"errors": {
"destination_url": [
"Destination URL is required when destination type is custom_url."
]
}
}422 Invalid destination type
{
"message": "Destination type must be one of: landing_page, review_site, custom_url.",
"errors": {
"destination_type": [
"Destination type must be one of: landing_page, review_site, custom_url."
]
}
}| Status | Meaning |
|---|---|
200 | The QR code was updated. |
400 | The location has no active plan, or its plan doesn't include review solicitation. |
401 | The token is missing, expired or invalid. |
404 | QR code not found: the code wasn't created under your token's account, or has been deleted. |
422 | A field is invalid, or the field its destination_type needs is missing. |
500 | Unexpected server error. |
Example request
curl --request PUT \
--url "https://production-api.shoutaboutus.com/api/v1/qr-codes/2963" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"name": "Front desk", "destination_type": "custom_url", "destination_url": "https://example.com/promo"}'Updated 17 days ago
