Sprykit API
A REST API for creating and managing QR codes from your own systems. Authenticate with a workspace API key, send JSON, get JSON back.
What the API covers
QR codes, and only QR codes
List, create, read, update and delete. Landing pages, link pages, business cards, analytics and domains are dashboard-only for now.
Workspace API keys
Each key belongs to one workspace and carries its own read, write and delete permissions. Send it as a bearer token or an
X-API-Keyheader.OpenAPI 3.1
The reference is generated from the route handlers themselves. The machine-readable spec is at
/api-spec.json.
Quick start
Create an API key
Go to Settings → API keys in your dashboard and grant the key the permissions it needs. The full key is shown once, at creation; afterwards the dashboard displays only its first eight and last four characters.
Keys are the prefix
qr_followed by 32 random bytes in base64url — 43 characters. Masked, that reads:qr_a1B2...z9Y8Make your first request
nameandcontentare required;contentis whatever the code should encode. The response carries the created record underqrCode.curl -X POST https://app.sprykit.com/api/public/qr \ -H "Authorization: Bearer qr_<YOUR_API_KEY>" \ -H "Content-Type: application/json" \ -d '{ "name": "My first QR code", "content": "https://example.com" }'Explore the reference
Every endpoint, parameter and response shape, generated from the handlers.
Open the full API reference
Code examples
JavaScript / Node.js
const response = await fetch('https://app.sprykit.com/api/public/qr', {
method: 'POST',
headers: {
'Authorization': 'Bearer qr_<YOUR_API_KEY>',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'My QR code',
content: 'https://example.com',
designSettings: {
fgColor: '#2563EB',
bgColor: '#FFFFFF',
},
}),
});
const data = await response.json();
console.log('QR code created:', data.qrCode.id);Python
import requests
response = requests.post(
'https://app.sprykit.com/api/public/qr',
headers={
'Authorization': 'Bearer qr_<YOUR_API_KEY>',
'Content-Type': 'application/json'
},
json={
'name': 'My QR code',
'content': 'https://example.com',
'designSettings': {
'fgColor': '#2563EB',
'bgColor': '#FFFFFF'
}
}
)
data = response.json()
print(f"QR code created: {data['qrCode']['id']}")PHP
<?php
$ch = curl_init('https://app.sprykit.com/api/public/qr');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer qr_<YOUR_API_KEY>',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'name' => 'My QR code',
'content' => 'https://example.com',
'designSettings' => [
'fgColor' => '#2563EB',
'bgColor' => '#FFFFFF'
]
]));
$response = curl_exec($ch);
$data = json_decode($response, true);
echo "QR code created: " . $data['qrCode']['id'];
?>Endpoints
Six operations on one resource. Anything not listed here is not on the public API.
GET
/api/public/qrneedsreadList the workspace’s QR codes. Takes limit, offset and active.
POST
/api/public/qrneedswriteCreate a QR code. Requires name and content; designSettings is optional.
GET
/api/public/qr/listneedsreadAn alias of the list endpoint above, with the same response.
GET
/api/public/qr/{id}needsreadRead one QR code.
PUT
/api/public/qr/{id}needswriteUpdate name, content, designSettings or active.
DELETE
/api/public/qr/{id}needsdeleteDelete a QR code permanently.
Authentication
Every public endpoint takes a workspace API key, either way round. A key with the wrong permission gets a 403 rather than a 401, so you can tell the two apart.
Keep keys secret. A key carries its workspace’s access. Never commit one, never ship one in client-side code, and rotate it from Settings → API keys if it leaks.
Bearer token
Authorization: Bearer qr_<YOUR_API_KEY>API key header
X-API-Key: qr_<YOUR_API_KEY>Rate limits
One sliding window, one hour long, counted per API key. Your workspace’s allowance is an entitlement rather than a fixed number per plan, so read it from the response instead of assuming it — a workspace with no API entitlement has an allowance of zero and every call answers 429.
| Header | What it carries |
|---|---|
X-RateLimit-Limit | Your workspace’s hourly allowance. |
X-RateLimit-Remaining | Calls left in the current hour. |
X-RateLimit-Reset | Unix seconds at which the window resets. |
X-RateLimit-Tier | The tier the allowance resolved to. |
Retry-After | Seconds to wait. Sent only with a 429. |
Status and support
Platform health is measured live rather than promised — check it before you open a ticket.