DEVELOPER DOCUMENTATION

SKQR Forge API Docs

Complete public documentation for QR rendering, anonymous access, account-authenticated issue conversations, Firebase ID tokens, and QR schema design.

Base URL: https://skqr.smrprprp.xyzRender auth: SKQR API keyAccount auth: Firebase ID token

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.

The quota is not global. SKQR uses a browser/tool identity when provided, plus coarse Vercel geo buckets of about 14 km when available, with an IP/user-agent fallback. For iOS Shortcuts or scripts, pass your own stable X-SKQR-Anonymous-Id value so your quota follows your tool instead of a public network.
Anonymous API key
skqr_anon/-/free-weekly-20\-\
Anonymous render test that downloads a ZIP
"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.zip

Authentication 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.

SKQR API key header
X-API-Key: skqr/-/xxxxxxxxxxxxxxx\-\
# or
Authorization: Bearer skqr/-/xxxxxxxxxxxxxxx\-\
Firebase ID token header
Authorization: Bearer FIREBASE_ID_TOKEN

How 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.

Never publish your Firebase ID token. Use it only for your own account actions. For public QR rendering, use your SKQR API key instead.
Get token inside a web app
"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);
Use token with account endpoints
"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.

POST/api/v1/renderX-API-Key or Authorization: Bearer SKQR_API_KEY
Request body
{
  "data": "https://smbeta.xyz",
  "title": "smbeta.xyz",
  "subtitle": "CONNECT > BUILD > DEPLOY > REPEAT",
  "accent": "#ff2b2b",
  "dark": "#ffffff",
  "light": "#030000",
  "frame": true,
  "moduleShape": "rounded",
  "outlineWidth": 0
}
Success response
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.txt

Complete 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

ParameterValueRequiredDescription
Content-Typestring: application/jsonYesThe request body must be JSON.
X-API-KeystringYes*Use your SKQR developer key or the anonymous free key. Required unless Authorization Bearer is used.
Authorizationstring: Bearer SKQR_API_KEYYes*Alternative to X-API-Key. Use Bearer followed by a SKQR API key.
X-SKQR-Anonymous-Idstring (optional)NoRecommended 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

ParameterValueRequiredDescription
datastringYesThe URL or text encoded in the QR code. Max recommended size: 1,800 characters.
titlestring (default SKQR)NoLarge label shown under the QR panel and used in the ZIP filename.
subtitlestring (default CONNECT > BUILD > DEPLOY > REPEAT)NoSmall technical caption shown under the title.
widthnumber (default 720)NoOutput canvas width used by client renderers. Recommended range: 320–2048.
heightnumber (default 720)NoOutput canvas height used by client renderers. Recommended range: 320–2048.
marginnumber (default 28)NoQuiet space around QR modules. Higher values improve scanning.
qrColor / darkstring hex (default #ffffff)NoColor used for regular QR modules.
bgColor / lightstring hex (default #050000)NoBackground color behind QR modules and the panel.
accentstring hex (default #ff2b2b)NoFrame, glow, and finder accent color.
moduleShapestring (default rounded)NoSupported: square, rounded, circle, diamond, octagon, hexagon, slash, horizontal, vertical, ring, blob.
moduleGapnumber (default 0.08)NoSpace between modules. Keep low for scan safety.
transparentQRboolean (default false)NoMakes non-finder QR modules transparent. Use with caution because contrast may drop.
frameboolean (default true)NoAdds the cyber card frame around the QR and generates panel images.
logoUrlstring URL/data URLNoOptional logo image. Keep small to preserve scan reliability.
backgroundImagestring URL/data URLNoOptional panel background image.
bgOpacitynumber (default 1)NoOpacity for backgroundImage inside the panel.
outlineWidthnumber (default 0)NoOptional outline size around QR modules.
outlineColorstring hex (default accent)NoOptional outline color.

Firebase ID token reference

ParameterValueRequiredDescription
Where to get itAccount → API Key Section → Firebase ID TokenYesClick Reveal, verify the email code, then copy the token.
Lifetimetemporary stringYesFirebase ID tokens expire automatically; reveal or refresh a new one when needed.
Use caseaccount actionsYesUse it for My Issues, issue replies, account resources, and Shortcuts automation.
Do not use forpublic QR renderingNoUse a SKQR API key for render endpoints instead.

POST /api/issues/create — headers/body

ParameterValueRequiredDescription
Authorizationstring: Bearer FIREBASE_ID_TOKENNoOptional header. If included, the issue is linked to the signed-in account.
Content-Typestring: application/jsonYesRequired for POST requests.
titlestringYesShort issue title, 3–160 characters.
messagestringYesFull report content, bug details, or feature request.
categorystring (default other)NoSuggested values: bug, api, account, feature, other.
anonymousAcceptedbooleanYes if anonymousRequired 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

ParameterValueRequiredDescription
Authorizationstring: Bearer FIREBASE_ID_TOKENYesRequired for account issue list and replies.
Content-Typestring: application/jsonYes for POSTRequired when sending JSON body.
issueIdstringYes for replyLocal SKQR issue ID returned by the issue creation/list API.
messagestringYes for replyReply 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.

POST/api/issues/createOptional Firebase ID token
Create signed-in issue
"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."
  }'
Create anonymous issue
"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
  }'
GET/api/issues/listFirebase ID token
POST/api/issues/commentFirebase ID token
Reply to your issue
"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.

Full schema example
{
  "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 response
{
  "error": "Invalid API key."
}

Developer workflows

  1. Fast test: use the anonymous free key for up to 20 render requests per week per anonymous identity.
  2. Full developer access: create an account, activate 2FA, enable Developer mode, then generate a SKQR API key.
  3. Account automation: reveal your Firebase ID token from Account after email verification, then use it for My Issues/account endpoints.
Minimal JavaScript render request
"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();