Short link and QR code API
The Krealo QR REST API lets you create short links, list them, change their destination and fetch their QR code from your own tools. It is available on the Pro plan only, at US$5.99 a month plus taxes. You generate a personal token on your account page and send it in the Authorization header.
Endpoint reference
| GET | /domains | api.op.listDomains |
| GET | /me | The token’s account (email, plan) |
| GET | /links | List your links (folder, tag, state filters; cursor) |
| POST | /links | Create a link (url; optional slug, title and design, logo included) |
| POST | /links/bulk | Create up to 100 links, one result per item |
| GET | /links/{slug} | A link with its stats |
| PATCH | /links/{slug} | Change the destination, title, state or QR design (colours, styles, frame, logo) |
| DELETE | /links/{slug} | Archive the link (deleted 30 days later) |
| GET | /links/{slug}/stats | Stats for a period (366 days at most) |
| GET | /links/{slug}/qr | QR code as SVG or PNG, with its design |
| PUT | /design/default | Save a default design for new links (null clears it) |
| GET | /webhooks | List your webhooks |
| POST | /webhooks | Create a webhook (secret shown once) |
| DELETE | /webhooks/{id} | Delete a webhook |
OpenAPI 3.1 specification (for Postman, Insomnia or a client generator): /api/v1/openapi.json
No code
- Zapier: “New Link” and “New Scan” triggers, “Create Link” and “Change Destination” actions. Add the Krealo QR app to your Zapier
- Claude, ChatGPT and other assistants (MCP): add a custom connector with the address
https://krlo.ca/mcp - Integrations
Examples
curl -X POST https://krlo.ca/api/v1/links \
-H "Authorization: Bearer kqr_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: menu-2026" \
-d '{"url":"https://example.com/menu","slug":"menu"}'const r = await fetch('https://krlo.ca/api/v1/links', {
method: 'POST',
headers: { Authorization: 'Bearer kqr_…', 'Content-Type': 'application/json' },
body: JSON.stringify({ url: 'https://example.com/menu', slug: 'menu' }),
});
const lien = await r.json(); // { slug, short_url, … }import requests
r = requests.post("https://krlo.ca/api/v1/links",
headers={"Authorization": "Bearer kqr_…"},
json={"url": "https://example.com/menu", "slug": "menu"})
print(r.json()["short_url"])curl "https://krlo.ca/api/v1/links/menu/stats?from=2026-09-01&to=2026-09-30" -H "Authorization: Bearer kqr_…"curl -X PATCH https://krlo.ca/api/v1/links/menu -H "Authorization: Bearer kqr_…" -H "Content-Type: application/json" \
-d '{"design":{"color":"#1e3a8a","dots":"rounded","corners":"extra-rounded","logo_url":"https://example.com/logo.png","frame":{"style":"cinta","text":"Menu"}}}'curl "https://krlo.ca/api/v1/links/menu/qr?format=png&size=1024" -H "Authorization: Bearer kqr_…" -o menu.pngcurl -X POST https://krlo.ca/api/v1/webhooks -H "Authorization: Bearer kqr_…" -H "Content-Type: application/json" \
-d '{"url":"https://example.com/hooks/krealo","events":["link.scanned"]}'Error codes
| 400 | invalid_request | Invalid data or refused destination. |
| 401 | unauthorized | Token missing, invalid, revoked or expired. |
| 402 | pro_required | The Pro plan is required. |
| 403 | forbidden | Action refused on this account. |
| 403 | insufficient_scope | Read-only token: it can only read (GET). |
| 404 | not_found | This link does not exist or is not yours. |
| 409 | slug_taken | This slug is already taken. |
| 409 | idempotency_in_progress | Idempotency-Key already used: request in progress (409) or with different content (422). |
| 422 | idempotency_mismatch | Idempotency-Key already used: request in progress (409) or with different content (422). |
| 429 | rate_limited | More than 120 requests per minute: wait Retry-After seconds. |
| 503 | not_configured | Service temporarily unavailable. |
Authentication
The API is for Pro accounts only. Generate your personal token on your account page, then send it in the header Authorization: Bearer <token>. The base URL is https://qr.krealomedia.com/api/v1.
What the API can do
- Create a link, or up to 100 at once, with an Idempotency-Key header so you never create two.
- List your links, filtered by folder, tag or state, with cursor pagination.
- Change a link’s destination, title or state, and archive it.
- Read stats for a period: scans, unique visitors, countries and devices.
- Set the QR design when you create or update a link: colours, dot and corner styles, frame with text, and your logo from a public https address or in base64 (PNG, JPEG or WEBP, up to 2 MB).
- Download the QR code as SVG or PNG with its design: colours, dots, logo and frame.
- Receive signed webhooks when a link is created, updated, archived, blocked or scanned.
Rate limit
The limit is 120 requests per minute per account. Every response tells you where you stand with the X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers; beyond the limit, the 429 response says in Retry-After how many seconds to wait.
Accepted destinations
Only http and https addresses are accepted. Dangerous destinations, such as javascript: or data:, are blocked.
See also
Frequently asked questions
Who can use the API?
Pro plan accounts. The personal token is generated on the account page.
What is the request limit?
It is 120 requests per minute.
Can the QR code returned by the API have a logo?
Yes. The /links/{slug}/qr endpoint returns the QR code with the link’s saved design (colours, dot style, logo and frame), as SVG or as a PNG from 128 to 2048 pixels. The design is set in the app, or with the design field of POST /links and PATCH /links/{slug}, logo included.