B2B API
Authentication
Every request needs a token in the Authorization header. Bearer is the
standard form; the legacy Token prefix is still accepted.
# preferred Authorization: Bearer YOUR_API_TOKEN # also accepted Authorization: Token YOUR_API_TOKEN
Get your token with GET /api/v1/token/ (authenticated with your normal
account credentials), or from the API tab in your dashboard. Rotating it with
POST /api/v1/token/ invalidates the previous key immediately.
Quickstart
BASE=https://app.makemyqrcode.com/api/v1 TOKEN=YOUR_API_TOKEN # 1. check plan, quota and usage curl -s -H "Authorization: Bearer $TOKEN" $BASE/ # 2. create one QR code curl -s -X POST "$BASE/qrcodes/" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"name":"Table 1","category":"website","value":"https://example.com/menu"}' # 3. re-point it after printing (dynamic codes only) curl -s -X PATCH "$BASE/qrcodes/42/" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"value":"https://example.com/new-menu"}'
Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/ | Plan, quota, usage and endpoint discovery |
| GET | /api/v1/token/ | Read your token |
| POST | /api/v1/token/ | Rotate your token |
| GET | /api/v1/qrcodes/ | List your QR codes |
| POST | /api/v1/qrcodes/ | Create one QR code |
| GET | /api/v1/qrcodes/{id}/ | Retrieve one |
| PATCH | /api/v1/qrcodes/{id}/ | Change the destination after printing |
| DELETE | /api/v1/qrcodes/{id}/ | Delete one |
| POST | /api/v1/bulk/ | Create up to 5,000 codes from JSON or CSV |
Create a QR code
POST /api/v1/qrcodes/
Content-Type: application/json
{
"name": "Menu - Table 1",
"category": "website",
"value": "https://example.com/menu",
"type": "qr"
}
category defaults to website, type to qr.
Optional: is_dynamic, is_protected, is_lead_capture, settings.
The response includes id, short_slug and short_url.
Change the destination after printing
PATCH /api/v1/qrcodes/{id}/
Content-Type: application/json
{ "value": "https://example.com/new-destination" }
The printed code never changes - only where it points. This works for dynamic codes; a static code stores its data inside the pattern and cannot be re-pointed.
Bulk create
JSON
POST /api/v1/bulk/
Content-Type: application/json
{
"codes": [
{ "name": "Table 1", "category": "website", "value": "https://example.com/1" },
{ "name": "Table 2", "category": "website", "value": "https://example.com/2" }
]
}
CSV
POST /api/v1/bulk/ Content-Type: multipart/form-data file=@codes.csv
name,value,category Table 1,https://example.com/1,website Table 2,https://example.com/2,website
{
"error": "Bulk creation failed. No codes were created.",
"created": 0,
"failed": 1,
"rows": [{ "row": 2, "error": { "value": ["This field may not be blank."] } }]
}
Quotas and rate limits
| Plan | Price | API calls / month | QR codes | Bulk per upload |
|---|---|---|---|---|
| Basic | Rs 99 | - | 50 | - |
| Pro | Rs 299 | 5,000 | 250 | 100 |
| Business | Rs 799 | 25,000 | 1,000 | 500 |
| Enterprise | Rs 2,499 | 100,000 | 20,000 | 1,000 |
Every successful call returns the remaining allowance:
X-RateLimit-Limit: 5000 X-RateLimit-Remaining: 4987 X-RateLimit-Rate: 120/min X-Quota-Period: 2026-10
Exceeding the per-minute rate returns 429 with a Retry-After
header. Exceeding the monthly quota returns 429 until the first day of the
next month.
Errors
| Status | Meaning |
|---|---|
| 401 | Missing or invalid token |
| 403 | Plan does not include API / bulk creation, or bulk_limit exceeded |
| 402 | Subscription inactive, or QR code limit reached |
| 400 | Validation failed (see rows for bulk) |
| 429 | Rate limit or monthly quota exceeded |
Notes
- Requests count against your monthly quota only when they pass the rate limiter.
- Token auth is per account; rotate the key if it is ever exposed.
is_dynamiccodes are the ones you can edit after printing.