SKQR Forge API Docs
Complete public documentation for QR rendering, anonymous access, account-authenticated issue conversations, Firebase ID tokens, and QR schema design.
Anonymous free key
Anyone can test the render API without creating an account using the anonymous key below. The anonymous key gives 20 render requests per anonymous identity per week.
X-SKQR-Anonymous-Id value so your quota follows your tool instead of a public network.skqr_anon/-/free-weekly-20\-\"tok-kw">curl "tok-prop">-X "tok-kw">POST https://skqr.smrprprp.xyz/api/v1/render \
"tok-prop">-H "">Content-Type: application/json" \
"tok-prop">-H "X-API-Key: skqr_anon/-/free-weekly-20\-\" \
"tok-prop">-H "X-SKQR-Anonymous-Id: my-shortcut">-device-001" \
"tok-prop">-d '{
"data": "https://smbeta.xyz",
"title": "smbeta.xyz",
"moduleShape": "rounded",
"accent": "#ff2b2b"
}' \
--"tok-kw">output skqr-render.zipAuthentication model
SKQR uses two token types. They are not the same and should not be mixed.
SKQR API key
Used for public developer render APIs. Created in Account after Developer mode is enabled.
Firebase ID token
Used for account actions such as reading My Issues, replying to your own issues, and account resources.
X-API-Key: skqr/-/xxxxxxxxxxxxxxx\-\
# or
Authorization: Bearer skqr/-/xxxxxxxxxxxxxxx\-\Authorization: Bearer FIREBASE_ID_TOKENHow to get a Firebase ID token
The Firebase ID token is created by Firebase Auth when a user signs in. In the SKQR website, users can reveal it from Account → API Key Section → Firebase ID Token. To reveal it, SKQR sends a verification code by email. After the code is verified, the token is shown and can be copied.
"tok-kw">import { getAuth, signInWithEmailAndPassword } "tok-kw">from 'firebase/auth';
"tok-kw">const auth = getAuth();
"tok-kw">await signInWithEmailAndPassword(auth, email, password);
"tok-kw">const firebaseIdToken = "tok-kw">await auth.currentUser.getIdToken(true);"tok-kw">curl "tok-prop">-X "tok-kw">POST https://skqr.smrprprp.xyz/api/issues/comment \
"tok-prop">-H "">Authorization: ">Bearer FIREBASE_ID_TOKEN" \
"tok-prop">-H "">Content-Type: application/json" \
"tok-prop">-d '{
"issueId": "LOCAL_ISSUE_ID",
"message": "Reply sent from iOS Shortcuts."
}'POST /api/v1/render
Renders a QR code from a schema and returns a downloadable ZIP package. On success, the response is a file download, not JSON.
/api/v1/renderX-API-Key or Authorization: Bearer SKQR_API_KEY{
"data": "https://smbeta.xyz",
"title": "smbeta.xyz",
"subtitle": "CONNECT > BUILD > DEPLOY > REPEAT",
"accent": "#ff2b2b",
"dark": "#ffffff",
"light": "#030000",
"frame": true,
"moduleShape": "rounded",
"outlineWidth": 0
}HTTP/1.1 200 OK
Content-Type: application/zip
Content-Disposition: attachment; filename="skqr-smbeta-xyz.zip"
ZIP folder:
qr.svg
qr.png
qr.webp
panel.svg
panel.png
panel.webp
schema.json
README.txtComplete API parameter reference
This is the only full parameter-table section. It lists the public headers/body values developers need to use SKQR APIs without mixing them with normal status-code or error examples.
POST /api/v1/render — headers
| Parameter | Value | Required | Description |
|---|---|---|---|
| Content-Type | string: application/json | Yes | The request body must be JSON. |
| X-API-Key | string | Yes* | Use your SKQR developer key or the anonymous free key. Required unless Authorization Bearer is used. |
| Authorization | string: Bearer SKQR_API_KEY | Yes* | Alternative to X-API-Key. Use Bearer followed by a SKQR API key. |
| X-SKQR-Anonymous-Id | string (optional) | No | Recommended for anonymous tools/Shortcuts. Helps keep the weekly anonymous quota tied to one person/tool instead of a broad network. |
POST /api/v1/render — JSON body
| Parameter | Value | Required | Description |
|---|---|---|---|
| data | string | Yes | The URL or text encoded in the QR code. Max recommended size: 1,800 characters. |
| title | string (default SKQR) | No | Large label shown under the QR panel and used in the ZIP filename. |
| subtitle | string (default CONNECT > BUILD > DEPLOY > REPEAT) | No | Small technical caption shown under the title. |
| width | number (default 720) | No | Output canvas width used by client renderers. Recommended range: 320–2048. |
| height | number (default 720) | No | Output canvas height used by client renderers. Recommended range: 320–2048. |
| margin | number (default 28) | No | Quiet space around QR modules. Higher values improve scanning. |
| qrColor / dark | string hex (default #ffffff) | No | Color used for regular QR modules. |
| bgColor / light | string hex (default #050000) | No | Background color behind QR modules and the panel. |
| accent | string hex (default #ff2b2b) | No | Frame, glow, and finder accent color. |
| moduleShape | string (default rounded) | No | Supported: square, rounded, circle, diamond, octagon, hexagon, slash, horizontal, vertical, ring, blob. |
| moduleGap | number (default 0.08) | No | Space between modules. Keep low for scan safety. |
| transparentQR | boolean (default false) | No | Makes non-finder QR modules transparent. Use with caution because contrast may drop. |
| frame | boolean (default true) | No | Adds the cyber card frame around the QR and generates panel images. |
| logoUrl | string URL/data URL | No | Optional logo image. Keep small to preserve scan reliability. |
| backgroundImage | string URL/data URL | No | Optional panel background image. |
| bgOpacity | number (default 1) | No | Opacity for backgroundImage inside the panel. |
| outlineWidth | number (default 0) | No | Optional outline size around QR modules. |
| outlineColor | string hex (default accent) | No | Optional outline color. |
Firebase ID token reference
| Parameter | Value | Required | Description |
|---|---|---|---|
| Where to get it | Account → API Key Section → Firebase ID Token | Yes | Click Reveal, verify the email code, then copy the token. |
| Lifetime | temporary string | Yes | Firebase ID tokens expire automatically; reveal or refresh a new one when needed. |
| Use case | account actions | Yes | Use it for My Issues, issue replies, account resources, and Shortcuts automation. |
| Do not use for | public QR rendering | No | Use a SKQR API key for render endpoints instead. |
POST /api/issues/create — headers/body
| Parameter | Value | Required | Description |
|---|---|---|---|
| Authorization | string: Bearer FIREBASE_ID_TOKEN | No | Optional header. If included, the issue is linked to the signed-in account. |
| Content-Type | string: application/json | Yes | Required for POST requests. |
| title | string | Yes | Short issue title, 3–160 characters. |
| message | string | Yes | Full report content, bug details, or feature request. |
| category | string (default other) | No | Suggested values: bug, api, account, feature, other. |
| anonymousAccepted | boolean | Yes if anonymous | Required for anonymous reports to confirm the user understands they cannot receive status updates without an account. |
GET /api/issues/list + POST /api/issues/comment — headers/body
| Parameter | Value | Required | Description |
|---|---|---|---|
| Authorization | string: Bearer FIREBASE_ID_TOKEN | Yes | Required for account issue list and replies. |
| Content-Type | string: application/json | Yes for POST | Required when sending JSON body. |
| issueId | string | Yes for reply | Local SKQR issue ID returned by the issue creation/list API. |
| message | string | Yes for reply | Reply body sent by the signed-in account. |
Issues API
Issues can be submitted publicly from the website. Signed-in users can track, read, and reply to their own issues with a Firebase ID token. Anonymous users cannot receive status updates unless they create an account.
/api/issues/createOptional Firebase ID token"tok-kw">curl "tok-prop">-X "tok-kw">POST https://skqr.smrprprp.xyz/api/issues/create \
"tok-prop">-H "">Authorization: ">Bearer FIREBASE_ID_TOKEN" \
"tok-prop">-H "">Content-Type: application/json" \
"tok-prop">-d '{
"title": "Render API issue",
"category": "api",
"message": "The ZIP render looks wrong in my shortcut."
}'"tok-kw">curl "tok-prop">-X "tok-kw">POST https://skqr.smrprprp.xyz/api/issues/create \
"tok-prop">-H "">Content-Type: application/json" \
"tok-prop">-d '{
"title": "Anonymous report",
"category": "bug",
"message": "Something is not working.",
"anonymousAccepted": true
}'/api/issues/listFirebase ID token/api/issues/commentFirebase ID token"tok-kw">curl "tok-prop">-X "tok-kw">POST https://skqr.smrprprp.xyz/api/issues/comment \
"tok-prop">-H "">Authorization: ">Bearer FIREBASE_ID_TOKEN" \
"tok-prop">-H "">Content-Type: application/json" \
"tok-prop">-d '{
"issueId": "LOCAL_ISSUE_ID",
"message": "Here is more information."
}'QR schema fields
QR schemas are saved as recipes, not rendered images. This keeps accounts lightweight and lets users regenerate QR codes later.
{
"data": "https://smbeta.xyz",
"title": "smbeta.xyz",
"subtitle": "CONNECT > BUILD > DEPLOY > REPEAT",
"width": 720,
"height": 720,
"margin": 28,
"qrColor": "#ffffff",
"bgColor": "#030000",
"accent": "#ff2b2b",
"moduleShape": "rounded",
"moduleGap": 0.08,
"transparentQR": false,
"frame": true,
"glass": true,
"relief": true,
"glow": true,
"logoUrl": "https://example.com/logo.png"
}Module shapes
square, rounded, circle, diamond, octagon, hexagon, slash, horizontal, vertical, ring, blob
ZIP output
The render API returns a package with QR-only PNG/WebP/SVG, panel PNG/WebP/SVG, schema.json, and README.txt.
Errors
Error responses are JSON. Success responses from /api/v1/render are ZIP downloads.
{
"error": "Invalid API key."
}- 400 — missing or invalid request body.
- 401 — missing, invalid, or revoked auth token/API key.
- 403 — 2FA, Developer mode, account owner, or team access required.
- 429 — anonymous weekly quota exceeded.
- 500 — server configuration or provider error.
Developer workflows
- Fast test: use the anonymous free key for up to 20 render requests per week per anonymous identity.
- Full developer access: create an account, activate 2FA, enable Developer mode, then generate a SKQR API key.
- Account automation: reveal your Firebase ID token from Account after email verification, then use it for My Issues/account endpoints.
"tok-kw">const response = "tok-kw">await "tok-kw">fetch('https://skqr.smrprprp.xyz/api/v1/render', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'skqr/-/xxxxxxxxxxxxxxx\-\'
},
body: JSON.stringify({
data: 'https://smbeta.xyz',
title: 'smbeta.xyz',
moduleShape: 'diamond'
})
});
if (!response.ok) throw new Error(await response.text());
const zipBlob = await response.blob();
const url = URL.createObjectURL(zipBlob);
const a = document.createElement('a');
a.href = url;
a.download = 'skqr-render.zip';
a.click();