Skip to content

QR code API

One GET renders a QR code with no key. A key saves dynamic codes you can re-point and count.

GET /api/qr

200 OK · …

The QR code this request returns, as SVG
curl -sS \
  'https://app.qrsalt.com/api/qr?type=url&url=https%3A%2F%2Fexample.com%2Fmenu' \
  -H "Authorization: Bearer $QRSALT_KEY" \
  -o qr.svg
Get a free API key

No card. It renders every code and barcode.

Free to render, paid for your account

The key you send decides what you can call. Two of the three levels cost nothing.

  1. No key

    No account

    GET /api/qr/free draws a code as SVG or PNG. POST /api/qr/decode reads one from an image.

    480 units an hour per caller

  2. Free key

    Free, no card

    GET /api/qr: 12 code types, SVG, PNG, JPG, WebP, PDF, up to 2,000 px. GET /api/barcode: 12 symbologies.

    60 requests a minute

  3. Starter key

    From $5 a month

    Everything above, plus your account: codes, short links, scans, domains and more.

    600 requests a minute

Paid plans also carry a monthly count: 500 API requests a month on Starter, 5,000 on Pro and 100,000 on Business, a fair-use ceiling. Rendering doesn’t count towards it.

Make a key in Dashboard → API. We show it once and keep only a hash.

What a paid key adds

Each needs a Starter key or higher. A plan name marks the ones that start higher.

Get an API key

Keys, webhooks and domains, on screen

One key per integration

Each key shows who made it and when it was last used. Revoke one and the others keep working.

The API screen listing a workspace’s keys - one for a label printer, one for a menu sync, one revoked - each with its prefix, when it was made and when it was last used.
API keys · a coffee company sample data

Every delivery, with your server’s answer

Each endpoint lists recent deliveries, attempts and results, and why it was switched off if it was.

A webhook endpoint that hears about every scan and code update, with its signing secret and its last five deliveries, each marked delivered with the response it got.
Webhooks · one endpoint sample data

The signature check, next to the secret

Copy the code that checks the x-qr-signature header straight into your handler.

A webhook endpoint with its signing secret hidden until revealed, and “Check that a message is from us” opened: pass the raw body, the x-qr-signature header and the secret to the Node.js code shown, which rejects anything older than five minutes.
Signing secret and the check code sample data

DNS records, checked for you

A domain added over the API, with its TXT and CNAME records and a button to check them again.

A verified custom domain, go.fieldhousecoffee.example, with the TXT and CNAME records to copy into DNS and a button to check them again.
A verified custom domain sample data

Docs and other ways in

Last reviewed , against the product as it works today.

QR code API questions

Does the API make static or dynamic QR codes?

Both. GET /api/qr returns a static image and stores nothing. POST /api/v1/codes saves a dynamic code you can re-point, or a static one if you send kind: "STATIC".

Can I upload a PDF through the API?

No. Upload the file in the dashboard, which checks it before the code exists. After that, the API can read, rename, pause, move or delete that code.

Is the rate limit per key or per workspace?

Per key, so a nightly import can’t slow down another integration. The monthly request count is per workspace and starts again at midnight UTC on the 1st.

How do I check that a webhook came from you?

Check the x-qr-signature header: an HMAC-SHA256 of the timestamp and the raw body, keyed with your endpoint’s secret. Refuse anything older than five minutes.

Build free, pay when you need the account

Choose by how many dynamic codes you need. The API costs nothing extra on any plan.

Free

$0/mo

Unlimited static codes. Three editable ones that never expire.

  • Short links on their own, no QR code needed
  • Up to 1 of the 3 can be a QR Menu
  • Add your logo to QR codes
  • Every shape, corner and frame

3dynamic codes

Starter

Recommended

$5/mo

For one business with codes out in the world.

  • 5 QR Menus
  • QR Forms
  • GS1 Digital Links we host, so a printed pack can be re-pointed
  • Advanced tracking and analytics

100dynamic codes

Pro

$15/mo

For agencies and teams running codes at scale.

  • 50 QR Menus
  • Unlimited analytics history
  • 10 custom domains
  • 5,000 API requests a month

600dynamic codes

Business

$39/mo

For organisations running codes across many brands.

  • 400 QR Menus
  • 50 custom domains
  • Up to 25 team members and team management
  • Up to 10 workspaces

2,000dynamic codes

Unlimited scans on every plan. Cancel online in two clicks. Compare every plan and feature

The rest of the toolbox

Open a row to see the screen and which plan has it.

Separate workspaces

One subscription, a workspace per brand or client.

Each has its own codes, team and analytics, so one client never sees another’s. Up to 10 on one subscription.

Business

The Workspaces panel in settings: how many of the plan’s workspaces are in use, what happens to all of them if the subscription ends, and a field to name and create another one.
Settings · workspaces sample data

Priority email support

Paid plans’ emails are answered first.

Messages from paid plans are answered before those from free accounts. That’s our order of work, not a reply-time promise.

Starter and up

The support page on a Business plan: a note that a person reads every message and this plan’s is answered before free accounts’, a form to write in, and the plan and workspace that are sent along with it.
Contact support · Business plan sample data

Your data, to take or delete

A full export any time, and deletion you can take back.

Codes, history, scans, form answers and uploads as one .zip. Deleting the account gives you 30 days to change your mind, and printed codes work until then.

Every plan, Free included

Account settings: a button to download everything the account holds, and a separate panel to delete the account, which can be undone for 30 days.
Settings · your data sample data