REST API, free tier without a card

Dynamic QR code API

Create a code, change where it points long after it was printed, and read the scans back. Three REST calls cover the whole lifecycle, and the plan ceiling is a number of active codes, not a price per code.

The whole lifecycle in three calls

Every snippet below is taken from the live API reference. Nothing here is a mockup.

1. Create

Creates the redirect row and returns its short id plus the public scan URL. Encode that URL, not your destination.

POST /api/v1/dynamic/
Authorization: Bearer <jwt>
Content-Type: application/json

{
  "name": "Spring 2026 menu",
  "destination_url": "https://example.com/menus/spring-2026"
}

2. Re-point

Changes where the printed code sends people. Effective on the next scan, with no change to the image.

PATCH /api/v1/dynamic/aBc12dEf/
Authorization: Bearer <jwt>
Content-Type: application/json

{
  "destination_url": "https://example.com/menus/summer-2026"
}

3. Measure

Returns the scan series for the window you ask for, built from the audit rows written on each redirect.

GET /api/v1/dynamic/aBc12dEf/analytics/?days=30
Authorization: Bearer <jwt>

Re-point after printing

One PATCH on the short id and every printed code sends people somewhere else on the next scan. The image never changes.

Every scan is an audit row

Scan counts, last scan timestamp and destination-change count come back on the resource itself, not from a separate tracker.

HMAC-signed scan webhooks

From the Pro plan, a scan can trigger your own systems instead of forcing you to poll analytics on a timer.

Flat plans, not per-code billing

The ceiling is a number of simultaneously active codes. Adding one under that ceiling changes nothing on the invoice.

Active dynamic codes per plan

The ceiling counts codes live at the same time, not codes created over the month. Deleting a code frees its slot.

PlanPrice / monthActive dynamic QRsWebhooks
Free$0 USD3No
Starter$9 USD10No
Boss$19 USD50No
Pro$29 USD200Yes
Agency$99 USD1,000Yes

What a dynamic QR code actually is

A static QR encodes your destination directly in the pattern. That is why it is free and why it is final: the URL is the image. A dynamic QR encodes a short redirect URL instead. Scanning hits that redirect, which answers with a 302 to whatever destination is set at that moment.

That indirection buys two things you cannot get from a static code. The first is the ability to re-point after printing, which turns a reprint into an API call. The second is measurement: because every scan passes through your redirect, each one can be recorded. A static code is invisible by construction, and no analytics product can fix that after the fact.

Keep the encoded URL short, on purpose

The public scan endpoint lives at the root of a dedicated short host rather than inside the versioned API. That is not cosmetic. A shorter encoded string means fewer modules, which means a less dense pattern, which means the printed code survives being small, smudged or read at an angle. Every character you add to the encoded URL costs readability at print size.

Pausing beats deleting

When a campaign ends, the reflex is to delete the code. Deleting turns every printed piece into a dead end and throws away the history. Pausing sends scanners to a clear “this code is paused” page, keeps the analytics, and is reversible. On material already in the field, that difference matters more than it sounds.

Why per-code billing gets expensive quietly

Plenty of vendors charge for each active dynamic code. On the first one it looks harmless. The bill grows with every campaign you leave online, which is exactly what an agency or a product team does over a year. Here the plan carries a ceiling of simultaneously active codes, so the invoice tracks the ceiling you chose, not the number of campaigns you happen to be running this month.

Scans do not move the price either: they are unlimited on every paid plan, and capped only on Free. A campaign that works costs the same as one that flops, which removes a perverse incentive from the pricing model.

Where to go next

If you need many codes at once rather than many changes over time, the bulk generator renders a batch in your browser for free, and the bulk endpoint automates the same job from your own systems. The full request and response schemas live in the dynamic QR reference, and the webhooks page covers signature verification.

Frequently asked questions

What makes a QR code dynamic?

A dynamic QR encodes a short, stable redirect URL instead of your destination. Scanning it hits that redirect, which returns a 302 to whatever destination is currently set. Because the printed pattern never changes, you can re-point the code after printing, and every scan leaves an audit row you can read back as analytics.

How do I change the destination after printing?

One PATCH call on the code's short id, with the new destination_url. The change takes effect on the next scan; the printed image is untouched. The API also tracks how many times a code's destination has been changed, which is useful when several people manage the same campaign.

Can I create and render a dynamic QR in a single call?

Yes. POST /api/v1/dynamic/ creates the database row only. To create the row and get the rendered image back in one round trip, call POST /api/v1/generate/ with data_type set to dynamic. Which one you want depends on whether you need the image immediately or only the redirect.

Does the API bill per QR code?

No. Plans carry a ceiling of simultaneously active dynamic codes, and staying under that ceiling costs the same whether you run three codes or three hundred. The Free plan includes 3 dynamic codes, Starter 10, Boss 50, Pro 200 and Agency 1,000. What varies with usage is the render quota, not the number of codes.

What happens to a scan when a code is paused?

The redirect returns a 'QR is paused' landing page instead of the destination, and the code keeps its analytics. Pausing is reversible and does not invalidate anything already printed, which makes it the safe way to take a campaign offline without burning the material.

Are there webhooks for scan events?

Yes, on the Pro plan and above, with HMAC-signed payloads so your endpoint can verify the sender. That is what lets a scan trigger something on your side, such as writing to a CRM or firing an internal notification, without polling the analytics endpoint on a timer.

Wire it up before you commit

The Free plan gives you 3 dynamic codes and a real API key, enough to build the integration end to end. No card, and you move up a plan only when the ceiling starts to pinch.