# QR codes in n8n, Zapier and Make

> In n8n, Zapier or Make, a plain HTTP request step against https://useqr.app/api/v1/qr?data=... is the whole integration — the API is keyless, so there is no credential to configure and workflows stay shareable as templates. Set the response to file for a PNG attachment, or add format=base64 when the platform prefers a string.

Source: https://useqr.app/docs/developers/qr-codes-in-n8n-zapier-and-make · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## The whole integration is one node

Every automation platform has an HTTP request step, and that step is all you need:

```
GET https://useqr.app/api/v1/qr?data={{payload}}&size=1024
```

No connector to install, and — the part that actually matters on these platforms —
**no credential to configure**. Credential setup is where automation recipes die:
a workflow that needs an API key cannot be shared as a template without every
recipient signing up somewhere first. A [keyless call](/docs/developers/free-qr-code-api-no-key)
makes the workflow self-contained: export it, share it, import it, it runs.

Platform-agnostic settings that cover n8n, Zapier and Make alike:

| Need | Setting |
|---|---|
| PNG as a file/attachment | set the HTTP step's response handling to *file/binary* |
| A string field instead | add `format=base64` (or `format=svg` for markup) |
| The image in an email body | skip the download — reference the URL in an `<img>` tag |
| Payload with `&`, spaces, `#` | URL-encode the variable before inserting it |

That third row is the quiet optimisation: because output is deterministic and
[cached immutably](/docs/developers/caching-and-cdn-strategy-for-qr-images), embedding
the URL directly is often better than moving bytes through the workflow at all.

## Recipes

**Form submission → QR → email attachment.** Trigger on the form, HTTP-get
`/api/v1/qr?data={{ticket_url}}&size=1024` as a file, attach to the confirmation
email. The classic for [event tickets](/qr-codes-on/event-tickets) and registrations.

**Spreadsheet row → typed code.** New row with an SSID and password → HTTP-get
`/api/v1/wifi?ssid={{ssid}}&password={{pass}}&security=WPA` → write the file to
Drive/S3. The typed endpoints handle
[escaping rules](/docs/troubleshooting/wifi-qr-special-characters-escaping) that
break hand-assembled payloads — same for [UPI](/upi-qr-code),
[vCard](/vcard-qr-code), [calendar](/calendar-qr-code) and the other typed builders.

**Sheet → codes in bulk.** Aggregate rows into a JSON array and POST once to
`/api/v1/qr/batch` with `"output": "url"` — up to **1,000 items** per call, and each
item comes back with a stable image URL to write into a results column. Per-item
failures return a `fix` without failing the batch, so one bad row does not kill the
run ([batch details](/docs/developers/bulk-qr-generation-at-scale)).

**Webhook → QR → chat.** Deploy pipeline or alert webhook → build a URL for the
relevant link → post `https://useqr.app/q/{{encoded}}.png` into the Slack/Teams
message. Chat clients render the image; phones in the room scan it.

**Inbound image → decode.** The reverse direction: an email attachment or uploaded
image → POST the bytes to `/api/v1/decode` → route on the decoded text. Useful for
returns and check-in flows ([decode details](/docs/developers/decode-a-qr-code-programmatically)).

## Failure handling

Two practical behaviours to build in. First, an empty variable: if `{{payload}}`
resolves to nothing the API returns a 400 — as `application/problem+json` with a
`fix` field, so the error your workflow logs actually says what to change. Add a
filter step so empty rows skip generation instead. Second, do not add a retry-limit
worry: the endpoint is an idempotent GET with no quota, so re-running a failed
workflow re-fetches identical bytes harmlessly.

One honest boundary: these workflows produce **static** codes. If the automation
requirement is "and then track how many people scanned it", that needs
[UTM parameters](/docs/how-to/how-to-add-utm-parameters-to-a-qr-code) on the
destination or a [dynamic QR platform](/vs/best-dynamic-qr-code-platforms) — the
image API cannot count scans, and neither can anyone else's.

## FAQ

### How do I generate a QR code in n8n?
Add an HTTP Request node with GET https://useqr.app/api/v1/qr?data={{your field}}&size=1024 and set the response format to file. No credential is needed, so the node works immediately and the workflow exports cleanly as a template.

### How do I attach a QR code to an email in Zapier?
Generate it in an HTTP/webhook action against the keyless API, output as a file, then map that file into the email step's attachment field. For inline display, reference the image URL directly in the email's HTML instead.

### Can Make generate QR codes without a paid app?
Yes — the generic HTTP module calling https://useqr.app/api/v1/qr does it with no app, no key and no per-call cost. Add format=base64 if a later module needs the image as a text field.

### How do I make QR codes for every row of a spreadsheet automatically?
Aggregate the rows and POST them as items to https://useqr.app/api/v1/qr/batch with output url — up to 1,000 per call. Write each returned URL back to its row; failed rows return their own error and fix without stopping the batch.

## Try it

- https://useqr.app/url
- https://useqr.app/wifi
- https://useqr.app/bulk
- https://useqr.app/email
