Generate, edit and track dynamic (editable) QR codes with scan analytics. Hosted MCP and REST API.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer API key from https://openqr.uk/api, format: 'Bearer oqr_...'
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create up to 200 dynamic QR codes at once. Requires an OpenQR API key.
Codes to create.
A saved theme id or name applied to every code created.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Create up to 200 dynamic QR codes at once. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| codes* | array | Codes to create. |
| theme | string | A saved theme id or name applied to every code created. |
{
"type": "object",
"required": [
"codes"
],
"properties": {
"codes": {
"type": "array",
"items": {
"type": "object",
"required": [
"destination"
],
"properties": {
"label": {
"type": "string"
},
"destination": {
"type": "string"
}
}
},
"description": "Codes to create."
},
"theme": {
"type": "string",
"description": "A saved theme id or name applied to every code created."
}
}
}Release the branded subdomain. Codes stay live on the plain short link; only the {name}.oqr.to form stops resolving. The name becomes claimable by someone else. Requires an OpenQR API key.
No arguments.
{
"type": "object",
"properties": {}
}Create an editable (dynamic) QR code whose destination you can change later without reprinting. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| label | string | Optional label. |
| theme | string | A saved theme id or name to style the code with. |
| destination* | string | The http(s) URL the code should point to. |
{
"type": "object",
"required": [
"destination"
],
"properties": {
"label": {
"type": "string",
"description": "Optional label."
},
"theme": {
"type": "string",
"description": "A saved theme id or name to style the code with."
},
"destination": {
"type": "string",
"description": "The http(s) URL the code should point to."
}
}
}Create a folder to organise codes. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
}
}
}Create an extra short link (link alias) that resolves where one of your dynamic codes points: share a different slug per channel while the QR keeps its own slug, so QR scans and link clicks are counted separately. Free accounts have no alias allowance; Pro includes 10. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string | The dynamic code id the alias should point at. |
| slug | string | Optional custom back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens. Omit for a random one. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The dynamic code id the alias should point at."
},
"slug": {
"type": "string",
"description": "Optional custom back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens. Omit for a random one."
}
}
}Save a static QR code to your library from structured fields: wifi, contact (vCard), email, SMS, WhatsApp, location, text, phone or URL. Static codes bake the content into the code itself — no short link, no scan analytics, not editable later. Render the returned payload with generate_qr. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| type* | string | The payload type. |
| label | string | Optional label for your dashboard. |
| theme | string | A saved theme id or name to style the code with. |
| fields* | object | Field names depend on type. url: url. text: text. email: email, subject?, body?. phone: phone. sms: phone, message?. whatsapp: phone (country code, digits only), message?. wifi: ssid, password?, encryption? (WPA|WEP|nopass), hidden? (boolean). geo: lat, lng. vcard: firstName?, lastName?, phone?, email?, org?, title?, url?, address? (a name/phone/email is required). |
{
"type": "object",
"required": [
"type",
"fields"
],
"properties": {
"type": {
"enum": [
"url",
"text",
"email",
"phone",
"sms",
"whatsapp",
"wifi",
"geo",
"vcard"
],
"type": "string",
"description": "The payload type."
},
"label": {
"type": "string",
"description": "Optional label for your dashboard."
},
"theme": {
"type": "string",
"description": "A saved theme id or name to style the code with."
},
"fields": {
"type": "object",
"description": "Field names depend on type. url: url. text: text. email: email, subject?, body?. phone: phone. sms: phone, message?. whatsapp: phone (country code, digits only), message?. wifi: ssid, password?, encryption? (WPA|WEP|nopass), hidden? (boolean). geo: lat, lng. vcard: firstName?, lastName?, phone?, email?, org?, title?, url?, address? (a name/phone/email is required)."
}
}
}Save a reusable style theme. `style` is a QR style object (fgColor, bgColor, dotType, cornerSquareType, etc.). Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| style* | object | QR style JSON (colours, dot/corner shapes, logo, gradient, frame…). |
{
"type": "object",
"required": [
"name",
"style"
],
"properties": {
"name": {
"type": "string"
},
"style": {
"type": "object",
"description": "QR style JSON (colours, dot/corner shapes, logo, gradient, frame…)."
}
}
}Permanently delete a dynamic QR code. The short link stops working. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string | The dynamic code id. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The dynamic code id."
}
}
}Delete a folder (its codes are un-filed, not deleted). Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
}
}Delete a saved theme. Codes already styled with it keep their look. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
}
}Build a static EPC/SEPA payment payload (EPC069-12, the GiroCode/BezahlCode European banks scan) and optionally render it as a QR image. Returns the payload string by default. Static and untracked — nothing is saved to the library. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| bic | string | Optional BIC, 8 or 11 chars. |
| iban* | string | IBAN, with or without spaces (checksum-validated). |
| name* | string | Beneficiary name, ≤70 chars. |
| size | number | Image size, 96–2048 (default 512). |
| text | string | Unstructured remittance text, ≤140 chars. Mutually exclusive with reference. |
| force | boolean | Build even when validation reports problems (they return as warnings). |
| amount | string | Optional EUR amount, e.g. 12.34. |
| format | string | Return a rendered image instead of the payload string. |
| purpose | string | Optional 4-character purpose code. |
Build a static PIX (BR Code) payment payload for Brazil and optionally render it as a QR image. Returns the payload string by default (render it with generate_qr, or pass format). Static and untracked — nothing is saved to the library. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| key* | string | PIX key: CPF, CNPJ, email, +55 phone or random (EVP) key. |
| city* | string | Merchant city, ≤15 chars. |
| name* | string | Merchant name, ≤25 chars (diacritics stripped to ASCII). |
| size | number | Image size, 96–2048 (default 512). |
| txid | string | Transaction id, 1-25 letters/digits. Defaults to ***. |
| force | boolean | Build even when validation reports problems (they return as warnings) — e.g. a check-digit warning you have verified yourself. |
| amount | string | Optional amount in BRL, e.g. 10.50. |
| format | string | Return a rendered image instead of the payload string. |
| singleUse |
Generate a static QR code from any text/URL. Returns a PNG image (or SVG markup). Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| data* | string | The content to encode (URL or text). |
| size | number | Pixel size, 96–2048 (default 512). |
| theme | string | A saved theme id or name. Applies the theme's colours; full styling applies to dynamic codes. |
| format | string | Output format (default png). |
{
"type": "object",
"required": [
"data"
],
"properties": {
"data": {
"type": "string",
"description": "The content to encode (URL or text)."
},
"size": {
"type": "number",
"description": "Pixel size, 96–2048 (default 512)."
},
"theme": {
"type": "string",
"description": "A saved theme id or name. Applies the theme's colours; full styling applies to dynamic codes."
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"description": "Output format (default png)."
}
}
}Build a static UPI (upi://pay) payment payload for India and optionally render it as a QR image. Returns the payload string by default. Static and untracked — nothing is saved to the library. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| vpa* | string | Virtual payment address, e.g. name@bank. |
| note | string | Optional payment note (≤50 chars keeps every UPI app happy). |
| size | number | Image size, 96–2048 (default 512). |
| force | boolean | Build even when validation reports problems (they return as warnings). |
| amount | string | Optional amount in INR, e.g. 25.50. |
| format | string | Return a rendered image instead of the payload string. |
| payeeName* | string | Payee name shown in the payer's app. |
{
"type": "object",
"required": [
"vpa",
"payeeName"
],
"properties": {
"vpa": {
"type": "string",
"description": "Virtual payment address, e.g. name@bank."
},
"note": {
"type": "string",
"description": "Optional payment note (≤50 chars keeps every UPI app happy)."
},
"size": {
"type": "number",
"description": "Image size, 96–2048 (default 512)."
},
"force": {
"type": "boolean",
"description": "Build even when validation reports problems (they return as warnings)."
},
"amount": {
"type": "string",
"description": "Optional amount in INR, e.g. 25.50."
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"description": "Return a rendered image instead of the payload string."
},
"payeeName": {
"type": "string",
"description": "Payee name shown in the payer's app."
}
}
}Get the full details of one of your QR codes by id: destination, short link, label, type, tags, folder, status and created date. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string | The code id. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The code id."
}
}
}Get scan statistics for a dynamic QR code. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string | The dynamic code id. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The dynamic code id."
}
}
}Show the branded subdomain on this account ({name}.oqr.to). Reports whether it is currently suspended — a suspended subdomain redirects to the plain short link instead of serving, which happens when a Pro plan lapses. Requires an OpenQR API key.
No arguments.
{
"type": "object",
"properties": {}
}List your dynamic (editable) QR codes — id, short URL, destination, label and status. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max codes to return, 1–500 (default 200). |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max codes to return, 1–500 (default 200)."
}
}
}List your folders (id and name). Requires an OpenQR API key.
No arguments.
{
"type": "object",
"properties": {}
}List the link aliases of one dynamic code. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string | The dynamic code id. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The dynamic code id."
}
}
}List your saved style themes (id, name) — apply one by passing its id or name as `theme` to generate/create/update tools. Requires an OpenQR API key.
No arguments.
{
"type": "object",
"properties": {}
}Claim or change the branded subdomain so codes also resolve at {name}.oqr.to. Pro only. Codes keep working on the plain short link either way, so changing this never breaks anything already printed. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| subdomain* | string | 3–32 letters, numbers or hyphens, e.g. "acme". |
{
"type": "object",
"required": [
"subdomain"
],
"properties": {
"subdomain": {
"type": "string",
"description": "3–32 letters, numbers or hyphens, e.g. \"acme\"."
}
}
}Edit a dynamic QR code: change its destination, label, custom short link (slug), tags or folder. Pass only the fields you want to change. Requires an OpenQR API key.
| Argument | Type | Description |
|---|---|---|
| id* | string | The dynamic code id. |
| pin | string | null | Pro: require a 4-digit PIN before the code redirects. Exactly 4 digits. Pass null to remove all protection. |
| slug | string | Custom short-link back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens. |
| tags | array | Replace the code's tags (max 10). |
| label | string | New label. |
| theme | string | A saved theme id or name to restyle the code with. |
| status | string | Pause the code (it stops resolving — scanners see an inactive page) or reactivate it. Free allows 1 active code; Pro 25. |
| password | string | null | Pro: require this password before the code redirects (min 4 characters). Pass null to remove all protection. |
| folder_id | string | null | Move into a folder id, or null to un-file. |
| reference |
| string |
| ISO 11649 creditor reference, ≤35 chars. Mutually exclusive with text. |
{
"type": "object",
"required": [
"name",
"iban"
],
"properties": {
"bic": {
"type": "string",
"description": "Optional BIC, 8 or 11 chars."
},
"iban": {
"type": "string",
"description": "IBAN, with or without spaces (checksum-validated)."
},
"name": {
"type": "string",
"description": "Beneficiary name, ≤70 chars."
},
"size": {
"type": "number",
"description": "Image size, 96–2048 (default 512)."
},
"text": {
"type": "string",
"description": "Unstructured remittance text, ≤140 chars. Mutually exclusive with reference."
},
"force": {
"type": "boolean",
"description": "Build even when validation reports problems (they return as warnings)."
},
"amount": {
"type": "string",
"description": "Optional EUR amount, e.g. 12.34."
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"description": "Return a rendered image instead of the payload string."
},
"purpose": {
"type": "string",
"description": "Optional 4-character purpose code."
},
"reference": {
"type": "string",
"description": "ISO 11649 creditor reference, ≤35 chars. Mutually exclusive with text."
}
}
}| boolean |
| Emit point-of-initiation 11: the code works for one payment only. Default reusable. |
| description | string | Optional description, ≤25 chars. |
{
"type": "object",
"required": [
"key",
"name",
"city"
],
"properties": {
"key": {
"type": "string",
"description": "PIX key: CPF, CNPJ, email, +55 phone or random (EVP) key."
},
"city": {
"type": "string",
"description": "Merchant city, ≤15 chars."
},
"name": {
"type": "string",
"description": "Merchant name, ≤25 chars (diacritics stripped to ASCII)."
},
"size": {
"type": "number",
"description": "Image size, 96–2048 (default 512)."
},
"txid": {
"type": "string",
"description": "Transaction id, 1-25 letters/digits. Defaults to ***."
},
"force": {
"type": "boolean",
"description": "Build even when validation reports problems (they return as warnings) — e.g. a check-digit warning you have verified yourself."
},
"amount": {
"type": "string",
"description": "Optional amount in BRL, e.g. 10.50."
},
"format": {
"enum": [
"png",
"svg"
],
"type": "string",
"description": "Return a rendered image instead of the payload string."
},
"singleUse": {
"type": "boolean",
"description": "Emit point-of-initiation 11: the code works for one payment only. Default reusable."
},
"description": {
"type": "string",
"description": "Optional description, ≤25 chars."
}
}
}| lock_hint | string | null | Optional hint shown on the unlock page, e.g. "Ask at the bar". Max 60 characters. |
| destination | string | New http(s) URL. |
| pause_until | string | null | ISO 8601 timestamp: schedule a pause until then (scanners see the inactive page; the code self-resumes at the deadline). Pass null to clear the schedule. Future timestamps only, active codes only. |
| ios_destination | string | null | App links: iOS scanners follow this http(s) URL instead of destination (e.g. the App Store page). Pass null to clear. Applies to the plain redirect only. |
| android_destination | string | null | App links: Android scanners follow this http(s) URL instead of destination (e.g. the Google Play page). Pass null to clear. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The dynamic code id."
},
"pin": {
"type": [
"string",
"null"
],
"description": "Pro: require a 4-digit PIN before the code redirects. Exactly 4 digits. Pass null to remove all protection."
},
"slug": {
"type": "string",
"description": "Custom short-link back-half (oqr.to/<slug>): 3–48 letters, numbers or hyphens."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Replace the code's tags (max 10)."
},
"label": {
"type": "string",
"description": "New label."
},
"theme": {
"type": "string",
"description": "A saved theme id or name to restyle the code with."
},
"status": {
"enum": [
"active",
"paused"
],
"type": "string",
"description": "Pause the code (it stops resolving — scanners see an inactive page) or reactivate it. Free allows 1 active code; Pro 25."
},
"password": {
"type": [
"string",
"null"
],
"description": "Pro: require this password before the code redirects (min 4 characters). Pass null to remove all protection."
},
"folder_id": {
"type": [
"string",
"null"
],
"description": "Move into a folder id, or null to un-file."
},
"lock_hint": {
"type": [
"string",
"null"
],
"description": "Optional hint shown on the unlock page, e.g. \"Ask at the bar\". Max 60 characters."
},
"destination": {
"type": "string",
"description": "New http(s) URL."
},
"pause_until": {
"type": [
"string",
"null"
],
"description": "ISO 8601 timestamp: schedule a pause until then (scanners see the inactive page; the code self-resumes at the deadline). Pass null to clear the schedule. Future timestamps only, active codes only."
},
"ios_destination": {
"type": [
"string",
"null"
],
"description": "App links: iOS scanners follow this http(s) URL instead of destination (e.g. the App Store page). Pass null to clear. Applies to the plain redirect only."
},
"android_destination": {
"type": [
"string",
"null"
],
"description": "App links: Android scanners follow this http(s) URL instead of destination (e.g. the Google Play page). Pass null to clear."
}
}
}