Duplicate a QR code

Overview

Copy a code's settings to a new code.

Use this to create a similar code for another location.

You'll need the qr_code_id. Send any field to change it on the copy; the rest is copied from the source. The copy gets its own id, image and unique code, and is named <source> (Copy) unless you send name.

Returns the new code.

Prerequisites

Base URL

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

Endpoint

POST /api/v1/qr-codes/{qrCodeId}/duplicate

Authentication

Account token

  • The source code must have been created under your token's account; otherwise 404. The copy belongs to the same account.
  • store_id, when sent, must be a location inside your own account tree; otherwise 422.
🚧

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

ParameterInTypeRequiredDescription
qrCodeIdpathintegerYesThe id of the QR code to copy (id in List QR codes). Digits only.

Request body

FieldTypeRequiredDescription
namestringNoName for the copy, up to 255 characters. Defaults to <source> (Copy).
store_idintegerNoA location for the copy. Must be inside your account tree. Defaults to the source's location.
destination_typestringNoWhere 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_idintegerConditionalRequired 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_idintegerConditionalRequired when destination_type is review_site. The review site (value in List supported review sites).
destination_urlstringConditionalRequired when destination_type is custom_url. The URL a scan opens.
customizationobjectNoHow 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 (Copy)",
  "store_id": 3008
}

Response body

The payload is inside data.

FieldTypeDescription
statusstringsuccess.
dataobjectThe new QR code.
data.idintegerThe QR code's id. Use it as qrCodeId.
data.namestringThe code's name.
data.company_idintegerThe account that owns the code.
data.store_idintegerThe location the code is for.
data.qr_code_image_pathstringWhere the image is stored.
data.destination_typestringWhere 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_idinteger or nullThe landing page template, for landing_page.
data.review_site_idinteger or nullThe review site, for review_site.
data.destination_urlstring or nullThe URL a scan opens.
data.customizationobject or nullHow 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_atstringWhen the code was created (ISO 8601).
data.updated_atstringWhen the code was last changed (ISO 8601).
data.unique_codestringThe code's public id, used in the link the image encodes.
data.qr_code_image_urlstring or nullURL of the QR code image (PNG).
data.companyobjectThe owning account.
data.company.idintegerThe account's id.
data.company.namestringThe account's name.
data.storeobject or nullThe location.
data.store.idintegerThe location's id.
data.store.namestringThe location's name.
data.landing_pageobject or nullThe landing page template, or null.
data.landing_page.idintegerThe template's id.
data.landing_page.unique_codestringThe template's encoded id.
data.review_siteobject or nullThe review site ({"id": …}), or null.
messagestringQR code duplicated successfully

Response payload

{
  "data": {
    "status": "success",
    "data": {
      "name": "Front desk (Copy)",
      "company_id": 5994,
      "store_id": 3008,
      "destination_type": "landing_page",
      "landing_page_id": 1,
      "review_site_id": null,
      "destination_url": "https://production.shoutaboutus.com/lp/1?store_id=3008",
      "customization": {
        "color": "#000000",
        "width": 240
      },
      "updated_at": "2026-10-01T10:10:01.000000Z",
      "created_at": "2026-10-01T10:10:00.000000Z",
      "id": 3120,
      "qr_code_image_path": "qr_codes/qr_3120_1790935801.png",
      "unique_code": "p8rwyk",
      "qr_code_image_url": "https://d2ny6zb7otrnhl.cloudfront.net/qr_codes/qr_3120_1790935801.png",
      "company": {
        "id": 5994,
        "name": "Acme Coffee"
      },
      "store": {
        "id": 3008,
        "name": "Acme Coffee - Circular Quay"
      },
      "landing_page": {
        "id": 1,
        "unique_code": "9ocy"
      },
      "review_site": null
    },
    "message": "QR code duplicated successfully"
  }
}

Examples

Success payload

See Response payload.

Error payload

404 Not found

{
  "message": "QR code not found",
  "status": "error",
  "errors": []
}

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 destination type

{
  "message": "The selected destination type is invalid.",
  "errors": {
    "destination_type": [
      "The selected destination type is invalid."
    ]
  }
}
StatusMeaning
201The copy was created.
401The token is missing, expired or invalid.
404QR code not found: the source wasn't created under your token's account, or has been deleted.
422A field is invalid, or store_id is outside your tree.
500Unexpected server error.

Example request

curl --request POST \
  --url "https://production-api.shoutaboutus.com/api/v1/qr-codes/2963/duplicate" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"name": "Front desk (Copy)", "store_id": 3008}'

Did this page help you?