QivoQR code studio
Create QR code

For integrations

A QR code in a single request

Add QR code generation to your service. Send content and design settings through GET and receive a PNG or SVG without an additional scan check.

Free. Forever.PNG, SVG and API — no fees or subscriptions.

Direct QR codes. No redirects. No expiry.

GEThttps://qivo.umind.group/

Request and authentication

Pass your key in the X-API-Key header. Editor sessions and cookies are not required. QIVO_API_KEY in this example is a client environment variable containing your key.

curl example
curl --fail --show-error --get 'https://qivo.umind.group/' \
  --header "X-API-Key: $QIVO_API_KEY" \
  --data-urlencode 'data=https://umind.group' \
  --data-urlencode 'contentType=url' \
  --data-urlencode 'format=svg' \
  --data-urlencode 'shape=rounded' \
  --data-urlencode 'size=1024' \
  --output qr-code.svg

If your integration accepts only a URL, pass the key in the key parameter:

GET URL example
https://qivo.umind.group/?key=YOUR_SECRET_KEY&data=https%3A%2F%2Fumind.group&format=png&size=1024

Replace YOUR_SECRET_KEY with your key. The header takes precedence over the key parameter. URL-encode parameter values: # → %23, + → %2B, and & within a value → %26.

Use HTTPS and keep the key on your server. Do not put it in public JavaScript. Keys and data in GET URLs may appear in browser history or server logs; prefer the header for your key.

Code examples

Run these examples on your server. Store the key in the QIVO_API_KEY environment variable; do not publish it in page code.

qr-code.php
<?php
$key = getenv('QIVO_API_KEY');
if (!$key) throw new RuntimeException('Set QIVO_API_KEY');
$query = http_build_query([
    'data' => 'https://umind.group', 'format' => 'svg',
    'shape' => 'rounded', 'size' => 1024,
], '', '&', PHP_QUERY_RFC3986);
$curl = curl_init('https://qivo.umind.group/?' . $query);
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['X-API-Key: ' . $key],
    CURLOPT_TIMEOUT => 30,
]);
$image = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
if ($image === false || $status !== 200) {
    throw new RuntimeException('Qivo request failed: ' . $status);
}
file_put_contents('qr-code.svg', $image);
qr-code.mjs
import { writeFile } from 'node:fs/promises';
const key = process.env.QIVO_API_KEY;
if (!key) throw new Error('Set QIVO_API_KEY');
const url = new URL('https://qivo.umind.group/');
url.search = new URLSearchParams({
  data: 'https://umind.group', format: 'svg',
  shape: 'rounded', size: '1024'
});
const response = await fetch(url, {
  headers: { 'X-API-Key': key },
  signal: AbortSignal.timeout(30000)
});
if (!response.ok) throw new Error(`Qivo request failed: ${response.status}`);
await writeFile('qr-code.svg', Buffer.from(await response.arrayBuffer()));
qr-code.py
import os
from pathlib import Path
from urllib.parse import urlencode
from urllib.request import Request, urlopen

key = os.environ['QIVO_API_KEY']
query = urlencode({
    'data': 'https://umind.group', 'format': 'svg',
    'shape': 'rounded', 'size': 1024,
})
request = Request('https://qivo.umind.group/?' + query,
                  headers={'X-API-Key': key})
# urlopen raises HTTPError for unsuccessful HTTP responses.
with urlopen(request, timeout=30) as response:
    Path('qr-code.svg').write_bytes(response.read())

Design parameters

ParameterTypeRequirementValues
X-API-Key / keystringRequired
Secret key: header or GET parameter
datastringFor text and url
Required content for text/url
contentTypestringOptional
texturlwifivcardwhatsapptelegramphoneviberemailsms
Default: text
formatstringOptional
pngsvg
Default: png
sizeintegerOptional
25651210242048
Default: 1024
shapestringOptional
squaresoftroundeddotsleaf-softleafhorizontalverticalpointednotchedstardiamondxx-roundedplusplus-roundedheartsparkleconfetti
Default: square
borderstringOptional
squarecircleroundedskewdrop-tldrop-brleafleaf-inner-brleaf-circleleaf-inner-tlsquare-circlesoft-tlsoft-brsoft-leafrough
Default: square
centerstringOptional
squarecircleroundedskewroughdrop-tldrop-brleafgearstardiamondxx-roundedplusplus-roundedheart
Default: square
foreground / eyeColorstringOptional
#RRGGBB
Default: #192b39
backgroundstringOptional
#RRGGBB
Default: #ffffff
levelstringOptional
LMQH
Default: M
quietZoneintegerOptional
0–12 modules
Default: 4
logostringOptional
nonewhatsapplinklocationwificredentialemailscanbellmenuscan-mescan-me-v2paypalbitcoinsparkplusdiamond
Default: none
logoScaleintegerOptional
12–30
Default: 24

Codes with a logo automatically use level H. GET supports built-in icons; file uploads and external logo URLs are not supported.

Content types

Fields depend on contentType. For URLs, provide a complete https:// or http:// address. For phone numbers, include the country code.

contentTypeRequired fieldsOptional fields
text / urldata
phone / viberphone
whatsapp / smsphonemessage
telegramtelegram
emailemailsubject, message
wifissid; wifiSecurity≠nopass → wifiPasswordwifiSecurity (WPA), wifiHidden (0)
vcardfirstName / lastNameorganization, jobTitle, phone, email, website, address
Phone example
https://qivo.umind.group/?key=YOUR_SECRET_KEY&contentType=phone&phone=%2B380671234567&format=svg

API responses

A successful response is the image file itself, without a JSON wrapper. Content-Type is image/png or image/svg+xml. Errors are returned as JSON:

JSON
{"error":"Invalid API key."}
  • 200 — Image generated.
  • 401 — Missing or invalid key.
  • 405 — GET is required.
  • 422 — Invalid parameters or missing content.
  • 429 — Rate limit exceeded; Retry-After: 60.
  • 503 — API access is not configured or protection is temporarily unavailable.
  • 500 — Internal generation error.

Limits and validation

The default limit is 60 requests per minute per IP. Encoded content is limited to 800 bytes. PNG output supports up to 2048 × 2048 px. SVG preserves vector shapes.

The API validates parameter formats, size and contrast, but does not run a decoder or check whether the QR scans. Test decorative combinations and printed output with a camera.

Get access

The API is free and will always remain free. Complete the short form to request a secret key.

All three fields are required. The form details will be sent to the Qivo team to review your request and reply.