How do I get started with the QRCodeStack API?
Updated September 14, 2026 · 3 min read · Pro and Business
The REST API lives at https://qrcodestack.com/api/v1 and is available on the Pro and Business plans. Create a key in the dashboard under Settings → Developer settings → API, send it as Authorization: Bearer qrs_<your key>, and call GET /me to confirm it works. From there you can create dynamic QR codes, fetch their images, manage short links and read scan analytics. Every response is JSON wrapped in a { "success": true, "data": … } envelope.
Step 1: create an API key
- Open the dashboard and go to Settings → Developer settings → API.
- Click New key and give it a name you will recognise later, such as the system that will use it.
- Tick the scopes it needs.
qr:read,qr:writeandanalytics:readare pre-ticked; addlinks:readandlinks:writeif the key will touch short links. - Click Create key and copy the key immediately.
The key is shown once. We store only a hash, so if you lose it you have to revoke it and make a new one. Scopes cannot be edited after creation either — see how keys, scopes and rate limits work.
Step 2: make your first call
curl https://qrcodestack.com/api/v1/me \
-H "Authorization: Bearer qrs_YOUR_KEY"The response tells you which account the key belongs to, its plan, how many dynamic QR codes are in use against the plan limit, and how many API calls the key has made this month. If this call works, everything else is a matter of the right scope.
Step 3: create a dynamic QR code
curl -X POST https://qrcodestack.com/api/v1/qr-codes \
-H "Authorization: Bearer qrs_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Spring promo",
"type": "url",
"destination_url": "https://shop.example.com/spring",
"render_customizations": {
"dot_color": "#0F172A",
"dot_shape": "rounded"
}
}'You get back the code's id, its scan_url (the redirect the pattern encodes), an image_url, and the destination. Every code the API creates is dynamic — the pattern encodes the redirect, never the destination itself, which is why you can change the destination later with PATCH /qr-codes/{id} without reprinting. The API cannot create static codes.
Step 4: fetch the image
curl https://qrcodestack.com/api/v1/qr-codes/{id}/image \
-H "Authorization: Bearer qrs_YOUR_KEY" \
-o spring-promo.pngThat returns a 512-pixel PNG in your dot and background colours. It needs the same Authorization header, so the URL will not work as an <img src> in a browser or an email — fetch it once and store the file yourself.
The API image is a plain render. Logos, frames and dot shapes are saved on the code, but to download the fully styled file, or an SVG or print-ready PDF, use the dashboard.
Read analytics, and what the limits are
GET /qr-codes/{id}/analytics returns aggregated scan data, and GET /qr-codes/{id}/scans returns the individual scan log. The log shows engaged traffic by default; add ?traffic=all to include bots and link previews. Lists are cursor-paginated, 25 items by default and 100 at most.
| Plan | Per minute | Per month | Bulk endpoint |
|---|---|---|---|
| Starter | No API access | — | No |
| Pro | 60 | 5,000 | No |
| Business | 600 | 100,000 | Yes |
The full endpoint reference, including short links and custom domains, is at /api-docs.
Common problems
401 — API key required
The header is missing or malformed. It must read exactly Authorization: Bearer qrs_…, with the full key, not the 8-character prefix shown in the dashboard list.
403 — API access requires a Pro or Business plan
The key is valid but the account is on a trial, Starter, or has no active plan. The API is Pro and Business only.
403 — API key is missing required scope
The response names the scope it wanted. Scopes are fixed at creation, so revoke the key and create a new one with the right boxes ticked.
422 — Request validation failed
The response lists the offending fields. The usual causes are a destination_url without https:// and a missing type.
429 — Rate limit exceeded
Either the per-minute window or the monthly quota. The per-minute one clears within the minute; the monthly one resets at the start of the next month.
Frequently asked questions
Which plans include the API?
Pro and Business. Starter and trial accounts get a 403 with the code PLAN_NOT_ALLOWED on every endpoint.
Can the API create static QR codes?
No. Every code created through the API is dynamic, so it can be repointed and its scans are counted. Create static codes in the dashboard.
How do I bulk-create codes?
POST /api/v1/qr-codes/bulk takes up to 500 items in one call and is Business-only. It is the only way to bulk-create today — see the article on bulk QR codes.
Where is the full endpoint reference?
At /api-docs, which renders the OpenAPI specification with request and response schemas for every endpoint.
Can I use the API from a chat assistant instead?
Yes — the MCP connector gives Claude, ChatGPT and Cursor the same abilities without writing code.
Related articles
How do API keys, scopes, IP allowlists and rate limits work?
Create up to five keys under Settings → Developer settings → API. Pick scopes, optionally lock the key to IP ranges, and copy it once. Revoking is instant.
Can I create QR codes in bulk?
Not in the dashboard yet — the Bulk Create page says Coming Soon. Bulk works today through the API on the Business plan: up to 500 codes per request.
How do I replace the Google Charts QR code API?
The Charts image API is deprecated. Create the code once with POST /api/v1/qr-codes, then fetch GET /qr-codes/{id}/image with your key and store the file.
How do I export scan data to CSV?
Click Export CSV on the Analytics page for account totals, or on a code's page for a row per scan. It covers the date range on screen, up to 365 days.
How do I connect Claude, ChatGPT or Cursor to QRCodeStack?
Add https://qrcodestack.com/mcp as a custom connector and authorize it. The assistant can then create, repoint and report on your codes and links.
Still stuck?
Email support@qrcodestack.com with the email on your account and, if it is about one code, its name or short link. A person replies within one business day, usually sooner.