Pour les intégrations
Un code QR en une requête
Intégrez la génération à votre service. Envoyez le contenu et le design par GET pour recevoir un PNG ou SVG sans test de lecture supplémentaire.
Gratuit. Pour toujours.PNG, SVG et API — sans frais ni abonnement.
Des codes QR directs. Sans redirection ni expiration.
GEThttps://qivo.umind.group/
Requête et authentification
Passez la clé dans l’en-tête X-API-Key. Aucune session ni cookie de l’éditeur n’est nécessaire. QIVO_API_KEY est une variable d’environnement du client contenant votre clé.
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.svgSi l’intégration accepte seulement une URL, passez la clé dans le paramètre key :
https://qivo.umind.group/?key=YOUR_SECRET_KEY&data=https%3A%2F%2Fumind.group&format=png&size=1024Remplacez YOUR_SECRET_KEY par votre clé. L’en-tête est prioritaire. Encodez les valeurs : # → %23, + → %2B et & dans une valeur → %26.
Utilisez HTTPS et gardez la clé sur votre serveur, jamais dans du JavaScript public. Les URL peuvent figurer dans l’historique ou les journaux ; préférez l’en-tête pour la clé.
Exemples de code
Gardez la clé dans la variable environnementale QIVO_API_KEY ; ne pas la publier dans le code de page.
<?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);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()));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())Paramètres de design
| Paramètre | Type | exigences | Valeurs |
|---|---|---|---|
X-API-Key / key | string | Nécessité | Clé secrète : header ou paramètre GET |
data | string | Pour le texte et l'URL | Contenu requis pour text/url |
contentType | string | Optionnel | texturlwifivcardwhatsapptelegramphoneviberemailsmsPar défaut: text |
format | string | Optionnel | pngsvgPar défaut: png |
size | integer | Optionnel | 25651210242048Par défaut: 1024 |
shape | string | Optionnel | squaresoftroundeddotsleaf-softleafhorizontalverticalpointednotchedstardiamondxx-roundedplusplus-roundedheartsparkleconfettiPar défaut: square |
border | string | Optionnel | squarecircleroundedskewdrop-tldrop-brleafleaf-inner-brleaf-circleleaf-inner-tlsquare-circlesoft-tlsoft-brsoft-leafroughPar défaut: square |
center | string | Optionnel | squarecircleroundedskewroughdrop-tldrop-brleafgearstardiamondxx-roundedplusplus-roundedheartPar défaut: square |
foreground / eyeColor | string | Optionnel | #RRGGBB Par défaut: #192b39 |
background | string | Optionnel | #RRGGBB Par défaut: #ffffff |
level | string | Optionnel | LMQHPar défaut: M |
quietZone | integer | Optionnel | 0–12 modules Par défaut: 4 |
logo | string | Optionnel | nonewhatsapplinklocationwificredentialemailscanbellmenuscan-mescan-me-v2paypalbitcoinsparkplusdiamondPar défaut: none |
logoScale | integer | Optionnel | 12–30 Par défaut: 24 |
Un logo active automatiquement H. GET prend en charge les icônes intégrées, pas les fichiers importés ni les URL de logos externes.
Types de contenu
Les champs dépendent de contentType. Fournissez une URL complète https:// ou http:// et un numéro avec indicatif.
| contentType | Les champs nécessaires | Les champs facultatifs |
|---|---|---|
| text / url | data | — |
| phone / viber | phone | — |
| whatsapp / sms | phone | message |
| telegram | telegram | — |
| subject, message | ||
| wifi | ssid; wifiSecurity≠nopass → wifiPassword | wifiSecurity (WPA), wifiHidden (0) |
| vcard | firstName / lastName | organization, jobTitle, phone, email, website, address |
https://qivo.umind.group/?key=YOUR_SECRET_KEY&contentType=phone&phone=%2B380671234567&format=svgRéponses de l’API
La réponse réussie est le fichier image, sans enveloppe JSON. Content-Type : image/png ou image/svg+xml. Les erreurs sont en JSON :
{"error":"Invalid API key."}- 200 — Image générée.
- 401 — Clé absente ou invalide.
- 405 — GET est requis.
- 422 — Paramètres invalides ou contenu absent.
- 429 — Limite dépassée ; Retry-After: 60.
- 503 — API non configurée ou protection temporairement indisponible.
- 500 — Erreur interne de génération.
Limites et validation
Limite par défaut : 60 requêtes par minute et par IP, 800 octets encodés maximum et PNG jusqu’à 2048 × 2048 px. SVG conserve les formes vectorielles.
L’API valide les paramètres, la taille et le contraste, sans lancer de décodeur. Testez les designs décoratifs et les impressions avec un appareil photo.