Registration-to-Ticket Images with QR

An event ticket generator API turns one registration JSON into one image. Name, tier, and seat go on named text layers. Drop a Code layer (format qrcode) on the template; the renderer draws the QR from the payload you send in layers.<name>.text. The confirmation email needs a PNG; use format pdf only if the door wants a print file.

Registration webhook

  1. Attendee submits (your app, Eventbrite export, whatever).
  2. Your backend POSTs /api/v1/render with layers and a stable id.
  3. Wait or webhook; attach assetUrl to the mail.
  4. Door app scans the QR the Code layer drew.

Do not invent a 500-person “instant” story that is one HTTP call. 500 attendees is 10 batches if you pre-render, or 500 single waits if they trickle in.

Make the QR payload tamper-evident

A QR that holds a bare order id is a guessable door key. Sign it: take the order id, append an HMAC over it with a server-side secret, and send the pair as the Code layer text. The door app verifies the signature with the same secret and can do it offline, which matters when venue wifi dies.

Use an unguessable id in the first place — RFC 9562 UUID v4 or v7, not an incrementing integer that tells the holder how many tickets you sold and lets them try the next one. Keep names, emails, and phone numbers out of the payload; the QR ends up screenshotted into group chats.

Resends, upgrades, and seat changes

Tickets change after they are emailed. Re-render with the same stable item id, store the new asset URL, and send it. Do not try to invalidate the old image — the old file is already in someone’s camera roll. Revocation belongs at the scanner, where the signature check can reject a superseded id, not in the image.

For volume, the pattern is the same as every other batch: 50 jobs per request to POST /api/v1/renders/batch, keyed by attendee id, retry the failures. The batch generation guide covers pacing and webhook handling, and the certificate walkthrough is the same per-person pipeline with a different plate.

Related

FAQ

How fast is a ticket after registration?

POST /api/v1/render?wait=60 blocks until done (max 120s). For burst check-in lists, enqueue without wait and deliver on webhook.

QR uniqueness?

You generate the payload (order id + signature) and send it as text on the named Code layer. jsontoimg draws the QR. If two attendees share a payload, that is an app bug, not a renderer bug.

VIP vs GA layouts?

Two templates, or one template with a badge layer and a color override. Pin versions so a VIP restyle does not rewrite already-emailed GA tickets.

Get 25 free images →