What you can build with it
Create a code in one request
Send the destination and your own reference. The response contains the short link to encode and, with include=svg, the finished image.
curl -X POST "https://qrmaker.ai/api/v1/qrcodes?include=svg" \
-H "Authorization: Bearer $QR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"target_url": "https://shop.example.com/product/AB12CD",
"external_id": "AB12CD",
"name": "Product AB12CD",
"folder": "spring-campaign",
"style": { "dot_style": "fluid", "finder_shape": "smooth" }
}'
{
"success": true,
"data": {
"id": "hzu23X",
"external_id": "AB12CD",
"target_url": "https://shop.example.com/product/AB12CD",
"short_link": "https://qrmk.cc/hzu23X",
"status": "active",
"scan_count": 0,
"image_version": "a1b2c3d4e5f60718",
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1000 1000\" …>"
}
}
Encode the short_link, never your own URL: it is what makes the code editable and countable. Sending the same external_id again returns the same code, so a retry cannot create a duplicate.
Endpoints
POST /v1/qrcodes- Create a code (add
?include=svgto get the image too) POST /v1/qrcodes/batch- Create up to 100 codes in one request
GET /v1/qrcodes- List codes, with incremental sync by
updated_since PATCH /v1/qrcodes/{id}- Change the destination, name, folder, status or style
GET /v1/qrcodes/{id}/svg- The code as SVG, with ETag caching
GET /v1/qrcodes/{id}/analytics- Scans for one code over a date range
GET /v1/analytics/summary- Many codes in one call, grouped by code, folder or day
GET /v1/scans- New scan events since the last one you processed
GET /v1/scans/export- Scan events as a CSV file
GET /v1/usage- This month’s usage and quota
Runnable examples
Each file is a complete program. Set your token and run it.
- Shell:
quickstart.sh— create a code, save the SVG, change the destination, read the scans - Node.js:
node-quickstart.mjs— the same flow with retries and conflict handling, no packages - Python:
python-bulk-from-csv.py— turn a CSV of links into codes, 100 per request, one SVG per row - Google Sheets:
google-sheets.gs— create codes from spreadsheet rows and write the short links back - Interactive API docs
- OpenAPI 3 spec
- Postman collection
- Rules file for AI coding assistants
Limits and price
- Plan
- Business: $29 a month or $279 a year
- Free trial
- 14 days on the monthly plan for new customers. A card is required.
- Monthly quota
- 50,000 successful requests. Failed requests do not count.
- Rate limit
- 120 requests a minute per account
- Where it runs
- Server to server. Browser calls are blocked by CORS.
- Image format
- SVG only. Convert to PNG in your own system if you need it.
Details that save you trouble later
- Retry-safe creation. An
external_idis unique per account. The same ID with the same destination returns the existing code with a 200. - A POST never moves a printed code. The same ID with a different destination returns 409. Changing a destination is always an explicit PATCH, which goes through the same safety checks as the website.
- Stable error codes. Every error has a machine-readable
code. The English message is for people and may change. - Cache the image by version.
image_versionchanges only when the picture does, and it doubles as the ETag of the SVG endpoint. Changing a destination never changes it. - Read-only tokens. Give reporting systems a token that can only GET. If it leaks, nothing can be created, changed or deleted with it.
Frequently asked questions
Is there a free tier for the API?
No. The API is part of the Business plan. New customers can try the monthly plan free for 14 days; a card is required, and it renews at $29 a month unless you cancel.
Can I get PNG images?
The API returns SVG, which prints sharply at any size and works in an img tag. If you need PNG, convert the SVG in your own system. The integration guide shows how in Node, Python and the browser.
Can I call the API from a web page?
No. Cross-origin browser requests are blocked, so the token stays on your server. Call the API from your backend and pass the result to the page.
Do you support webhooks?
No. Instead, GET /v1/scans returns new scan events in order. Poll it every 30 to 60 seconds and store the cursor it returns. Empty responses do not count towards the quota.
What happens to my codes if I cancel?
They keep redirecting. API access stops when the plan ends, along with the other Business features.