The QR Code Spot API
Create editable QR codes, change where they go, pause them and read their scans from your own software, a spreadsheet script or an automation tool. Included with the Pro and Scale plans.
What you can do
- Make editable codes in bulk, each with its own name, folder and your own reference.
- Change where a code goes, for example when a campaign or a menu changes. Printed codes keep working.
- Pause and resume codes, or delete them.
- Read scan counts by day, phone type, country and how people arrived.
The API follows exactly the same rules as your dashboard: the same plan limits, the same unsafe-link check, and codes made through the API show up in My codes like any other.
Plans
| Pro | Scale | |
|---|---|---|
| API access | ✓ | ✓ |
| API keys at a time | 5 | 20 |
| Editable codes | 300 | 1,000 |
| Scan stats | All time | All time |
If your plan changes to one without the API, your keys stop answering until it's back on Pro and Scale. Nothing is deleted, and every printed code keeps working (our guarantee). See all plans.
Keys
Make a key on the API keys page (signed in). Give it a name, like "Zapier", and choose Read and change codes or Read only. The key is shown once: copy it then. We only keep a scrambled copy that can check it.
Send it with every request in the Authorization header:
curl https://qrcodespot.com/api/v1/me \
-H "Authorization: Bearer qcs_live_YOUR_KEY"
Keep keys on servers and in tools like Zapier or Make, never in a web page or an app people download: anyone with a key can change your codes. The API doesn't answer browsers on other websites. If a key might have leaked, revoke it on the keys page and make a new one.
The code object
{
"id": "k7m2xq",
"label": "Spring menu",
"destination": "https://example.com/menu",
"short_url": "https://qrsx.net/k7m2xq",
"folder": "Bella Cafe",
"status": "active",
"locked": false,
"type": "link",
"external_id": "crm-1042",
"created_at": "2026-11-01T14:03:00Z",
"updated_at": "2026-11-01T14:03:00Z"
}
id: the code's short id, the part after the slash inshort_url. Putshort_urlin your QR code.status:active,paused(scans see a "paused for now" page) ordisabled(switched off by us after an abuse report).locked:truewhen your plan no longer covers changing this code. It keeps working; its destination can't change.type:link, orservicefor a table or room of QR Service Requests (read only here, with nodestination).external_id: your own reference, if you gave one.- Times are UTC, in ISO 8601.
Endpoints
Base address: https://qrcodespot.com/api/v1. Send and receive JSON.
| Request | Key access | What it does |
|---|---|---|
GET /me | Read | Your account, plan and usage. A good way to test a key. |
GET /codes | Read | Your codes, newest first, a page at a time. |
POST /codes | Change | Make an editable code. |
GET /codes/{id} | Read | One code. |
PATCH /codes/{id} | Change | Change its destination, name or folder. |
POST /codes/{id}/pause | Change | Pause it. |
POST /codes/{id}/resume | Change | Resume it. |
DELETE /codes/{id} | Change | Delete it. Its short link is never given to anyone else. |
GET /codes/{id}/stats | Read | Its scans. |
Make a code
curl https://qrcodespot.com/api/v1/codes \
-H "Authorization: Bearer qcs_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"destination": "https://example.com/menu", "label": "Spring menu", "folder": "Bella Cafe", "external_id": "crm-1042"}'
Answers 201 with the code object. Only destination is needed. Names are up to 60 characters and folders up to 40.
Retries are safe with external_id. Tools like Zapier retry when a request is slow. If a code with the same external_id already exists, you get that code back with 200 instead of a second one (or a 409 if its destination is different). Use any reference of yours up to 100 characters, like a row id.
List codes
curl "https://qrcodespot.com/api/v1/codes?limit=50" \
-H "Authorization: Bearer qcs_live_YOUR_KEY"
{ "data": [ { "id": "k7m2xq", ... } ], "has_more": true, "next_cursor": "eyJ0Ijo..." }
Add cursor= with next_cursor for the next page. Filters: limit (1 to 100, default 50), folder, status (active, paused, disabled) and created_after (a time, like 2026-11-01T00:00:00Z, for "new code" checks).
Change where a code goes
curl -X PATCH https://qrcodespot.com/api/v1/codes/k7m2xq \
-H "Authorization: Bearer qcs_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"destination": "https://example.com/summer-menu"}'
Send any of destination, label and folder (null clears a name or folder). The answer is the code object plus "counted_as_edit": only a new destination counts as a change, the same as in the dashboard, where changes from the API and the dashboard share one monthly allowance.
Scan stats
curl "https://qrcodespot.com/api/v1/codes/k7m2xq/stats?days=30" \
-H "Authorization: Bearer qcs_live_YOUR_KEY"
{
"id": "k7m2xq",
"window_days": 30,
"total": 1284,
"daily": [ { "date": "2026-10-03", "scans": 41 } ],
"by_method": { "qr": 1201, "button": 70, "hybrid": 13 },
"devices": [ { "label": "iPhone", "scans": 702 } ],
"countries": [ { "code": "US", "scans": 911 } ]
}
Leave out days for your plan's whole window (all time on Pro and Scale, with window_days as null), or ask for 1 to 90 days. The numbers match your dashboard; link-preview bots aren't counted. Stats are refreshed every 5 minutes.
Errors
Every error looks the same, with a type your code can check and a message for people:
{
"error": {
"type": "plan_limit",
"message": "Your Pro plan includes 300 editable codes (links and service-request locations together). You have 300.",
"upgrade_url": "https://qrcodespot.com/upgrade"
}
}
| Status | type | When |
|---|---|---|
| 400 | invalid_request | The JSON or a value isn't right |
| 400 | invalid_destination | Not a web address, or it points to another QR Code Spot code |
| 400 | unsafe_destination | The link is flagged as unsafe (phishing or malware) |
| 401 | invalid_key | The key is missing, wrong or revoked |
| 403 | insufficient_scope | A read-only key tried to change something |
| 403 | plan_required | The account's plan doesn't include the API |
| 403 | plan_limit | All the plan's editable codes are in use |
| 403 | edit_limit | The month's destination changes are used up |
| 403 | code_locked | The plan no longer covers changing this code |
| 404 | not_found | No such code in this account, or no such endpoint |
| 409 | service_code, code_disabled | This code can't be changed here |
| 409 | idempotency_conflict | That external_id is on a code with another destination |
| 429 | rate_limited | Too many requests: wait for Retry-After seconds |
| 500 | server_error | Our fault: try again, and quote the X-Request-Id header if you email us |
Limits
- 60 requests a minute per key, of which 30 can make changes, and 30 stats requests a minute.
- 200 new codes an hour per account.
- Your plan's editable codes and destination changes, the same as in the dashboard.
Need more? Email support@qrcodespot.com.
Zapier and Make
Ready-made Zapier and Make apps are on the way. Until then, both can call the API directly: use a "Webhooks" or "HTTP" step with your key in the Authorization header, and an external_id so retries never make extra codes.
Beta
The API is new. Version 1 won't change in ways that break your code; new fields may be added, so ignore ones you don't know. Tell us what you build, and what's missing: support@qrcodespot.com.
Questions
Is the API included in my plan?
It's included with Pro and Scale, at no extra cost. There's no charge per request.
Can I make the QR code image with the API?
Not yet. The API gives you each code's short link; put it in any QR code library, or download designed codes from your dashboard. The short link is all a printed code needs.
Do codes made with the API ever stop working?
No. They're ordinary editable codes, covered by the same guarantee: they keep working whatever your plan, with no scan limit.
Can I use the API for my clients?
Yes. Use folders and external_id to keep each client's codes apart. Every code stays in your account and counts towards your plan.
Start with a key
Make an API key on Pro and Scale, or see what each plan includes.