Create QR code

Overview

Create a QR code for the authenticated account. Requires the store's active plan to have the review-solicitation feature enabled (review_solicitation_email or review_solicitation_sms, enabled = 1), else 400. Generates and stores the QR image on save. Optionally fan-out the same QR to every sibling store that also has the feature (generate_for_sibling_stores). Writes a QR_CODE_CREATED audit event.

Prerequisites

  • A bearer token in the Authorization header.

Base URL

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

Endpoint

POST /api/v1/qr-codes

Authentication

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

  • Bearer — account (account) role. store_id must sit inside your own account tree; the QR records the caller's company_id.

Rate limit

  • No rate limit.

Request body

FieldTypeRequiredDescription
namestringRequiredMax 255. Unique per store_id.
store_idintegerRequiredMust be an existing location + must belong to the auth company.
destination_typestringRequiredlanding_page, review_site or custom_url.
landing_page_idintegerOptionalRequired when destination_type = landing_page; Must be an existing landing-page template.
review_site_idintegerOptionalRequired when destination_type = review_site; Must be an existing review site.
destination_urlstringOptionalRequired when destination_type = custom_url.
customizationobjectOptionalQR styling payload.
generate_for_sibling_storesbooleanOptionalAlso create the QR for sibling stores whose plan carries the solicitation feature (checked by feature name; the enabled flag is not re-checked per sibling).
{
  "name": "Lobby",
  "store_id": 123,
  "destination_type": "landing_page",
  "landing_page_id": 1
}

How it works

  • 201 (createdResponse). Body is double-nested: { "data": { "data": {.QrCode }, "message": "QR code created successfully" } }. The model appends unique_code (hashid) and qr_code_image_url.
  • 400 solicitation feature not enabled · 422 validation.

Response

201 Created · 201

{
  "data": {
    "data": {
      "id": 124,
      "name": "Lobby",
      "company_id": 456,
      "store_id": 26,
      "qr_code_image_path": "uploads/qr/124.png",
      "destination_type": "landing_page",
      "landing_page_id": 1,
      "review_site_id": null,
      "destination_url": "https://development.shoutaboutus.com/lp/1?store_id=26",
      "last_scanned_at": null,
      "customization": null,
      "created_at": "2026-07-09T10:00:00.000000Z",
      "updated_at": "2026-07-09T10:00:00.000000Z",
      "unique_code": "a1B2c3d4",
      "qr_code_image_url": "https://s3.amazonaws.com/bucket/uploads/qr/124.png",
      "company": {
        "id": 456,
        "name": "Brand 1"
      },
      "store": {
        "id": 26,
        "name": "Demo Store"
      },
      "landing_page": {
        "id": 1
      },
      "review_site": null
    },
    "message": "QR code created successfully"
  }
}

400 Bad Request · 400

{
  "message": "Review Solicitation is not enabled for this store. Please enable it in your plan or contact support for assistance.",
  "status": "error",
  "errors": {}
}

422 Unprocessable Entity · 422

{
  "message": "QR code name is required.",
  "errors": {
    "name": [
      "QR code name is required."
    ]
  }
}

Errors

StatusMeaning
400Bad Request
401The bearer token is missing, expired or invalid
422Unprocessable Entity
500Unexpected 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": 123, "destination_type": "landing_page", "landing_page_id": 1}'

Did this page help you?