Páginas y enlaces de una página
Todas las rutas de las páginas y de sus enlaces, con un ejemplo de petición y la respuesta devuelta en cada una. Una página se designa por su identificador o por su dirección personalizada (slug).
- GET
/v1/pagesListar las páginas - POST
/v1/pagesCrear una página - GET
/v1/pages/{id}Leer una página - PATCH
/v1/pages/{id}Modificar una página - DELETE
/v1/pages/{id}Eliminar una página - GET
/v1/pages/{id}/linksListar los enlaces de una página - POST
/v1/pages/{id}/linksAñadir un enlace - GET
/v1/pages/{id}/links/{lien}Leer un enlace - PATCH
/v1/pages/{id}/links/{lien}Modificar un enlace - DELETE
/v1/pages/{id}/links/{lien}Eliminar un enlace
Listar las páginas
GET/v1/pages
Las páginas del espacio de trabajo, de la más reciente a la más antigua. Ámbito Lectura.
?search=: busca en el nombre, la dirección personalizada y el identificador?tag=: identificador de una etiqueta; solo las páginas que la llevan?page=y?per_page=: paginación, 50 por página por defecto, 100 como máximo
curl "https://api.tinylink.fr/v1/pages?per_page=2" \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages?per_page=2', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages?per_page=2');
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/pages?per_page=2',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"id": "P6ac40109381964",
"type": "page",
"name": "Mi página",
"description": "Todos mis enlaces en un solo sitio.",
"slug": "ma-page",
"url": "https://tnylnk.fr/ma-page",
"status": "active",
"password_protected": false,
"restricted": false,
"tags": [],
"qr_code": null,
"created_at": "2026-10-05T21:56:57+02:00",
"edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964"
}
],
"pagination": {
"page": 1,
"per_page": 2,
"total": 1,
"total_pages": 1
}
} 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."
}
} Crear una página
POST/v1/pages
name es obligatorio. La respuesta es la página creada, con sus enlaces. Ámbito Escritura.
name: el nombre de la página, 100 caracteres como máximodescription: 2000 caracteres como máximoslug: la dirección personalizada; letras, números,-,_y., 40 caracteres como máximopassword: protege la página con una contraseñatags: lista de identificadores de etiquetas del espacio de trabajoqr_code:truepara el código QR clásico, o el identificador de una plantillalinks: enlaces que añadir de una vez (100 como máximo), descritos como en «Añadir un enlace»
curl -X POST https://api.tinylink.fr/v1/pages \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Mi página",
"slug": "mi-pagina",
"links": [
{
"title": "Mi sitio",
"url": "https://exemple.fr"
},
{
"title": "Contact",
"url": "bonjour@exemple.fr"
}
]
}'
const response = await fetch('https://api.tinylink.fr/v1/pages', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Mi página',
slug: 'mi-pagina',
links: [
{ title: 'Mi sitio', url: 'https://exemple.fr' },
{ title: 'Contact', url: 'bonjour@exemple.fr' },
],
}),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages');
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([
'name' => 'Mi página',
'slug' => 'mi-pagina',
'links' => [
['title' => 'Mi sitio', 'url' => 'https://exemple.fr'],
['title' => 'Contact', 'url' => 'bonjour@exemple.fr'],
],
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/pages',
headers={'Authorization': 'Bearer tl_tu_token'},
json={
'name': 'Mi página',
'slug': 'mi-pagina',
'links': [
{'title': 'Mi sitio', 'url': 'https://exemple.fr'},
{'title': 'Contact', 'url': 'bonjour@exemple.fr'},
],
},
)
data = response.json()
Respuestas posibles
{
"id": "P6ac40109381964",
"type": "page",
"name": "Mi página",
"description": "",
"slug": "ma-page",
"url": "https://tnylnk.fr/ma-page",
"status": "active",
"password_protected": false,
"restricted": false,
"tags": [],
"qr_code": null,
"created_at": "2026-10-05T21:56:57+02:00",
"edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
"links": [
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
},
{
"id": "L6ac4011ee9fab",
"title": "Contact",
"description": "",
"url": "bonjour@exemple.fr",
"type": "email",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
}
]
} 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."
}
} Número de páginas del plan alcanzado
{
"error": {
"code": "plan_limit_reached",
"message": "The page limit of the plan has been reached."
}
} 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"
}
}
} Dirección personalizada ya utilizada por una página o un enlace
{
"error": {
"code": "slug_taken",
"message": "This slug is already taken.",
"details": {
"field": "slug"
}
}
} Campo obligatorio ausente o vacío
{
"error": {
"code": "validation_failed",
"message": "The \"name\" field is required.",
"details": {
"field": "name"
}
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Leer una página
GET/v1/pages/{id}
La página y sus enlaces, en el orden de visualización; los enlaces archivados van al final. Ámbito Lectura.
curl https://api.tinylink.fr/v1/pages/mi-pagina \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/mi-pagina', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/mi-pagina');
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/pages/mi-pagina',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"id": "P6ac40109381964",
"type": "page",
"name": "Mi página",
"description": "Todos mis enlaces en un solo sitio.",
"slug": "ma-page",
"url": "https://tnylnk.fr/ma-page",
"status": "active",
"password_protected": false,
"restricted": false,
"tags": [],
"qr_code": null,
"created_at": "2026-10-05T21:56:57+02:00",
"edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
"links": [
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
},
{
"id": "L6ac4011ee9fab",
"title": "Contact",
"description": "",
"url": "bonjour@exemple.fr",
"type": "email",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
}
]
} 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."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Modificar una página
PATCH/v1/pages/{id}
Envía solo los campos que quieras cambiar: name, description, slug, password. null quita la dirección personalizada o la contraseña. La respuesta es la página actualizada. Ámbito Escritura.
curl -X PATCH https://api.tinylink.fr/v1/pages/P6ac40109381964 \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{
"description": "Todos mis enlaces en un solo sitio.",
"password": null
}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964', {
method: 'PATCH',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
description: 'Todos mis enlaces en un solo sitio.',
password: null,
}),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_tu_token', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'description' => 'Todos mis enlaces en un solo sitio.',
'password' => null,
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.patch(
'https://api.tinylink.fr/v1/pages/P6ac40109381964',
headers={'Authorization': 'Bearer tl_tu_token'},
json={
'description': 'Todos mis enlaces en un solo sitio.',
'password': None,
},
)
data = response.json()
Respuestas posibles
{
"id": "P6ac40109381964",
"type": "page",
"name": "Mi página",
"description": "Todos mis enlaces en un solo sitio.",
"slug": "ma-page",
"url": "https://tnylnk.fr/ma-page",
"status": "active",
"password_protected": false,
"restricted": false,
"tags": [],
"qr_code": null,
"created_at": "2026-10-05T21:56:57+02:00",
"edit_url": "https://app.tinylink.fr/page-edit?id=P6ac40109381964",
"links": [
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
},
{
"id": "L6ac4011ee9fab",
"title": "Contact",
"description": "",
"url": "bonjour@exemple.fr",
"type": "email",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
}
]
} 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."
}
} Dirección personalizada ya utilizada por una página o un enlace
{
"error": {
"code": "slug_taken",
"message": "This slug is already taken.",
"details": {
"field": "slug"
}
}
} Ningún campo modificable en el cuerpo
{
"error": {
"code": "validation_failed",
"message": "Nothing to update. Accepted fields: name, description, slug, password."
}
} 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."
}
} Eliminar una página
DELETE/v1/pages/{id}
Elimina la página, sus enlaces y sus estadísticas. Irreversible. Ámbito Eliminación.
curl -X DELETE https://api.tinylink.fr/v1/pages/P6ac40109381964 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964', {
method: 'DELETE',
headers: { Authorization: 'Bearer tl_tu_token' },
});
console.log(response.status); // 204
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_tu_token'],
]);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); // 204
curl_close($ch);
import requests
response = requests.delete(
'https://api.tinylink.fr/v1/pages/P6ac40109381964',
headers={'Authorization': 'Bearer tl_tu_token'},
)
print(response.status_code) # 204
Respuestas posibles
Sin contenido
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 Eliminación
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"delete\" scope.",
"details": {
"required_scope": "delete"
}
}
} 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."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Listar los enlaces de una página
GET/v1/pages/{id}/links
Los enlaces de la página, en el orden de visualización. type vale url, email, tel o title; status vale active, pending_review o blocked. Ámbito Lectura.
curl https://api.tinylink.fr/v1/pages/P6ac40109381964/links \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964/links', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964/links');
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/pages/P6ac40109381964/links',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
},
{
"id": "L6ac4011eeb074",
"title": "Mis redes",
"description": "",
"url": null,
"type": "title",
"format": "TITLE",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
}
]
} 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."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Añadir un enlace
POST/v1/pages/{id}/links
Añade un enlace al final de la página, o varios con {"links": [ … ]} (100 como máximo): la respuesta es entonces {"data": [ … ]}. Los límites de enlaces de tu plan se aplican igual que en la aplicación. Ámbito Escritura.
title: obligatorio, salvo para el formatoSOCIAL; 100 caracteres como máximourl: una dirección web, un correo electrónico o un teléfono, con o sinmailto:/tel:; innecesario para unTITLEdescription: 1000 caracteres como máximoformat:LIST(por defecto),BANNER,SQUARE,SOCIAL, oTITLEpara un título de secciónsize:FULL(por defecto) oHALF, paraLIST,BANNERySQUAREvisible:falsepara añadirlo ocultoposition: posición en la página, 1 = arriba
curl -X POST https://api.tinylink.fr/v1/pages/P6ac40109381964/links \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{"title":"Mi sitio","url":"https://exemple.fr"}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964/links', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({ title: 'Mi sitio', url: 'https://exemple.fr' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964/links');
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(['title' => 'Mi sitio', 'url' => 'https://exemple.fr']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/pages/P6ac40109381964/links',
headers={'Authorization': 'Bearer tl_tu_token'},
json={'title': 'Mi sitio', 'url': 'https://exemple.fr'},
)
data = response.json()
Respuestas posibles
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
} 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."
}
} Número de enlaces por página del plan alcanzado
{
"error": {
"code": "plan_limit_reached",
"message": "The plan allows 50 links per page (50 already used).",
"details": {
"max": 50,
"used": 50
}
}
} 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."
}
} Campo obligatorio ausente o vacío
{
"error": {
"code": "validation_failed",
"message": "The \"title\" field is required.",
"details": {
"field": "title"
}
}
} Ni dirección web, ni correo electrónico, ni teléfono
{
"error": {
"code": "invalid_url",
"message": "This is not a valid web address, e-mail address or phone number.",
"details": {
"field": "url"
}
}
} Dominio señalado como sospechoso
{
"error": {
"code": "suspicious_url",
"message": "This address is on our list of suspicious domains and cannot be used.",
"details": {
"field": "url"
}
}
} 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 enlace
GET/v1/pages/{id}/links/{lien}
Un solo enlace de la página, por su identificador. Ámbito Lectura.
curl https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6');
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/pages/P6ac40109381964/links/L6ac4011edb7c6',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
} 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 con este identificador en la página
{
"error": {
"code": "not_found",
"message": "Link not found on this page."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Modificar un enlace
PATCH/v1/pages/{id}/links/{lien}
Envía solo los campos que quieras cambiar: title, description, url, format, size, visible (ocultar o mostrar), archived (archivar o desarchivar) y position (mover). Un componente o un bloque de integración solo puede ocultarse, archivarse o moverse. Ámbito Escritura.
curl -X PATCH https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6 \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{"title":"Mi sitio web","position":2,"visible":false}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6', {
method: 'PATCH',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({ title: 'Mi sitio web', position: 2, visible: false }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_tu_token', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['title' => 'Mi sitio web', 'position' => 2, 'visible' => false]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.patch(
'https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6',
headers={'Authorization': 'Bearer tl_tu_token'},
json={'title': 'Mi sitio web', 'position': 2, 'visible': False},
)
data = response.json()
Respuestas posibles
{
"id": "L6ac4011edb7c6",
"title": "Mi sitio web",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": false,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-05T21:57:18+02:00"
} 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 con este identificador en la página
{
"error": {
"code": "not_found",
"message": "Link not found on this page."
}
} Ningún campo modificable en el cuerpo
{
"error": {
"code": "validation_failed",
"message": "Nothing to update. Accepted fields: title, description, url, format, size, visible, archived, position."
}
} Ni dirección web, ni correo electrónico, ni teléfono
{
"error": {
"code": "invalid_url",
"message": "This is not a valid web address, e-mail address or phone number.",
"details": {
"field": "url"
}
}
} 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."
}
} Eliminar un enlace
DELETE/v1/pages/{id}/links/{lien}
Elimina el enlace, su imagen y sus estadísticas, y renumera los siguientes. Ámbito Eliminación.
curl -X DELETE https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6', {
method: 'DELETE',
headers: { Authorization: 'Bearer tl_tu_token' },
});
console.log(response.status); // 204
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_tu_token'],
]);
curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE); // 204
curl_close($ch);
import requests
response = requests.delete(
'https://api.tinylink.fr/v1/pages/P6ac40109381964/links/L6ac4011edb7c6',
headers={'Authorization': 'Bearer tl_tu_token'},
)
print(response.status_code) # 204
Respuestas posibles
Sin contenido
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 Eliminación
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"delete\" scope.",
"details": {
"required_scope": "delete"
}
}
} 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 con este identificador en la página
{
"error": {
"code": "not_found",
"message": "Link not found on this page."
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
}