Integraciones
Las cuentas conectadas en Biblioteca → Integraciones (YouTube, Shopify, Instagram, RSS…) alimentan bloques de página que se actualizan solos: el último vídeo, un producto, el próximo evento. La conexión de una cuenta se hace en la aplicación; la API las lee y coloca sus bloques, en una página o en un componente.
- GET
/v1/integrationsListar las integraciones - GET
/v1/integrations/{id}Leer una integración - GET
/v1/integrations/{id}/elements?source=Listar los elementos de una fuente - POST
/v1/pages/{id}/linksAñadir un bloque de integración - POST
/v1/pages/{id}/linksBloque de un elemento concreto - PATCH
/v1/pages/{id}/links/{enlace}Modificar un bloque de integración
Listar las integraciones
GET/v1/integrations
Las cuentas conectadas del espacio de trabajo, la más reciente primero. status vale active, reconnect_required (autorización que renovar en la aplicación) o error; suspended indica una cuenta por encima del límite del plan; used dice si un bloque la muestra. Ámbito Lectura.
curl https://api.tinylink.fr/v1/integrations \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/integrations');
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/integrations',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"id": "Int_6aac6c7feedf0",
"platform": "youtube",
"platform_name": "YouTube",
"name": "Axton",
"handle": "@axton_99",
"profile_url": "https://www.youtube.com/@axton_99",
"status": "active",
"suspended": false,
"used": false,
"last_synced_at": "2026-10-17T12:10:33+02:00",
"created_at": "2026-09-18T00:41:03+02:00"
},
{
"id": "Int_6aa862f59643e",
"platform": "shopify",
"platform_name": "Shopify",
"name": "POW'HER",
"handle": "powher.shop",
"profile_url": "https://powher.shop",
"status": "active",
"suspended": false,
"used": true,
"last_synced_at": "2026-10-17T12:10:54+02:00",
"created_at": "2026-09-14T23:11:17+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"
}
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Leer una integración
GET/v1/integrations/{id}
La cuenta y sus sources: para cada una, sus variables (fields, para citar en las plantillas), su plantilla por defecto y lo que pide: none, rank (un rango, de 1 a 5) o required (un elemento concreto). Ámbito Lectura.
curl https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0 \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0');
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/integrations/Int_6aac6c7feedf0',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"id": "Int_6aac6c7feedf0",
"platform": "youtube",
"platform_name": "YouTube",
"name": "Axton",
"handle": "@axton_99",
"profile_url": "https://www.youtube.com/@axton_99",
"status": "active",
"suspended": false,
"used": false,
"last_synced_at": "2026-10-17T12:10:33+02:00",
"created_at": "2026-09-18T00:41:03+02:00",
"sources": [
{
"id": "chaine",
"label": "The channel",
"element": "none",
"fields": [
{
"name": "name",
"label": "Name",
"type": "text"
},
{
"name": "handle",
"label": "Handle",
"type": "text"
},
{
"name": "description",
"label": "Description",
"type": "text"
},
{
"name": "subscribers",
"label": "Subscribers",
"type": "number"
},
{
"name": "videos",
"label": "Number of videos",
"type": "number"
},
{
"name": "views",
"label": "Total views",
"type": "number"
},
{
"name": "avatar",
"label": "Profile picture",
"type": "image"
},
{
"name": "url",
"label": "Address",
"type": "url"
},
{
"name": "app_name",
"label": "Service name",
"type": "text"
}
],
"default_template": {
"title": "{{name}}",
"description": "{{subscribers}} Subscribers",
"image": "{{avatar}}"
}
},
{
"id": "derniere_video",
"label": "The latest video",
"element": "rank",
"fields": [
{
"name": "title",
"label": "Title",
"type": "text"
},
{
"name": "description",
"label": "Description",
"type": "text"
},
{
"name": "date",
"label": "Publication date",
"type": "date"
},
{
"name": "channel",
"label": "Channel name",
"type": "text"
},
{
"name": "views",
"label": "Views",
"type": "number"
},
{
"name": "likes",
"label": "Likes",
"type": "number"
},
{
"name": "comments",
"label": "Comments",
"type": "number"
},
{
"name": "thumbnail",
"label": "Thumbnail",
"type": "image"
},
{
"name": "url",
"label": "Address",
"type": "url"
},
{
"name": "app_name",
"label": "Service name",
"type": "text"
}
],
"default_template": {
"title": "{{title}}",
"description": "{{channel}}",
"image": "{{thumbnail}}"
}
}
]
} 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 integración con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Integration 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 elementos de una fuente
GET/v1/integrations/{id}/elements?source=
Para una fuente con elemento, los elementos que ofrece la cuenta (productos de una tienda, vídeos de un canal…): su id es el valor de element. Una lista vacía no es un error: algunas tiendas cierran su catálogo, y la dirección del elemento sigue funcionando. Ámbito Lectura.
curl "https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit" \
-H "Authorization: Bearer tl_tu_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit', {
headers: { Authorization: 'Bearer tl_tu_token' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit');
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/integrations/Int_6aa862f59643e/elements?source=produit',
headers={'Authorization': 'Bearer tl_tu_token'},
)
data = response.json()
Respuestas posibles
{
"data": [
{
"id": "pack-explorher",
"title": "Pack Explor'HER",
"detail": "99,50 €",
"image": "https://cdn.shopify.com/s/files/1/0966/8814/4724/files/Les_indispensables_le_Pack_Explor_HER_POW_HER.png?v=1762246179"
},
{
"id": "pack-routine-skincare",
"title": "Pack ROUTINE SKINCARE",
"detail": "86,70 €",
"image": "https://cdn.shopify.com/s/files/1/0966/8814/4724/files/Pack_Skincare_POWHER_Routine_anti-age_Clean_Exfoli_Lift.png?v=1763384467"
}
]
} 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 integración con este identificador en el espacio de trabajo
{
"error": {
"code": "not_found",
"message": "Integration not found in this environment."
}
} Fuente sin elección de elemento
{
"error": {
"code": "validation_failed",
"message": "The \"source\" parameter must be one of: produit.",
"details": {
"field": "source"
}
}
} Más de 120 peticiones en el minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Añadir un bloque de integración
POST/v1/pages/{id}/links
La ruta para añadir un enlace, con integration_id y source. El bloque cuenta entre los enlaces del plan. La respuesta da el contenido actual (title, url, image) y, en integration, las plantillas. Ámbito Escritura.
integration_id: la cuenta conectada, obligatoriasource: lo que muestra el bloque (derniere_video,chaine,produit…), versourcesde la cuentaelement: para una fuente con elemento ("element": "required"), el identificador o la dirección del elemento; para una fuente por rango ("rank"), de 1 (el más reciente, por defecto) a 5title,description: plantillas con las variables de la fuente, como{{title}}; por defecto las dedefault_template. 100 y 200 caracteres como máximoimage_template: una variable de imagen de la fuente ({{thumbnail}}), onullpara ninguna imagenformat:LIST,BANNERoSQUARE;size,visible,positioncomo para un enlace- Sin
url: la dirección viene de la fuente (el vídeo, el producto…).
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{
"integration_id": "Int_6aac6c7feedf0",
"source": "derniere_video",
"format": "BANNER"
}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
integration_id: 'Int_6aac6c7feedf0',
source: 'derniere_video',
format: 'BANNER',
}),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/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([
'integration_id' => 'Int_6aac6c7feedf0',
'source' => 'derniere_video',
'format' => 'BANNER',
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links',
headers={'Authorization': 'Bearer tl_tu_token'},
json={
'integration_id': 'Int_6aac6c7feedf0',
'source': 'derniere_video',
'format': 'BANNER',
},
)
data = response.json()
Respuestas posibles
{
"id": "L6ad34a155e711",
"title": "TurboBringue 2026 (22:22, Axton, Roi Rufus, One-T)",
"description": "Axton",
"url": "https://www.youtube.com/watch?v=_t55GnPn3bo",
"type": "integration",
"format": "BANNER",
"size": "FULL",
"visible": true,
"archived": false,
"position": 1,
"status": "active",
"image": "https://content.tinylink.fr/page-image/integ_Int_6aac6c7feedf0_derniere_video_thumbnail.webp",
"created_at": "2026-10-17T12:12:37+02:00",
"integration": {
"id": "Int_6aac6c7feedf0",
"platform": "youtube",
"source": "derniere_video",
"element": null,
"title_template": "{{title}}",
"description_template": "{{channel}}",
"image_template": "{{thumbnail}}",
"image_source": "platform"
}
} 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."
}
} Integración suspendida por el límite del plan
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} 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."
}
} Integración ausente del espacio de trabajo
{
"error": {
"code": "validation_failed",
"message": "Integration not found in this environment.",
"details": {
"field": "integration_id"
}
}
} Fuente que la integración no ofrece
{
"error": {
"code": "validation_failed",
"message": "The \"source\" field must be one of: chaine, derniere_video, dernier_short, video, short.",
"details": {
"field": "source"
}
}
} Fuente « un … concreto » sin elemento
{
"error": {
"code": "validation_failed",
"message": "This source shows one precise element: the \"element\" field is required (see GET /v1/integrations/{id}/elements?source=…).",
"details": {
"field": "element"
}
}
} Elemento no encontrado en la plataforma
{
"error": {
"code": "integration_element_not_found",
"message": "This element could not be read on the platform: unknown, unpublished, or a rank the account has not reached yet.",
"details": {
"field": "element"
}
}
} Plantilla que cita una variable desconocida para la fuente
{
"error": {
"code": "invalid_template",
"message": "The \"title\" template uses a variable this source does not know. Variables: {{name}}, {{handle}}, {{description}}, {{subscribers}}, {{videos}}, {{views}}, {{avatar}}, {{url}}, {{app_name}}.",
"details": {
"field": "title"
}
}
} Dirección enviada para un bloque de integración
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"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."
}
} Bloque de un elemento concreto
POST/v1/pages/{id}/links
Una fuente con elemento pide element: se consulta de inmediato en la plataforma, y se rechaza si no se encuentra. Aquí un producto de Shopify, con un título compuesto. Ámbito Escritura.
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{
"integration_id": "Int_6aa862f59643e",
"source": "produit",
"element": "pack-explorher",
"title": "{{title}} — {{price}}",
"description": ""
}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
integration_id: 'Int_6aa862f59643e',
source: 'produit',
element: 'pack-explorher',
title: '{{title}} — {{price}}',
description: '',
}),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/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([
'integration_id' => 'Int_6aa862f59643e',
'source' => 'produit',
'element' => 'pack-explorher',
'title' => '{{title}} — {{price}}',
'description' => '',
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links',
headers={'Authorization': 'Bearer tl_tu_token'},
json={
'integration_id': 'Int_6aa862f59643e',
'source': 'produit',
'element': 'pack-explorher',
'title': '{{title}} — {{price}}',
'description': '',
},
)
data = response.json()
Respuestas posibles
{
"id": "L6ad34a1de7ebe",
"title": "Pack Explor'HER — 99,50 €",
"description": "",
"url": "https://powher.shop/products/pack-explorher",
"type": "integration",
"format": "LIST",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": "https://content.tinylink.fr/page-image/integ_Int_6aa862f59643e_produit-pack-explorher_thumbnail.webp",
"created_at": "2026-10-17T12:12:45+02:00",
"integration": {
"id": "Int_6aa862f59643e",
"platform": "shopify",
"source": "produit",
"element": "pack-explorher",
"title_template": "{{title}} — {{price}}",
"description_template": "",
"image_template": "{{thumbnail}}",
"image_source": "platform"
}
} 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."
}
} Integración suspendida por el límite del plan
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} 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."
}
} Integración ausente del espacio de trabajo
{
"error": {
"code": "validation_failed",
"message": "Integration not found in this environment.",
"details": {
"field": "integration_id"
}
}
} Fuente que la integración no ofrece
{
"error": {
"code": "validation_failed",
"message": "The \"source\" field must be one of: chaine, derniere_video, dernier_short, video, short.",
"details": {
"field": "source"
}
}
} Fuente « un … concreto » sin elemento
{
"error": {
"code": "validation_failed",
"message": "This source shows one precise element: the \"element\" field is required (see GET /v1/integrations/{id}/elements?source=…).",
"details": {
"field": "element"
}
}
} Elemento no encontrado en la plataforma
{
"error": {
"code": "integration_element_not_found",
"message": "This element could not be read on the platform: unknown, unpublished, or a rank the account has not reached yet.",
"details": {
"field": "element"
}
}
} Plantilla que cita una variable desconocida para la fuente
{
"error": {
"code": "invalid_template",
"message": "The \"title\" template uses a variable this source does not know. Variables: {{name}}, {{handle}}, {{description}}, {{subscribers}}, {{videos}}, {{views}}, {{avatar}}, {{url}}, {{app_name}}.",
"details": {
"field": "title"
}
}
} Dirección enviada para un bloque de integración
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"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."
}
} Modificar un bloque de integración
PATCH/v1/pages/{id}/links/{enlace}
title, description, image_template, element, además de los campos de cualquier enlace (format, size, visible, archived, position, image). La cuenta y la fuente no cambian: para mostrar otra cosa, añade un bloque. Una image enviada sustituye a la de la plataforma; quitarla quita también la plantilla de imagen. Ámbito Escritura.
curl -X PATCH https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a1de7ebe \
-H "Authorization: Bearer tl_tu_token" \
-H "Content-Type: application/json" \
-d '{
"title": "{{title}}",
"description": "{{price}}",
"format": "SQUARE"
}'
const response = await fetch('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a1de7ebe', {
method: 'PATCH',
headers: {
Authorization: 'Bearer tl_tu_token',
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: '{{title}}',
description: '{{price}}',
format: 'SQUARE',
}),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a1de7ebe');
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' => '{{title}}',
'description' => '{{price}}',
'format' => 'SQUARE',
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.patch(
'https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a1de7ebe',
headers={'Authorization': 'Bearer tl_tu_token'},
json={
'title': '{{title}}',
'description': '{{price}}',
'format': 'SQUARE',
},
)
data = response.json()
Respuestas posibles
{
"id": "L6ad34a1de7ebe",
"title": "Pack Explor'HER",
"description": "99,50 €",
"url": "https://powher.shop/products/pack-explorher",
"type": "integration",
"format": "SQUARE",
"size": "FULL",
"visible": true,
"archived": false,
"position": 2,
"status": "active",
"image": "https://content.tinylink.fr/page-image/integ_Int_6aa862f59643e_produit-pack-explorher_thumbnail.webp",
"created_at": "2026-10-17T12:12:45+02:00",
"integration": {
"id": "Int_6aa862f59643e",
"platform": "shopify",
"source": "produit",
"element": "pack-explorher",
"title_template": "{{title}}",
"description_template": "{{price}}",
"image_template": "{{thumbnail}}",
"image_source": "platform"
}
} 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."
}
} Integración suspendida por el límite del plan
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} 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."
}
} Fuente « un … concreto » sin elemento
{
"error": {
"code": "validation_failed",
"message": "This source shows one precise element: the \"element\" field is required (see GET /v1/integrations/{id}/elements?source=…).",
"details": {
"field": "element"
}
}
} Elemento no encontrado en la plataforma
{
"error": {
"code": "integration_element_not_found",
"message": "This element could not be read on the platform: unknown, unpublished, or a rank the account has not reached yet.",
"details": {
"field": "element"
}
}
} Plantilla que cita una variable desconocida para la fuente
{
"error": {
"code": "invalid_template",
"message": "The \"title\" template uses a variable this source does not know. Variables: {{name}}, {{handle}}, {{description}}, {{subscribers}}, {{videos}}, {{views}}, {{avatar}}, {{url}}, {{app_name}}.",
"details": {
"field": "title"
}
}
} Dirección enviada para un bloque de integración
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"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."
}
}