Componentes
Un componente es un bloque de enlaces y títulos compartido entre las páginas de un espacio de trabajo: colocado en tres páginas, se muestra igual en todas, y modificarlo las modifica todas. Sus enlaces se gestionan con las mismas rutas que los de una página. Crear, duplicar o colocar un componente depende del plan.
- GET
/v1/componentsListar los componentes - POST
/v1/componentsCrear un componente - GET
/v1/components/{id}Leer un componente - PATCH
/v1/components/{id}Modificar un componente - POST
/v1/components/{id}/duplicateDuplicar un componente - DELETE
/v1/components/{id}Eliminar un componente - GET
/v1/components/{id}/linksGestionar los enlaces de un componente - POST
/v1/components/{id}/linksGestionar los enlaces de un componente - PATCH
/v1/components/{id}/linksGestionar los enlaces de un componente - PUT
/v1/components/{id}/links/orderGestionar los enlaces de un componente - GET
/v1/components/{id}/links/{lien}Gestionar los enlaces de un componente - PATCH
/v1/components/{id}/links/{lien}Gestionar los enlaces de un componente - DELETE
/v1/components/{id}/links/{lien}Gestionar los enlaces de un componente - PUT
/v1/components/{id}/links/{lien}/imageGestionar los enlaces de un componente - GET
/v1/pages/{id}/componentsListar los componentes de una página - POST
/v1/pages/{id}/componentsColocar un componente en una página - DELETE
/v1/pages/{id}/components/{componente}Quitar un componente de una página - POST
/v1/pages/{id}/components/{componente}/detachDesvincular un componente
Listar los componentes
GET/v1/components
Los componentes del espacio de trabajo, por orden alfabético. links_count cuenta los enlaces no archivados, pages_count las páginas donde está colocado el componente. Ámbito Lectura.
curl https://api.tinylink.fr/v1/components \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/components', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/components');
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/components',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"id": "C6ad34a13d28745",
"name": "Mes réseaux",
"description": "Les mêmes liens sur toutes mes pages",
"links_count": 2,
"pages_count": 0,
"created_at": "2026-10-17T12:12:35+02:00",
"edit_url": "https://app.tinylink.fr/component-edit?id=C6ad34a13d28745"
}
]
} 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 un componente
POST/v1/components
name es obligatorio (100 caracteres como máximo), description opcional (500 como máximo). links añade de una vez hasta 100 enlaces, descritos como en una página. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/components \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{
"name": "Mes réseaux",
"description": "Les mêmes liens sur toutes mes pages",
"links": [
{
"title": "Instagram",
"url": "https://instagram.com/exemple"
},
{
"title": "YouTube",
"url": "https://youtube.com/@exemple"
}
]
}'
const response = await fetch('https://api.tinylink.fr/v1/components', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Mes réseaux',
description: 'Les mêmes liens sur toutes mes pages',
links: [
{ title: 'Instagram', url: 'https://instagram.com/exemple' },
{ title: 'YouTube', url: 'https://youtube.com/@exemple' },
],
}),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/components');
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' => 'Mes réseaux',
'description' => 'Les mêmes liens sur toutes mes pages',
'links' => [
[
'title' => 'Instagram',
'url' => 'https://instagram.com/exemple',
],
['title' => 'YouTube', 'url' => 'https://youtube.com/@exemple'],
],
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/components',
headers={'Authorization': 'Bearer tl_tu_token'},
json={
'name': 'Mes réseaux',
'description': 'Les mêmes liens sur toutes mes pages',
'links': [
{'title': 'Instagram', 'url': 'https://instagram.com/exemple'},
{'title': 'YouTube', 'url': 'https://youtube.com/@exemple'},
],
},
)
data = response.json()
Respuestas posibles
{
"id": "C6ad34a13d28745",
"name": "Mes réseaux",
"description": "Les mêmes liens sur toutes mes pages",
"links_count": 2,
"pages_count": 0,
"created_at": "2026-10-17T12:12:35+02:00",
"edit_url": "https://app.tinylink.fr/component-edit?id=C6ad34a13d28745",
"links": [
{
"id": "L6ad34a13d2956",
"title": "Instagram",
"description": "",
"url": "https://instagram.com/exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+02:00"
},
{
"id": "L6ad34a13d2dcb",
"title": "YouTube",
"description": "",
"url": "https://youtube.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+02:00"
}
],
"pages": []
} 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 los componentes
{
"error": {
"code": "plan_feature_unavailable",
"message": "Components are not included in the plan of this environment's owner."
}
} 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"
}
}
} Campo obligatorio ausente o vacío
{
"error": {
"code": "validation_failed",
"message": "The \"name\" field is required.",
"details": {
"field": "name"
}
}
} 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"
}
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Leer un componente
GET/v1/components/{id}
El componente, sus enlaces en el orden de visualización y las páginas donde está colocado. Ámbito Lectura.
curl https://api.tinylink.fr/v1/components/C6ad34a13d28745 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/components/C6ad34a13d28745', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/components/C6ad34a13d28745');
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/components/C6ad34a13d28745',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"id": "C6ad34a13d28745",
"name": "Mes réseaux",
"description": "Les mêmes liens sur toutes mes pages",
"links_count": 2,
"pages_count": 0,
"created_at": "2026-10-17T12:12:35+02:00",
"edit_url": "https://app.tinylink.fr/component-edit?id=C6ad34a13d28745",
"links": [
{
"id": "L6ad34a13d2956",
"title": "Instagram",
"description": "",
"url": "https://instagram.com/exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+02:00"
},
{
"id": "L6ad34a13d2dcb",
"title": "YouTube",
"description": "",
"url": "https://youtube.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+02:00"
}
],
"pages": []
} 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"
}
}
} Ningún componente con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Component 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 un componente
PATCH/v1/components/{id}
name, description, o ambos. Ámbito Escritura.
curl -X PATCH https://api.tinylink.fr/v1/components/C6ad34a13d28745 \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{"name":"Réseaux sociaux"}'
const response = await fetch('https://api.tinylink.fr/v1/components/C6ad34a13d28745', {
method: 'PATCH',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'Réseaux sociaux' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/components/C6ad34a13d28745');
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(['name' => 'Réseaux sociaux']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.patch(
'https://api.tinylink.fr/v1/components/C6ad34a13d28745',
headers={'Authorization': 'Bearer tl_tu_token'},
json={'name': 'Réseaux sociaux'},
)
data = response.json()
Respuestas posibles
{
"id": "C6ad34a13d28745",
"name": "Réseaux sociaux",
"description": "Les mêmes liens sur toutes mes pages",
"links_count": 2,
"pages_count": 0,
"created_at": "2026-10-17T12:12:35+02:00",
"edit_url": "https://app.tinylink.fr/component-edit?id=C6ad34a13d28745",
"links": [
{
"id": "L6ad34a13d2956",
"title": "Instagram",
"description": "",
"url": "https://instagram.com/exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+02:00"
},
{
"id": "L6ad34a13d2dcb",
"title": "YouTube",
"description": "",
"url": "https://youtube.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+02:00"
}
],
"pages": []
} 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"
}
}
} Ningún componente con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Component not found in this environment."
}
} Ningún campo modificable en el cuerpo
{
"error": {
"code": "validation_failed",
"message": "Nothing to update. Accepted fields: name, description."
}
} 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."
}
} Duplicar un componente
POST/v1/components/{id}/duplicate
Copia el componente y sus enlaces no archivados, imágenes incluidas, con el nombre name (por defecto: el nombre seguido de «(copy)»). La copia no está colocada en ninguna página. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/components/C6ad34a13d28745/duplicate \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{"name":"Réseaux (copie)"}'
const response = await fetch('https://api.tinylink.fr/v1/components/C6ad34a13d28745/duplicate', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({ name: 'Réseaux (copie)' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/components/C6ad34a13d28745/duplicate');
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' => 'Réseaux (copie)']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/components/C6ad34a13d28745/duplicate',
headers={'Authorization': 'Bearer tl_tu_token'},
json={'name': 'Réseaux (copie)'},
)
data = response.json()
Respuestas posibles
{
"id": "C6ad34a1406db15",
"name": "Réseaux (copie)",
"description": "Les mêmes liens sur toutes mes pages",
"links_count": 3,
"pages_count": 0,
"created_at": "2026-10-17T12:12:36+02:00",
"edit_url": "https://app.tinylink.fr/component-edit?id=C6ad34a1406db15",
"links": [
{
"id": "L6ad34a1406fb3",
"title": "Instagram",
"description": "",
"url": "https://instagram.com/exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00"
},
{
"id": "L6ad34a14070bb",
"title": "YouTube",
"description": "",
"url": "https://youtube.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00"
},
{
"id": "L6ad34a14071a7",
"title": "TikTok",
"description": "",
"url": "https://tiktok.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 3,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00"
}
],
"pages": []
} 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 los componentes
{
"error": {
"code": "plan_feature_unavailable",
"message": "Components are not included in the plan of this environment's owner."
}
} 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"
}
}
} Ningún componente con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Component 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."
}
} Eliminar un componente
DELETE/v1/components/{id}
Elimina el componente, sus enlaces y sus estadísticas, y lo quita de todas las páginas donde estaba colocado. Irreversible. Ámbito Eliminación.
curl -X DELETE https://api.tinylink.fr/v1/components/C6ad34a13d28745 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/components/C6ad34a13d28745', {
method: 'DELETE',
headers: { Authorization: 'Bearer tl_tu_token' },
});
console.log(response.status); // 204
$ch = curl_init('https://api.tinylink.fr/v1/components/C6ad34a13d28745');
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/components/C6ad34a13d28745',
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"
}
}
} Ningún componente con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Component 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."
}
} Gestionar los enlaces de un componente
GET/v1/components/{id}/links
POST/v1/components/{id}/links
PATCH/v1/components/{id}/links
PUT/v1/components/{id}/links/order
GET/v1/components/{id}/links/{lien}
PATCH/v1/components/{id}/links/{lien}
DELETE/v1/components/{id}/links/{lien}
PUT/v1/components/{id}/links/{lien}/image
Mismas rutas, mismos campos y mismas respuestas que los enlaces de una página, sustituyendo /pages/{id} por /components/{id}: añadir (uno o varios), leer, modificar, modificación en lote, nuevo orden, imagen, eliminar. Un componente también admite bloques de integración. Ámbito según el método.
curl -X POST https://api.tinylink.fr/v1/components/C6ad34a13d28745/links \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{"title":"TikTok","url":"https://tiktok.com/@exemple"}'
const response = await fetch('https://api.tinylink.fr/v1/components/C6ad34a13d28745/links', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({ title: 'TikTok', url: 'https://tiktok.com/@exemple' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/components/C6ad34a13d28745/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' => 'TikTok', 'url' => 'https://tiktok.com/@exemple']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/components/C6ad34a13d28745/links',
headers={'Authorization': 'Bearer tl_tu_token'},
json={'title': 'TikTok', 'url': 'https://tiktok.com/@exemple'},
)
data = response.json()
Respuestas posibles
{
"id": "L6ad34a13f2dcd",
"title": "TikTok",
"description": "",
"url": "https://tiktok.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 3,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:35+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 Lectura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Ningún componente con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Component not found in this environment."
}
} Ningún enlace con este identificador en el componente
{
"error": {
"code": "not_found",
"message": "Link not found in this component."
}
} 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"
}
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Listar los componentes de una página
GET/v1/pages/{id}/components
Los componentes colocados en la página: para cada uno, su bloque en la página (block, con su posición y su visibilidad) y el propio componente. El bloque también aparece en GET /v1/pages/{id}/links, con type: "component" y component_id. Ámbito Lectura.
curl https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components');
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/P6ad34a0e4fef09/components',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"block": {
"id": "L6ad34a140effd",
"title": "Réseaux sociaux",
"description": null,
"url": null,
"type": "component",
"format": "COMPONENT",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00",
"component_id": "C6ad34a13d28745"
},
"component": {
"id": "C6ad34a13d28745",
"name": "Réseaux sociaux",
"description": "Les mêmes liens sur toutes mes pages",
"links_count": 3,
"pages_count": 1,
"created_at": "2026-10-17T12:12:35+02:00",
"edit_url": "https://app.tinylink.fr/component-edit?id=C6ad34a13d28745"
}
}
]
} 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."
}
} Colocar un componente en una página
POST/v1/pages/{id}/components
component_id es obligatorio; el componente debe ser del espacio de trabajo de la página y no estar ya en ella. position lo coloca (1 = arriba); si no, va abajo. La respuesta es el bloque creado en la página; se oculta, se archiva y se mueve como un enlace. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{"component_id":"C6ad34a13d28745","position":1}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({ component_id: 'C6ad34a13d28745', position: 1 }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components');
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(['component_id' => 'C6ad34a13d28745', 'position' => 1]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components',
headers={'Authorization': 'Bearer tl_tu_token'},
json={'component_id': 'C6ad34a13d28745', 'position': 1},
)
data = response.json()
Respuestas posibles
{
"id": "L6ad34a140effd",
"title": "Réseaux sociaux",
"description": null,
"url": null,
"type": "component",
"format": "COMPONENT",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00",
"component_id": "C6ad34a13d28745"
} 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 los componentes
{
"error": {
"code": "plan_feature_unavailable",
"message": "Components are not included in the plan of this environment's owner."
}
} 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."
}
} Componente ya presente en la página
{
"error": {
"code": "component_already_on_page",
"message": "This component is already on this page.",
"details": {
"field": "component_id"
}
}
} Componente ausente del espacio de trabajo
{
"error": {
"code": "validation_failed",
"message": "Component not found in this environment.",
"details": {
"field": "component_id"
}
}
} 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."
}
} Quitar un componente de una página
DELETE/v1/pages/{id}/components/{componente}
Quita el componente de la página, sin tocar el componente ni sus enlaces. Ámbito Eliminación.
curl -X DELETE https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components/C6ad34a1406db15 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components/C6ad34a1406db15', {
method: 'DELETE',
headers: { Authorization: 'Bearer tl_tu_token' },
});
console.log(response.status); // 204
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components/C6ad34a1406db15');
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/P6ad34a0e4fef09/components/C6ad34a1406db15',
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."
}
} El componente no está en la página
{
"error": {
"code": "not_found",
"message": "This component is not on this page."
}
} 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."
}
} Desvincular un componente
POST/v1/pages/{id}/components/{componente}/detach
Sustituye el componente por una copia de sus enlaces, en su lugar y en el mismo orden (ocultos y archivados incluidos, imágenes duplicadas): pasan a ser enlaces normales de la página, que ya no seguirán los cambios del componente. El componente no se toca. La respuesta es la lista de enlaces de la página. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components/C6ad34a13d28745/detach \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components/C6ad34a13d28745/detach', {
method: 'POST',
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/components/C6ad34a13d28745/detach');
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/pages/P6ad34a0e4fef09/components/C6ad34a13d28745/detach',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"id": "L6ad34a1426b80",
"title": "Instagram",
"description": "",
"url": "https://instagram.com/exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00"
},
{
"id": "L6ad34a1426bd5",
"title": "YouTube",
"description": "",
"url": "https://youtube.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00"
},
{
"id": "L6ad34a1426c29",
"title": "TikTok",
"description": "",
"url": "https://tiktok.com/@exemple",
"type": "url",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 3,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:36+02:00"
},
{
"id": "L6ad34a0e849a2",
"title": "Mes réseaux",
"description": "",
"url": null,
"type": "title",
"format": "TITLE",
"size": "FULL",
"visible": true,
"archived": false,
"position": 4,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:30+02:00"
},
{
"id": "L6ad34a0e84122",
"title": "Mon site",
"description": "",
"url": "https://exemple.fr",
"type": "url",
"format": "BANNER",
"size": "HALF",
"visible": true,
"archived": false,
"position": 5,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:30+02:00"
},
{
"id": "L6ad34a0e8467f",
"title": "Ma boutique",
"description": "",
"url": "https://exemple.fr/boutique",
"type": "url",
"format": "BANNER",
"size": "HALF",
"visible": true,
"archived": false,
"position": 6,
"status": "active",
"image": null,
"created_at": "2026-10-17T12:12:30+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 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."
}
} El componente no está en la página
{
"error": {
"code": "not_found",
"message": "This component is not on this page."
}
} 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."
}
}