API Documentation

Getting Started
Welcome to the uqr.ai API! Use our REST API to create, manage, and customize dynamic QR codes programmatically.
Create dynamic QR codes with custom designs
Track scans with real-time analytics
Update QR code destinations without reprinting
Customize colors, logos, and styles

Quick Start

1
Get your API key

Sign up or log in to generate your API key from the dashboard.

2
Make your first request

Use the API key to authenticate and create your first QR code.

3
Integrate and scale

Build powerful QR code features into your applications.

Authentication
All API requests require authentication using your API key.

Include your API key in the x-api-key header:

curl -H "x-api-key: YOUR_API_KEY" https://uqr.ai/api/v1/qr-codes

Or use the Authorization header with Bearer token:

curl -H "Authorization: Bearer YOUR_API_KEY" https://uqr.ai/api/v1/qr-codes

MCP

MCP 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:

ScopeWhat it allows
mcp:readanalytics
mcp:writecreate + 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

Base URL
https://uqr.ai/api/v1
Endpoints
Available API endpoints for QR codes, short links, and contacts
Design Options
Customize the appearance of your QR codes

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

Professional Blue
{
  "dotsOptions": { "type": "rounded", "color": "#1e40af" },
  "cornersSquareOptions": { "type": "extra-rounded", "color": "#1e3a8a" },
  "backgroundOptions": { "color": "#eff6ff" }
}
Modern Gradient
{
  "dotsOptions": {
    "type": "dots",
    "gradient": {
      "colorStops": [
        { "offset": 0, "color": "#ec4899" },
        { "offset": 1, "color": "#8b5cf6" }
      ]
    }
  },
  "cornersSquareOptions": { "type": "dot", "color": "#8b5cf6" }
}
With Frame
{
  "dotsOptions": { "type": "rounded", "color": "#000000" },
  "frameOptions": {
    "enabled": true,
    "type": "bottom",
    "text": "SCAN ME",
    "backgroundColor": "#f1f5f9",
    "textColor": "#334155",
    "fontSize": 18
  }
}
With Logo
{
  "image": "https://example.com/logo.png",
  "dotsOptions": { "type": "rounded", "color": "#000000" },
  "imageOptions": {
    "hideBackgroundDots": true,
    "imageSize": 0.3,
    "margin": 5
  },
  "qrOptions": { "errorCorrectionLevel": "H" }
}

Dot Styles

squaredotsroundedextra-roundedclassyclassy-rounded

Corner Styles

squaredotextra-rounded
Common Fields
Fields available for all QR types
FieldDB TypeRequiredDescription
type_idBIGINTQR type identifier (1-24)
nameTEXT-QR code display name
short_link_domainTEXT-Domain for the short link (e.g. uqr.page). Defaults to system default if not specified
optionsJSONB-Design options object
folderUUID-Folder ID for organization
template_idUUID-Design template ID
themeJSONB-Theme configuration for landing pages
Pro fields (require subscription)
Fields requiring a pro subscription
FieldDB TypeDescription
short_idTEXTCustom short ID (e.g., "my-brand")
link_passwordTEXTPassword to protect QR access
password_enabledBOOLEANEnable password protection
expires_atTIMESTAMPTZExpiration date (ISO 8601)
expiration_enabledBOOLEANEnable expiration
expired_redirect_urlTEXTRedirect URL after expiration
scan_limitINTEGERMaximum scans allowed
scan_limit_reached_urlTEXTRedirect URL after limit reached
Response Fields
Fields returned when creating or fetching QR codes
FieldDB TypeDescription
short_idTEXTShort ID for URL
short_link_domainTEXTDomain used for the short link (e.g. uqr.page)
short_urlN/AFull scannable URL
imageTEXTURL to generated QR code image
image_statusN/AImage processing status
image_base64N/ABase64 encoded image (initial only)
QR Code Types
Use these type_id values when creating QR codes
Error Codes
Possible error responses from the API
401
missing_api_key

No API key provided in the request

401
invalid_api_key

The provided API key is invalid

401
api_key_inactive

The API key has been deactivated

403
api_plan_required

The REST API requires a Pro plan or higher

403
premium_required

The requested feature requires a pro subscription

402
plan_limit_reached

Plan quota reached — upgrade to create more

400
validation_error

Invalid request parameters

404
not_found

The requested resource was not found

500
database_error

A database error occurred

500
server_error

An unexpected server error occurred