Códigos QR
Las rutas de los códigos QR de una página o de un enlace corto, y la de las plantillas del espacio de trabajo. El código QR codifica la dirección corta del elemento: sigue siendo válido aunque cambies el destino o la dirección personalizada.
- POST
/v1/pages/{id}/qr-codeGenerar un código QR - POST
/v1/links/{id}/qr-codeGenerar un código QR - POST
/v1/pages/{id}/qr-code{"template": "none"}Generar sin logotipo - POST
/v1/links/{id}/qr-code{"template": "none"}Generar sin logotipo - GET
/v1/pages/{id}/qr-codeLeer un código QR - GET
/v1/links/{id}/qr-codeLeer un código QR - GET
/v1/pages/{id}/qr-code?format=pngDescargar el archivo - GET
/v1/links/{id}/qr-code?format=svgDescargar el archivo - GET
/v1/qr-templatesListar las plantillas - POST
/v1/pages/{id}/qr-code{"template": "QRT_…"}Generar con una de tus plantillas - POST
/v1/links/{id}/qr-code{"template": "QRT_…"}Generar con una de tus plantillas
Generar un código QR
POST/v1/pages/{id}/qr-code
POST/v1/links/{id}/qr-code
Sin cuerpo de petición, el código QR usa la plantilla clásica: negro sobre blanco, con el logotipo de TinyLink. Generarlo de nuevo sustituye al código QR anterior. Para un código QR sin logotipo o con tus colores, mira los dos bloques siguientes. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code', {
method: 'POST',
headers: { Authorization: 'Bearer tl_tu_token' },
});
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_tu_token'],
]);
$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_tu_token'},
)
data = response.json()
Respuestas posibles
{
"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"
} Falta el token en la petición
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token desconocido o revocado
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} El plan del propietario no incluye la 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."
}
} El token no tiene el ámbito Escritura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Ninguna página con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Ningún enlace corto con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Elemento bloqueado por la moderación
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Generar sin logotipo
POST/v1/pages/{id}/qr-code{"template": "none"}
POST/v1/links/{id}/qr-code{"template": "none"}
template en "none": negro sobre blanco, sin el logotipo de TinyLink. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_tu_token" \
-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_tu_token',
'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_tu_token', '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_tu_token'},
json={'template': 'none'},
)
data = response.json()
Respuestas posibles
{
"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"
} El cuerpo no es un objeto JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Falta el token en la petición
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token desconocido o revocado
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} El plan del propietario no incluye la 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."
}
} El token no tiene el ámbito Escritura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Ninguna página con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Ningún enlace corto con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Elemento bloqueado por la moderación
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Leer un código QR
GET/v1/pages/{id}/qr-code
GET/v1/links/{id}/qr-code
Las direcciones del PNG (2048 px) y del SVG. Si no se ha generado ningún código QR, la respuesta es 404 qr_code_not_generated. Ámbito Lectura.
curl https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
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_tu_token'],
]);
$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_tu_token'},
)
data = response.json()
Respuestas posibles
{
"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"
} Falta el token en la petición
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token desconocido o revocado
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} El plan del propietario no incluye la 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."
}
} El token no tiene el ámbito Lectura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Ninguna página con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Ningún enlace corto con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} El elemento aún no tiene código QR
{
"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."
}
} Elemento bloqueado o en comprobación
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation: its QR code is not available."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Descargar el archivo
GET/v1/pages/{id}/qr-code?format=png
GET/v1/links/{id}/qr-code?format=svg
Con ?format=png o ?format=svg, la respuesta ya no es JSON sino el propio archivo (image/png o image/svg+xml). Ámbito Lectura.
curl "https://api.tinylink.fr/v1/links/6ac401093831b/qr-code?format=png" \
-H "Authorization: Bearer tl_tu_token" \
-o qr-promo.png
const response = await fetch('https://api.tinylink.fr/v1/links/6ac401093831b/qr-code?format=png', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
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_tu_token'],
]);
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_tu_token'},
)
with open('qr-promo.png', 'wb') as f:
f.write(response.content)
Respuestas posibles
(le fichier lui-même : image/png ou image/svg+xml) Falta el token en la petición
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token desconocido o revocado
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} El plan del propietario no incluye la 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."
}
} El token no tiene el ámbito Lectura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Ninguna página con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Ningún enlace corto con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} El elemento aún no tiene código QR
{
"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."
}
} Elemento bloqueado o en comprobación
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation: its QR code is not available."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Listar las plantillas
GET/v1/qr-templates
Las plantillas utilizables en template: las dos plantillas de TinyLink y después las creadas en el espacio de trabajo (Biblioteca, pestaña Códigos QR), con su forma (square, rounded o dots) y sus colores (background, foreground). Las plantillas del espacio de trabajo solo aparecen con un plan que las incluya, Pro o Business. Ámbito Lectura.
curl https://api.tinylink.fr/v1/qr-templates \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/qr-templates', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
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_tu_token'],
]);
$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_tu_token'},
)
data = response.json()
Respuestas posibles
{
"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": "Marca 2026",
"description": null,
"shape": "rounded",
"background": "#FFFFFF",
"foreground": "#212121"
}
]
} Falta el token en la petición
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token desconocido o revocado
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} El plan del propietario no incluye la 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."
}
} El token no tiene el ámbito Lectura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Generar con una de tus plantillas
POST/v1/pages/{id}/qr-code{"template": "QRT_…"}
POST/v1/links/{id}/qr-code{"template": "QRT_…"}
Pasa en template el identificador QRT_… devuelto por la lista de plantillas: el código QR adopta su forma, sus colores y su logotipo, y la respuesta lo nombra en template. La plantilla debe pertenecer al espacio de trabajo del token y el plan debe incluir las plantillas; si no, la respuesta es 422 validation_failed. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/links/6ac401093831b/qr-code \
-H "Authorization: Bearer tl_tu_token" \
-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_tu_token',
'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_tu_token', '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_tu_token'},
json={'template': 'QRT_6a9f2935302bb'},
)
data = response.json()
Respuestas posibles
{
"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"
} El cuerpo no es un objeto JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Falta el token en la petición
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token desconocido o revocado
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} El plan del propietario no incluye la 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."
}
} El token no tiene el ámbito Escritura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Ninguna página con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Ningún enlace corto con este identificador o este slug en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Plantilla ausente del espacio de trabajo
{
"error": {
"code": "validation_failed",
"message": "Unknown QR code template. Use \"classic\", \"none\" or a template id from GET /v1/qr-templates.",
"details": {
"field": "template"
}
}
} Elemento bloqueado por la moderación
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
}