Quick Start
Get your API key
Sign up or log in to generate your API key from the dashboard.
Make your first request
Use the API key to authenticate and create your first QR code.
Integrate and scale
Build powerful QR code features into your applications.
Include your API key in the x-api-key header:
curl -H "x-api-key: YOUR_API_KEY" https://uqr.ai/api/v1/qr-codesOr use the Authorization header with Bearer token:
curl -H "Authorization: Bearer YOUR_API_KEY" https://uqr.ai/api/v1/qr-codesMCP is for an assistant in a chat window. REST is for code you write. They share the same codes. They do not share the same auth.
Hosted HTTP at https://uqr.ai/mcp. Streamable HTTP. No local process, no npx, no stdio. That URL is the server, not a documentation page — this section is the docs.
Plan
Pro and above. Free and Lite get 403. Same cut as the REST API. Bulk CSV stays on Business.
A code the assistant creates is an ordinary dynamic code: editable in the dashboard, tracked, never deactivated. Unlimited scans. No ads on the scan path. If you stop paying, you downgrade. Existing codes keep resolving.
Connect with OAuth
MCP clients (Claude, Cursor, ChatGPT in developer mode) use OAuth 2.1 (authorization code + PKCE) at https://uqr.ai/oauth/authorize.
The consent screen picks:
| Scope | What it allows |
|---|---|
mcp:read | analytics |
mcp:write | create + repoint |
Write is never granted unless you opt in. After connect, those are the capabilities. There is no bulk, folders, themes, or delete.
Cursor
The Cursor marketplace plugin is not live yet. Until it is, add the server by URL: https://uqr.ai/mcp.
Scripts still use API keys
Automations and your own code keep using a Pro or Business API key (x-api-key or Authorization: Bearer uqr_…) against the REST API above. A key is full access, not a scoped MCP grant. Do not put a key in the MCP OAuth consent.
Related
/qr-codesList all QR codes/qr-codesCreate a new QR code/qr-codes/:idGet a single QR code/qr-codes/:idUpdate a QR code/qr-codes/:idDelete a QR code/linksList short links/linksCreate a short link/links/:idGet a single short link/links/:idUpdate a short link/links/:idDelete a short link/contactsList lead-capture form submissions (contacts), newest first. Beyond your plan's monthly limit, the newest submissions are locked (see meta.locked) until you upgrade.Full Options Schema
{
"options": {
"width": 1080,
"height": 1080,
"margin": 0,
"image": "https://example.com/logo.png",
"qrOptions": {
"errorCorrectionLevel": "Q" // L, M, Q, H
},
"dotsOptions": {
"type": "square",
"color": "#000000",
"gradient": null
},
"backgroundOptions": {
"color": "#ffffff"
},
"cornersSquareOptions": {
"type": "square",
"color": "#000000"
},
"cornersDotOptions": {
"type": "square",
"color": "#000000"
},
"imageOptions": {
"hideBackgroundDots": true,
"imageSize": 0.4,
"margin": 0
},
"frameOptions": {
"enabled": false,
"type": "bottom",
"text": "Scan Me",
"backgroundColor": "#ffffff",
"textColor": "#000000",
"fontSize": 16
}
}
}Design Examples
{
"dotsOptions": { "type": "rounded", "color": "#1e40af" },
"cornersSquareOptions": { "type": "extra-rounded", "color": "#1e3a8a" },
"backgroundOptions": { "color": "#eff6ff" }
}{
"dotsOptions": {
"type": "dots",
"gradient": {
"colorStops": [
{ "offset": 0, "color": "#ec4899" },
{ "offset": 1, "color": "#8b5cf6" }
]
}
},
"cornersSquareOptions": { "type": "dot", "color": "#8b5cf6" }
}{
"dotsOptions": { "type": "rounded", "color": "#000000" },
"frameOptions": {
"enabled": true,
"type": "bottom",
"text": "SCAN ME",
"backgroundColor": "#f1f5f9",
"textColor": "#334155",
"fontSize": 18
}
}{
"image": "https://example.com/logo.png",
"dotsOptions": { "type": "rounded", "color": "#000000" },
"imageOptions": {
"hideBackgroundDots": true,
"imageSize": 0.3,
"margin": 5
},
"qrOptions": { "errorCorrectionLevel": "H" }
}Dot Styles
Corner Styles
| Field | DB Type | Required | Description |
|---|---|---|---|
type_id | BIGINT | QR type identifier (1-24) | |
name | TEXT | - | QR code display name |
short_link_domain | TEXT | - | Domain for the short link (e.g. uqr.page). Defaults to system default if not specified |
options | JSONB | - | Design options object |
folder | UUID | - | Folder ID for organization |
template_id | UUID | - | Design template ID |
theme | JSONB | - | Theme configuration for landing pages |
| Field | DB Type | Description |
|---|---|---|
short_id | TEXT | Short ID for URL |
short_link_domain | TEXT | Domain used for the short link (e.g. uqr.page) |
short_url | N/A | Full scannable URL |
image | TEXT | URL to generated QR code image |
image_status | N/A | Image processing status |
image_base64 | N/A | Base64 encoded image (initial only) |
missing_api_keyNo API key provided in the request
invalid_api_keyThe provided API key is invalid
api_key_inactiveThe API key has been deactivated
api_plan_requiredThe REST API requires a Pro plan or higher
premium_requiredThe requested feature requires a pro subscription
plan_limit_reachedPlan quota reached — upgrade to create more
validation_errorInvalid request parameters
not_foundThe requested resource was not found
database_errorA database error occurred
server_errorAn unexpected server error occurred