QR codes
List the saved QR codes of an organization, read and compare their scan statistics, point a printed code at another survey, switch it off or delete it.
Die Entwickler-Dokumentation gibt es nur auf Englisch, wie die API selbst.
A saved QR code is the printed code people scan: it has a short link of its own, counts its scans and can be pointed
at another survey later without reprinting. Reading needs a key with qr:read; creating, changing and deleting needs
qr:write. Distributing a survey shows how to create one with
POST /v1/surveys/{id}/qr-codes; the MCP tool is create_qr_code. GET /v1/surveys/{id}/qr only renders an image
of a survey's link and saves nothing. The shell variables SF_API and SF_KEY are set up as in the
Quickstart.
List the codes
curl "$SF_API/v1/qr-codes?surveyId=$SURVEY_ID" \
-H "Authorization: Bearer $SF_KEY"Filter with venueId or surveyId, page with limit and offset as on every list. Each row looks like this:
{
"id": "6f0c2d1e-…",
"slug": "front-desk",
"name": "Front desk",
"type": "survey",
"surveyId": "a41b9c70-…",
"venueId": "0e7d55f2-…",
"active": true,
"publicUrl": "https://simplefeedback.de/q/front-desk",
"scanCount": 312,
"lastScannedAt": "2026-10-13T16:02:11.000Z",
"createdAt": "2026-09-01T08:30:00.000Z"
}type is survey for a code that opens a survey, or redirect or menu for codes made in the dashboard that lead
somewhere else; those have surveyId: null. GET /v1/qr-codes/{id}?includeImage=true returns one code with the
PNG as a data URL in qrDataUrl.
Read the scans
curl "$SF_API/v1/qr-codes/$QR_ID/stats?periodDays=30" \
-H "Authorization: Bearer $SF_KEY"periodDays is 7 (the default), 30 or 90 whole days on the Europe/Berlin calendar, today included. The answer gives
the scans and unique devices of that period next to the period before, the scans per day and per platform (ios, android, desktop, other), and for survey codes
how many scans ended in a submitted response, as survey.completed and survey.completionRate.
Compare all codes
curl "$SF_API/v1/qr-codes/stats?periodDays=30&type=survey" \
-H "Authorization: Bearer $SF_KEY"One call covers every code the key can see, for questions like "which code brings the most responses" or "which
codes stopped being scanned". periodDays is 7, 30 (the default) or 90; narrow with venueId or type. Dates and
hours are on the Europe/Berlin calendar. The answer has:
- the totals of the period next to the period before:
scans,uniqueDevices(distinct devices per day, added up) andconversionRate, the share of survey-code scans that ended in a response to that code's survey (0 to 1,nullwithout survey scans) codes, one row per code, most scanned first, with its ownscans,scansPreviousPeriodandconversionRatedailyscans,scansByWeekdayAndHour([weekday][hour], Monday is 0),devicesandtopCitieshints, at most one per kind:dormant(scanned before, not in this period),rising(the largest growth) andlowConversion(a survey code answered far less often than the others)
The comparison needs a plan with graphical statistics; on other plans it answers 403 FEATURE_NOT_IN_TIER. The MCP
tool is get_qr_codes_stats.
Point a printed code at another survey
curl -X PATCH "$SF_API/v1/qr-codes/$QR_ID" \
-H "Authorization: Bearer $SF_KEY" \
-H "Content-Type: application/json" \
-d '{"surveyId": "'"$NEW_SURVEY_ID"'"}'From the next scan on, the code opens the new survey. Its slug, short link and scan history stay, so the printed
copies keep working. Only the fields you send change: name renames it, active: false switches it off and
active: true switches it back on. A redirect or menu code refuses surveyId with
400 QR_CODE_NOT_A_SURVEY_CODE.
Delete a code
curl -X DELETE "$SF_API/v1/qr-codes/$QR_ID" \
-H "Authorization: Bearer $SF_KEY"It answers 204. The code and its scan statistics are gone for good and printed copies stop working. To take a code
out of use and keep its history, send PATCH with active: false instead.