QR codes
Les routes des QR codes d'une page ou d'un lien réduit, et celle des modèles de l'environnement. Le QR code encode l'adresse courte de l'élément : il reste valable si vous changez la destination ou l'adresse personnalisée.
- POST
/v1/pages/{id}/qr-codeGénérer un QR code - POST
/v1/links/{id}/qr-codeGénérer un QR code - POST
/v1/pages/{id}/qr-code{"template": "none"}Générer sans logo - POST
/v1/links/{id}/qr-code{"template": "none"}Générer sans logo - GET
/v1/pages/{id}/qr-codeLire un QR code - GET
/v1/links/{id}/qr-codeLire un QR code - GET
/v1/pages/{id}/qr-code?format=pngTélécharger le fichier - GET
/v1/links/{id}/qr-code?format=svgTélécharger le fichier - GET
/v1/qr-templatesLister les modèles - POST
/v1/pages/{id}/qr-code{"template": "QRT_…"}Générer avec un de vos modèles - POST
/v1/links/{id}/qr-code{"template": "QRT_…"}Générer avec un de vos modèles
Générer un QR code
POST/v1/pages/{id}/qr-code
POST/v1/links/{id}/qr-code
Sans corps de requête, le QR code est le modèle classique : noir sur blanc, avec le logo TinyLink. Générer de nouveau remplace le QR code précédent. Pour un QR code sans logo ou à vos couleurs, voir les deux blocs suivants. Portée Écriture.
curl -X POST https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code', {
method: 'POST',
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/links/6ac401093831b/qr-code',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"png": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.png",
"svg": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.svg",
"template": "classic",
"shape": "square",
"encoded_url": "https://tnlnk.fr/6ac401093831b&qr"
} Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Le jeton ne porte pas la portée Écriture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Aucune page avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Aucun lien réduit avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Élément bloqué par la modération
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Générer sans logo
POST/v1/pages/{id}/qr-code{"template": "none"}
POST/v1/links/{id}/qr-code{"template": "none"}
template à "none" : noir sur blanc, sans le logo TinyLink. Portée Écriture.
curl -X POST https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_votre_jeton" \
-H "Content-Type: application/json" \
-d '{"template":"none"}'
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_votre_jeton',
'Content-Type': 'application/json',
},
body: JSON.stringify({ template: 'none' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['template' => 'none']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/links/6ac401093831b/qr-code',
headers={'Authorization': 'Bearer tl_votre_jeton'},
json={'template': 'none'},
)
data = response.json()
Réponses possibles
{
"png": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.png",
"svg": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.svg",
"template": "none",
"shape": "square",
"encoded_url": "https://tnlnk.fr/6ac401093831b&qr"
} Le corps n'est pas un objet JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Le jeton ne porte pas la portée Écriture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Aucune page avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Aucun lien réduit avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Élément bloqué par la modération
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Lire un QR code
GET/v1/pages/{id}/qr-code
GET/v1/links/{id}/qr-code
Les adresses du PNG (2048 px) et du SVG. Sans QR code généré, la réponse est 404 qr_code_not_generated. Portée Lecture.
curl https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.get(
'https://api.tinylink.fr/v1/links/6ac401093831b/qr-code',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"png": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.png",
"svg": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.svg",
"template": "classic",
"shape": "square",
"encoded_url": "https://tnlnk.fr/6ac401093831b&qr"
} Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Le jeton ne porte pas la portée Lecture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Aucune page avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Aucun lien réduit avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} L'élément n'a pas encore de QR code
{
"error": {
"code": "qr_code_not_generated",
"message": "No QR code has been generated for this element yet. Use POST on this address to create one."
}
} Élément bloqué ou en cours de vérification
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation: its QR code is not available."
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Télécharger le fichier
GET/v1/pages/{id}/qr-code?format=png
GET/v1/links/{id}/qr-code?format=svg
Avec ?format=png ou ?format=svg, la réponse n'est plus du JSON mais le fichier lui-même (image/png ou image/svg+xml). Portée Lecture.
curl "https://api.tinylink.fr/v1/links/6ac401093831b/qr-code?format=png" \
-H "Authorization: Bearer tl_votre_jeton" \
-o qr-promo.png
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code?format=png', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const image = await response.blob();
$ch = curl_init('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code?format=png');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton'],
]);
file_put_contents('qr-promo.png', curl_exec($ch));
curl_close($ch);
import requests
response = requests.get(
'https://api.tinylink.fr/v1/links/6ac401093831b/qr-code?format=png',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
with open('qr-promo.png', 'wb') as f:
f.write(response.content)
Réponses possibles
(le fichier lui-même : image/png ou image/svg+xml) Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Le jeton ne porte pas la portée Lecture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Aucune page avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Aucun lien réduit avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} L'élément n'a pas encore de QR code
{
"error": {
"code": "qr_code_not_generated",
"message": "No QR code has been generated for this element yet. Use POST on this address to create one."
}
} Élément bloqué ou en cours de vérification
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation: its QR code is not available."
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Lister les modèles
GET/v1/qr-templates
Les modèles utilisables dans template : les deux modèles TinyLink, puis ceux créés dans l'environnement (Bibliothèque, onglet QR codes), avec leur forme (square, rounded ou dots) et leurs couleurs (background, foreground). Les modèles de l'environnement n'apparaissent qu'avec une offre qui les comprend, Pro ou Business. Portée Lecture.
curl https://api.tinylink.fr/v1/qr-templates \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/qr-templates', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/qr-templates');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.get(
'https://api.tinylink.fr/v1/qr-templates',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"data": [
{
"id": "classic",
"name": "TinyLink",
"description": "Black on white, with the TinyLink logo.",
"shape": "square"
},
{
"id": "none",
"name": "No logo",
"description": "Black on white, without a logo.",
"shape": "square"
},
{
"id": "QRT_6a9f2935302bb",
"name": "Charte 2026",
"description": null,
"shape": "rounded",
"background": "#FFFFFF",
"foreground": "#212121"
}
]
} Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Le jeton ne porte pas la portée Lecture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Générer avec un de vos modèles
POST/v1/pages/{id}/qr-code{"template": "QRT_…"}
POST/v1/links/{id}/qr-code{"template": "QRT_…"}
Passez dans template l'identifiant QRT_… rendu par la liste des modèles : le QR code prend sa forme, ses couleurs et son logo, et la réponse le nomme dans template. Le modèle doit appartenir à l'environnement du jeton, et l'offre doit comprendre les modèles ; sinon la réponse est 422 validation_failed. Portée Écriture.
curl -X POST https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_votre_jeton" \
-H "Content-Type: application/json" \
-d '{"template":"QRT_6a9f2935302bb"}'
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_votre_jeton',
'Content-Type': 'application/json',
},
body: JSON.stringify({ template: 'QRT_6a9f2935302bb' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['template' => 'QRT_6a9f2935302bb']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/links/6ac401093831b/qr-code',
headers={'Authorization': 'Bearer tl_votre_jeton'},
json={'template': 'QRT_6a9f2935302bb'},
)
data = response.json()
Réponses possibles
{
"png": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.png",
"svg": "https://content.tinylink.fr/QR_Code/QRCode_6ac4011f7a12f.svg",
"template": "QRT_6a9f2935302bb",
"shape": "rounded",
"encoded_url": "https://tnlnk.fr/6ac401093831b&qr"
} Le corps n'est pas un objet JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Le jeton ne porte pas la portée Écriture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Aucune page avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Aucun lien réduit avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Modèle absent de l'environnement
{
"error": {
"code": "validation_failed",
"message": "Unknown QR code template. Use \"classic\", \"none\" or a template id from GET /v1/qr-templates.",
"details": {
"field": "template"
}
}
} Élément bloqué par la modération
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
}