Integrazioni
Gli account collegati in Libreria → Integrazioni (YouTube, Shopify, Instagram, RSS…) alimentano blocchi di pagina che si aggiornano da soli: l'ultimo video, un prodotto, il prossimo evento. Il collegamento di un account si fa nell'applicazione; l'API li legge e posiziona i loro blocchi, su una pagina come in un componente.
- GET
/v1/integrationsElencare le integrazioni - GET
/v1/integrations/{id}Leggere un'integrazione - GET
/v1/integrations/{id}/elements?source=Elencare gli elementi di una fonte - POST
/v1/pages/{id}/linksAggiungere un blocco di integrazione - POST
/v1/pages/{id}/linksBlocco di un elemento preciso - PATCH
/v1/pages/{id}/links/{link}Modificare un blocco di integrazione
Elencare le integrazioni
GET/v1/integrations
Gli account collegati dello spazio di lavoro, dal più recente. status vale active, reconnect_required (autorizzazione da rinnovare nell'applicazione) o error; suspended segnala un account oltre il limite del piano; used dice se un blocco lo mostra. Ambito Lettura.
curl https://api.tinylink.fr/v1/integrations \
-H "Authorization: Bearer tl_il_tuo_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations', {
headers: { Authorization: 'Bearer tl_il_tuo_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_il_tuo_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_il_tuo_token'},
)
data = response.json()
Risposte possibili
{
"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"
}
]
} Token assente dalla richiesta
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token sconosciuto o revocato
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Il piano del proprietario non include l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Il token non ha l'ambito Lettura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Più di 120 richieste nel minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Leggere un'integrazione
GET/v1/integrations/{id}
L'account e le sue sources: per ciascuna, le sue variabili (fields, da citare nei modelli), il modello predefinito e ciò che chiede — none, rank (un rango, da 1 a 5) o required (un elemento preciso). Ambito Lettura.
curl https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0 \
-H "Authorization: Bearer tl_il_tuo_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0', {
headers: { Authorization: 'Bearer tl_il_tuo_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_il_tuo_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_il_tuo_token'},
)
data = response.json()
Risposte possibili
{
"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}}"
}
}
]
} Token assente dalla richiesta
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token sconosciuto o revocato
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Il piano del proprietario non include l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Il token non ha l'ambito Lettura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Nessuna integrazione con questo identificativo nello spazio di lavoro
{
"error": {
"code": "not_found",
"message": "Integration not found in this environment."
}
} Più di 120 richieste nel minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Elencare gli elementi di una fonte
GET/v1/integrations/{id}/elements?source=
Per una fonte con elemento, gli elementi proposti dall'account (prodotti di un negozio, video di un canale…): il loro id è il valore di element. Un elenco vuoto non è un errore: alcuni negozi chiudono il catalogo, e l'indirizzo dell'elemento funziona comunque. Ambito Lettura.
curl "https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit" \
-H "Authorization: Bearer tl_il_tuo_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit', {
headers: { Authorization: 'Bearer tl_il_tuo_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_il_tuo_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_il_tuo_token'},
)
data = response.json()
Risposte possibili
{
"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"
}
]
} Token assente dalla richiesta
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token sconosciuto o revocato
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Il piano del proprietario non include l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Il token non ha l'ambito Lettura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Nessuna integrazione con questo identificativo nello spazio di lavoro
{
"error": {
"code": "not_found",
"message": "Integration not found in this environment."
}
} Fonte senza scelta di elemento
{
"error": {
"code": "validation_failed",
"message": "The \"source\" parameter must be one of: produit.",
"details": {
"field": "source"
}
}
} Più di 120 richieste nel minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Aggiungere un blocco di integrazione
POST/v1/pages/{id}/links
La rotta che aggiunge un link, con integration_id e source. Il blocco conta tra i link del piano. La risposta dà il contenuto attuale (title, url, image) e, in integration, i modelli. Ambito Scrittura.
integration_id: l'account collegato, obbligatoriosource: ciò che il blocco mostra (derniere_video,chaine,produit…), vedisourcesdell'accountelement: per una fonte con elemento ("element": "required"), l'identificativo o l'indirizzo dell'elemento; per una fonte per rango ("rank"), da 1 (il più recente, predefinito) a 5title,description: modelli con le variabili della fonte, come{{title}}; in mancanza quelli didefault_template. 100 e 200 caratteri al massimoimage_template: una variabile immagine della fonte ({{thumbnail}}), onullper nessuna immagineformat:LIST,BANNERoSQUARE;size,visible,positioncome per un link- Nessun
url: l'indirizzo viene dalla fonte (il video, il prodotto…).
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
-H "Authorization: Bearer tl_il_tuo_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_il_tuo_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_il_tuo_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_il_tuo_token'},
json={
'integration_id': 'Int_6aac6c7feedf0',
'source': 'derniere_video',
'format': 'BANNER',
},
)
data = response.json()
Risposte possibili
{
"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"
}
} Il corpo non è un oggetto JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Token assente dalla richiesta
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token sconosciuto o revocato
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Integrazione sospesa dal limite del piano
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} Numero di link per pagina del piano raggiunto
{
"error": {
"code": "plan_limit_reached",
"message": "The plan allows 50 links per page (50 already used).",
"details": {
"max": 50,
"used": 50
}
}
} Il piano del proprietario non include l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Il token non ha l'ambito Scrittura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Nessuna pagina con questo identificativo o questo slug nello spazio di lavoro
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Integrazione assente dallo spazio di lavoro
{
"error": {
"code": "validation_failed",
"message": "Integration not found in this environment.",
"details": {
"field": "integration_id"
}
}
} Fonte che l'integrazione non offre
{
"error": {
"code": "validation_failed",
"message": "The \"source\" field must be one of: chaine, derniere_video, dernier_short, video, short.",
"details": {
"field": "source"
}
}
} Fonte « un … preciso » senza 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 non trovato sulla piattaforma
{
"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"
}
}
} Modello che cita una variabile sconosciuta alla fonte
{
"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"
}
}
} Indirizzo inviato per un blocco di integrazione
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"details": {
"field": "url"
}
}
} Elemento bloccato dalla moderazione
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Più di 120 richieste nel minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Blocco di un elemento preciso
POST/v1/pages/{id}/links
Una fonte con elemento chiede element: viene letto subito sulla piattaforma, e rifiutato se introvabile. Qui un prodotto Shopify, con un titolo composto. Ambito Scrittura.
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
-H "Authorization: Bearer tl_il_tuo_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_il_tuo_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_il_tuo_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_il_tuo_token'},
json={
'integration_id': 'Int_6aa862f59643e',
'source': 'produit',
'element': 'pack-explorher',
'title': '{{title}} — {{price}}',
'description': '',
},
)
data = response.json()
Risposte possibili
{
"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"
}
} Il corpo non è un oggetto JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Token assente dalla richiesta
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token sconosciuto o revocato
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Integrazione sospesa dal limite del piano
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} Numero di link per pagina del piano raggiunto
{
"error": {
"code": "plan_limit_reached",
"message": "The plan allows 50 links per page (50 already used).",
"details": {
"max": 50,
"used": 50
}
}
} Il piano del proprietario non include l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Il token non ha l'ambito Scrittura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Nessuna pagina con questo identificativo o questo slug nello spazio di lavoro
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Integrazione assente dallo spazio di lavoro
{
"error": {
"code": "validation_failed",
"message": "Integration not found in this environment.",
"details": {
"field": "integration_id"
}
}
} Fonte che l'integrazione non offre
{
"error": {
"code": "validation_failed",
"message": "The \"source\" field must be one of: chaine, derniere_video, dernier_short, video, short.",
"details": {
"field": "source"
}
}
} Fonte « un … preciso » senza 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 non trovato sulla piattaforma
{
"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"
}
}
} Modello che cita una variabile sconosciuta alla fonte
{
"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"
}
}
} Indirizzo inviato per un blocco di integrazione
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"details": {
"field": "url"
}
}
} Elemento bloccato dalla moderazione
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Più di 120 richieste nel minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Modificare un blocco di integrazione
PATCH/v1/pages/{id}/links/{link}
title, description, image_template, element, più i campi di qualsiasi link (format, size, visible, archived, position, image). L'account e la fonte non cambiano: per mostrare altro, aggiungi un blocco. Un'image inviata sostituisce quella della piattaforma; toglierla toglie anche il modello d'immagine. Ambito Scrittura.
curl -X PATCH https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a1de7ebe \
-H "Authorization: Bearer tl_il_tuo_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_il_tuo_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_il_tuo_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_il_tuo_token'},
json={
'title': '{{title}}',
'description': '{{price}}',
'format': 'SQUARE',
},
)
data = response.json()
Risposte possibili
{
"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"
}
} Il corpo non è un oggetto JSON
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} Token assente dalla richiesta
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Token sconosciuto o revocato
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Integrazione sospesa dal limite del piano
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} Il piano del proprietario non include l'API
{
"error": {
"code": "plan_required",
"message": "The TinyLink API is included in the Pro and Business plans. Upgrade the plan of this environment's owner to use it."
}
} Il token non ha l'ambito Scrittura
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} Nessuna pagina con questo identificativo o questo slug nello spazio di lavoro
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Nessun link con questo identificativo sulla pagina
{
"error": {
"code": "not_found",
"message": "Link not found on this page."
}
} Fonte « un … preciso » senza 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 non trovato sulla piattaforma
{
"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"
}
}
} Modello che cita una variabile sconosciuta alla fonte
{
"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"
}
}
} Indirizzo inviato per un blocco di integrazione
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"details": {
"field": "url"
}
}
} Elemento bloccato dalla moderazione
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} Più di 120 richieste nel minuto
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
}