Developers
The QuickQReate API lets your own scripts and apps create codes, change where dynamic codes point, and read their scan analytics. Like everything else here, it’s free.
Authentication
Create a key under Account → API keys. It’s shown once, so store it somewhere safe, like your app’s secret settings. Send it with every request:
Authorization: Bearer qq_your_key_hereA key acts as you, on the codes in your own account. Keep keys on servers: anyone with a key can change your codes. You can revoke a key at any time.
Basics
- Base URL:
https://qr.techitdave.com/api/v1 - Requests and responses are JSON. Dates are ISO 8601, like 2026-10-13T09:00:00Z.
- Each key can make 120 requests a minute.
- Successful responses wrap their result in
data. Errors look like this:
{ "error": { "code": "invalid_request", "message": "destination must be an http(s) URL", "details": { … } } }| Status | code | Meaning |
|---|---|---|
| 400 | invalid_request | A field is missing or not valid. details says which. |
| 401 | unauthorized | The key is missing, mistyped or revoked. |
| 404 | not_found | There's no code with that id in your account. |
| 409 | slug_taken | Someone already uses that link ending. |
| 429 | rate_limited | More than 120 requests in a minute with one key. |
| 503 | unavailable | Something went wrong on our side. Try again shortly. |
Quick start
Create a dynamic code that points at your website, then change it later:
curl -X POST https://qr.techitdave.com/api/v1/codes \
-H "Authorization: Bearer $QQ_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "url", "dynamic": true, "name": "Spring flyer", "destination": "https://example.com/spring" }'The response includes the code’s id, its short_link and the payload to put in a QR code. Get a ready-made image from the image endpoint, or use any QR library with the payload.
curl -X PATCH https://qr.techitdave.com/api/v1/codes/CODE_ID \
-H "Authorization: Bearer $QQ_KEY" \
-H "Content-Type: application/json" \
-d '{ "destination": "https://example.com/summer" }'Endpoints
GET/codes
Your codes, newest first. Use limit (1–200, default 50) and offset to page through them.
POST/codes
Creates a code. Fields:
type(required): one of the types below.dynamic:truefor an editable, trackable link. Onlyurlcodes and hosted pages can be dynamic; hosted pages always are.destination: where a dynamicurlcode sends people.content: what the code holds, for every other type.name,slug(a custom link ending, 3–40 letters, numbers or dashes),status(activeorpaused),folder_id,active_from,active_untilanddesign: all optional.
GET/codes/{id}
One code, including its design.
PATCH/codes/{id}
Changes any of the fields above except type and dynamic. Send only what changes; null clears a date or folder.
DELETE/codes/{id}
Deletes the code and its scan history. Dynamic codes stop working. Returns 204 with no body.
GET/codes/{id}/analytics
Scans, unique visitors, a daily timeline and breakdowns by country, city, device, operating system and browser. Optional: from and to (default: the last 30 days) and tz (an IANA time zone such as America/Chicago, default UTC) for the daily buckets.
GET/codes/{id}/image
A plain QR image of a saved code in its colors. Options: format (svg or png), size (64–2048 pixels), fg and bg (hex colors) and ec (error correction: L, M, Q or H). For frames, logos and gradients, download from the app.
GET/qr?data=…
Turns any text into a QR image, with the same options as above. Nothing is saved.
curl -H "Authorization: Bearer $QQ_KEY" "https://qr.techitdave.com/api/v1/qr?data=Hello&format=png&size=600" -o hello.pngCode types
These types put their content straight into the code. Missing fields are empty; the rules match the generator’s.
| type | content |
|---|---|
| url | { url } |
| text | { text } |
| wifi | { ssid, password, security: "WPA" | "WEP" | "nopass", hidden } |
| contact | { firstName, lastName, phone, email, company, title, website } |
| { to, subject, body } | |
| phone | { phone } |
| sms | { phone, message } |
| { phone, message } | |
| location | { mode: "address" | "coordinates", query, latitude, longitude } |
| payment | { method: "paypal" | "venmo" | "cashapp" | "bitcoin" | "ethereum", account, amount, currency, note } |
Hosted pages (links, vcard, business, menu, coupon, event, feedback, pdf, images, video, audio and app) take the same content as their editor in the app. The easiest way to see the shape is to make one in the app and fetch it with GET /codes/{id}. Upload images and files in the app first; the API can refer to them but not upload them.
{
"type": "links",
"name": "Bio links",
"content": {
"title": "Dave’s Diner",
"bio": "Breakfast all day",
"color": "#4F46E5",
"links": [{ "label": "Order online", "url": "https://example.com/order" }],
"socials": [{ "network": "instagram", "url": "https://instagram.com/example" }]
}
}The code object
id,name,type,dynamic,slug,destination,contentand (for single codes)design.statusis what you set (activeorpaused);statealso accounts for the active dates:active,paused,scheduledorexpired.folder_id,active_from,active_untilandpassword_protected. Passwords are set in the dashboard, never through the API.scan_count,last_scanned_at,created_atandupdated_at.short_link(dynamic codes) andpayload, the exact text to encode.