BusinessPrintable displays
Business
Printable displays
Generate printable join QR displays.
Printable displays (Table tent, Counter stand, Door sticker, Wall poster) with a branch's join QR, drawn on the server as PNG or PDF. A file lives 24 hours.
Paths are relative to https://app.revisit.cards/v1/developer.
List the printable display designs
/displays/designsScopedisplays:read
Requires displays:read. The four designs the app's Displays screen draws: Table tent, Counter stand, Door sticker and Wall poster, each with its sheet size in millimetres, the placement tag its QR carries (?p=table, counter, door, poster), whether it has room for the reward line, and the preset words it starts with.
Returns 200
itemsobject[]Requireditems[].designenumRequired- One of
table-tent,counter-stand,door-sticker,wall-poster. items[].labelstringRequireditems[].blurbstringRequireditems[].placementstringRequireditems[].rewardbooleanRequireditems[].headlinestringRequireditems[].sublinestringRequireditems[].widthMmnumberRequireditems[].heightMmnumberRequired
curl "https://app.revisit.cards/v1/developer/displays/designs" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"items": [
{
"blurb": "Collect 10, get 1 free",
"design": "table-tent",
"headline": "Collect 10, get 1 free",
"heightMm": 297,
"label": "Morning menu",
"placement": "table",
"reward": false,
"subline": "Scan to join",
"widthMm": 210
}
]
},
"requestId": "fee17fd0-7682-40f2-93a9-dc141b98cc3a",
"success": true
}List the displays this application generated
/displaysScopedisplays:read
Requires displays:read. The newest 20 of this application and environment, limited to the branches and cards the key may use. Another application's, business's or environment's display is never listed.
Returns 200
itemsobject[]Requireditems[].displayIduuidRequireditems[].designenumRequired- One of
table-tent,counter-stand,door-sticker,wall-poster. items[].formatenumRequired- One of
png,pdf. items[].contentTypeenumRequired- One of
image/png,application/pdf. items[].statusenumRequired- One of
ready,expired. items[].downloadPathstring or nullRequired- Set only while the file can be downloaded.
items[].branchIduuidRequireditems[].programIduuidRequireditems[].placementstringRequired- The QR's
?p=tag. items[].dpiintegerRequireditems[].widthMmnumberRequireditems[].heightMmnumberRequireditems[].widthPxintegerRequireditems[].heightPxintegerRequireditems[].sizeBytesintegerRequired- Zero once the file is gone.
items[].createdAtdate-timeRequireditems[].expiresAtdate-timeRequired
curl "https://app.revisit.cards/v1/developer/displays" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"items": [
{
"branchId": "5eff65d7-d01c-4bd3-b26a-3d06b21fd005",
"contentType": "image/png",
"createdAt": "2026-11-03T08:41:12.000Z",
"design": "table-tent",
"displayId": "8f2189ec-e58a-427f-9844-4cd8d3a7c957",
"downloadPath": "/v1/developer/displays/download",
"dpi": 300,
"expiresAt": "2026-11-03T08:41:12.000Z",
"format": "png",
"heightMm": 297,
"heightPx": 3508,
"placement": "table",
"programId": "d7595bbd-4342-41b4-9037-2e61a9f8403f",
"sizeBytes": 48213,
"status": "ready",
"widthMm": 210,
"widthPx": 2480
}
]
},
"requestId": "94fb98b9-66e7-4e41-9ac0-7b961c952c3c",
"success": true
}Generate a printable display as a PNG or PDF
/displaysScopedisplays:write
Requires displays:write (in Full access, not in Read-only). Draws one of the app's display designs for a branch and card on the server and keeps the file for 24 hours. The art, preset words, reward line and join-link rules are the app's own: the QR holds the branch's public join link (with ?card= once the branch honours several cards) and the design's placement tag, so a sign-up is traced to where it was scanned. Without branchId and programId it is the default branch and the main card. The logo is only ever the business's own stored logo (nothing is fetched from a link), and the file holds no customer data. A PNG is 300 dpi by default (A4 is 2480 x 3508 pixels); dpi may be 72 to 300. A PDF is one page of exactly the sheet's size.
It is bounded work: the request counts as 8 units against the shared budget, at most two sheets are drawn at once per process and a drawing is abandoned after 15 seconds, answering 429 DISPLAY_BUSY (nothing was stored and the Idempotency-Key is free: retry with the same key). 429 DISPLAY_BACKLOG when the business already holds 20 ready displays. 422 DISPLAY_NO_LINK when the card has no active branch with a join link. A retried Idempotency-Key answers the first display (201 again with Idempotent-Replay: true) and never makes a second; the same key with other content is 409 OPERATION_KEY_CONFLICT. A test key draws the test workspace's own shop and join link.
Send an Idempotency-Key header. Safe to retry.
Body
designenumRequired- One of
table-tent,counter-stand,door-sticker,wall-poster. formatenumRequired- One of
png,pdf. branchIduuid- Another branch than the default; a key limited to branches must name one it may use.
programIduuid- Another card than the main one.
dpiinteger- 72 to 300. Default
300. headlinestring- Wrap words in
*stars*to highlight them. Default is the design's preset words. 1 to 80 characters. sublinestringlogoboolean- Draw the business's own stored logo; ignored when it has none. Never a link. Default
true. nameboolean- Default
true. rewardboolean- Ignored where the design (Door sticker) or the card has no reward line. Default
true.
Returns 201
displayIduuidRequireddesignenumRequired- One of
table-tent,counter-stand,door-sticker,wall-poster. formatenumRequired- One of
png,pdf. contentTypeenumRequired- One of
image/png,application/pdf. statusenumRequired- One of
ready,expired. downloadPathstring or nullRequired- Set only while the file can be downloaded.
branchIduuidRequiredprogramIduuidRequiredplacementstringRequired- The QR's
?p=tag. dpiintegerRequiredwidthMmnumberRequiredheightMmnumberRequiredwidthPxintegerRequiredheightPxintegerRequiredsizeBytesintegerRequired- Zero once the file is gone.
createdAtdate-timeRequiredexpiresAtdate-timeRequired
Errors
- 429
DISPLAY_BUSYthe generator is busy (too many displays being made, or this one took too long). Nothing was stored and the Idempotency-Key is free: retry after the delay. - 429
DISPLAY_BACKLOGthe business already holds the most ready displays it may; wait for one to expire. - 422
DISPLAY_NO_LINKthe card or branch has nothing to print (no active branch with a join link). - 409
OPERATION_KEY_CONFLICTthe same operation key arrived with different content. The key is still bound to the first request.
curl -X POST "https://app.revisit.cards/v1/developer/displays" \
-H "Authorization: Bearer $DEVELOPER_API_KEY" \
-H "Idempotency-Key: 5f0c2a8e-7b1d-4c3e-9a6f-0d4b8e2738e4" \
-H "Content-Type: application/json" \
-d '{
"design": "table-tent",
"format": "png"
}'{
"data": {
"branchId": "5eff65d7-d01c-4bd3-b26a-3d06b21fd005",
"contentType": "image/png",
"createdAt": "2026-11-03T08:41:12.000Z",
"design": "table-tent",
"displayId": "8f2189ec-e58a-427f-9844-4cd8d3a7c957",
"downloadPath": "/v1/developer/displays/download",
"dpi": 300,
"expiresAt": "2026-11-03T08:41:12.000Z",
"format": "png",
"heightMm": 297,
"heightPx": 3508,
"placement": "table",
"programId": "d7595bbd-4342-41b4-9037-2e61a9f8403f",
"sizeBytes": 48213,
"status": "ready",
"widthMm": 210,
"widthPx": 2480
},
"requestId": "3cf8a8d6-e0e7-425d-80fb-31909baf00d7",
"success": true
}Read one display's status
/displays/{displayId}Scopedisplays:read
Requires displays:read. status is ready (with a downloadPath) or expired once its day has passed (no path, sizeBytes 0). Another application's, business's or environment's id is 404.
Path
displayIduuidRequired
Returns 200
displayIduuidRequireddesignenumRequired- One of
table-tent,counter-stand,door-sticker,wall-poster. formatenumRequired- One of
png,pdf. contentTypeenumRequired- One of
image/png,application/pdf. statusenumRequired- One of
ready,expired. downloadPathstring or nullRequired- Set only while the file can be downloaded.
branchIduuidRequiredprogramIduuidRequiredplacementstringRequired- The QR's
?p=tag. dpiintegerRequiredwidthMmnumberRequiredheightMmnumberRequiredwidthPxintegerRequiredheightPxintegerRequiredsizeBytesintegerRequired- Zero once the file is gone.
createdAtdate-timeRequiredexpiresAtdate-timeRequired
curl "https://app.revisit.cards/v1/developer/displays/8f2189ec-e58a-427f-9844-4cd8d3a7c957" \
-H "Authorization: Bearer $DEVELOPER_API_KEY"{
"data": {
"branchId": "5eff65d7-d01c-4bd3-b26a-3d06b21fd005",
"contentType": "image/png",
"createdAt": "2026-11-03T08:41:12.000Z",
"design": "table-tent",
"displayId": "8f2189ec-e58a-427f-9844-4cd8d3a7c957",
"downloadPath": "/v1/developer/displays/download",
"dpi": 300,
"expiresAt": "2026-11-03T08:41:12.000Z",
"format": "png",
"heightMm": 297,
"heightPx": 3508,
"placement": "table",
"programId": "d7595bbd-4342-41b4-9037-2e61a9f8403f",
"sizeBytes": 48213,
"status": "ready",
"widthMm": 210,
"widthPx": 2480
},
"requestId": "0cd2125f-3081-4e77-8b37-75e31d4128e6",
"success": true
}Download the PNG or PDF
/displays/{displayId}/downloadScopedisplays:read
Requires displays:read. Sends the file (image/png or application/pdf, Content-Disposition: attachment, Cache-Control: private, no-store, X-Content-Type-Options: nosniff, and X-Display-Sha256 of the body). 410 DISPLAY_EXPIRED once the day has passed. Each download is audited.
Path
displayIduuidRequired
Answers with a file: image/png or application/pdf.
Errors
- 410
DISPLAY_EXPIREDthe display file is gone (its day passed). Generate a new one.
curl "https://app.revisit.cards/v1/developer/displays/8f2189ec-e58a-427f-9844-4cd8d3a7c957/download" \
-H "Authorization: Bearer $DEVELOPER_API_KEY" \
-o downloadHTTP/1.1 200
Content-Type: image/png or application/pdf
(file)