Your agent can draw a QR code. It can't keep one alive for five years.
A REST API for the hard part: dynamic codes on tilg.in that you can repoint after printing, with every destination safety-checked and every scan counted. Same account, quota and checks as the web builder.
The quota, honestly.
Dynamic: the default
Uses one slot of your plan's quota (Free includes 5). You can change where it points after printing, and it reports every scan. Use it whenever anyone will ask whether the code worked.
Static: unlimited
Free on every plan, no quota. Right for Wi-Fi credentials, vCards and content that never changes and is never measured. Honestly, a library can draw these too.
Create, measure, compare, act.
-
1. Get a token. Sign up, confirm your email, then create a token under Settings → API tokens.
-
2. Create a dynamic code. No type means dynamic. Send an Idempotency-Key so a retry never spends two slots.
curl -X POST https://myqrx.com/api/v1/codes \ -H "Authorization: Bearer $MYQRX_TOKEN" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/menu", "name": "Andheri store window"}' -
3. Download it for print. SVG, PNG, JPG or PDF.
curl "https://myqrx.com/api/v1/codes/$CODE_ID/image?format=svg" \ -H "Authorization: Bearer $MYQRX_TOKEN" -o code.svg -
4. Measure, then compare placements. Totals, unique share, change against the previous period, top countries and devices, peak hour.
curl "https://myqrx.com/api/v1/analytics/compare?codes[]=$STORE_A&codes[]=$STORE_B&from=2026-11-01&to=2026-11-30" \ -H "Authorization: Bearer $MYQRX_TOKEN" -
5. Act. Repoint the weaker code without reprinting. The new address is safety-checked; scans see a notice until it clears.
curl -X PATCH https://myqrx.com/api/v1/codes/$STORE_B \ -H "Authorization: Bearer $MYQRX_TOKEN" \ -H "Content-Type: application/json" \ -d '{"destination": "https://example.com/better-offer"}'
Or let your agent call it directly.
The same calls as tools in Claude Code, Cursor, VS Code, Claude Desktop and Windsurf, signed in with the same token. In Claude Code:
claude mcp add --transport http myqrx https://myqrx.com/mcp --header "Authorization: Bearer $MYQRX_TOKEN"
Everything under /api/v1.
| Call | Does | Token ability |
|---|---|---|
| POST /codes | Create a code. Dynamic by default; set type for static. | codes:write |
| GET /codes | List your codes, 50 a page. ?kind=dynamic|static | codes:read |
| GET /codes/{id} | One code, with its destination and safety verdict. | codes:read |
| PATCH /codes/{id} | Rename it, or change a dynamic code's destination. | codes:write |
| GET /codes/{id}/image | SVG, PNG, JPG or PDF, with the saved design. | codes:read |
| GET /codes/{id}/analytics | Decision-ready scan summary for a date range. | analytics:read |
| GET /analytics/compare | 2–10 codes ranked side by side. | analytics:read |
| POST /url-safety-checks | The verdict we give every destination, for any URL. | any |
What each plan gets.
| Plan | Requests / min / token | URL safety checks / day |
|---|---|---|
| Free | 60 | 10 |
| Pro | 120 | 100 |
| Pro Max | 300 | 400 |
| Enterprise | 600 | 2,000 |
Creating codes is limited to 20 a minute on every plan, the same as the web builder. Each account can hold 3 tokens. Need more tokens or safety checks? Request a higher limit from Settings. Every response carries X-RateLimit-Remaining and X-Quota-Remaining (dynamic code slots left).
Written to be read by a program.
{"error": {"code": "quota_exceeded", "message": "You have used all 5 codes on your plan…",
"hint": "Static codes are unlimited and need no slot…", "docs_url": "https://myqrx.com/qr-code-api#errors"}}
| 401 | unauthenticated | Missing, unknown or revoked token. |
|---|---|---|
| 402 | quota_exceeded | No dynamic slots left. Static codes still work; upgrade or buy a code pack for more. |
| 403 | missing_ability | The token lacks the ability this call needs. |
| 403 | account_not_activated | Confirm the account's email address first. |
| 404 | not_found | No such code in this account. |
| 409 | edit_refused | This code cannot be changed right now; the message says why. |
| 422 | validation_failed | Fix the fields in error.fields. |
| 422 | not_dynamic | Static codes cannot change destination. |
| 422 | idempotency_key_reused | Same Idempotency-Key, different body. |
| 429 | rate_limited | Wait for Retry-After seconds. |
| 429 | daily_limit_reached | Today's URL safety checks are used up. |
Building with an AI agent? Why agents should use MyQRx · What it does for marketers
Questions about the API.
Is there a free QR code API?
Yes. Every plan includes the API, Free too: 5 dynamic codes and unlimited static codes, with a token you create after signing up and confirming your email.
Does a static QR code use my quota?
No. Static codes are unlimited on every plan. Only dynamic codes use a quota slot, because they keep a redirect running for you and report scans back.
Are API-created codes checked for phishing?
Yes, exactly like codes made on the website. Every destination is checked against phishing and malware lists when it is created and every time it changes, and scans see a safety notice until it clears.
Can I change a QR code destination through the API?
Yes, for dynamic codes: PATCH /api/v1/codes/{id} with a new destination. Printed copies follow the change.
What happens if my agent retries a create?
Send an Idempotency-Key header. A retry with the same key within 24 hours returns the first response and creates nothing new.