Integrations
The accounts connected in Library → Integrations (YouTube, Shopify, Instagram, RSS…) feed page blocks that update themselves: the latest video, a product, the next event. Accounts are connected in the app; the API reads them and places their blocks, on a page as in a component.
- GET
/v1/integrationsList the integrations - GET
/v1/integrations/{id}Read an integration - GET
/v1/integrations/{id}/elements?source=List the elements of a source - POST
/v1/pages/{id}/linksAdd an integration block - POST
/v1/pages/{id}/linksBlock for a specific element - PATCH
/v1/pages/{id}/links/{link}Change an integration block
List the integrations
GET/v1/integrations
The connected accounts of the environment, most recent first. status is active, reconnect_required (authorisation to renew in the app) or error; suspended flags an account beyond the plan limit; used says whether a block shows it. Read scope.
curl https://api.tinylink.fr/v1/integrations \
-H "Authorization: Bearer tl_your_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations', {
headers: { Authorization: 'Bearer tl_your_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_your_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_your_token'},
)
data = response.json()
Possible responses
{
"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"
}
]
} No token in the request
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Unknown or revoked token
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} The owner's plan does not include the 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."
}
} The token does not carry the Read scope
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} More than 120 requests within the minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Read an integration
GET/v1/integrations/{id}
The account and its sources: for each, its variables (fields, to cite in templates), its default template and what it asks for — none, rank (a rank, 1 to 5) or required (a specific element). Read scope.
curl https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0 \
-H "Authorization: Bearer tl_your_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations/Int_6aac6c7feedf0', {
headers: { Authorization: 'Bearer tl_your_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_your_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_your_token'},
)
data = response.json()
Possible responses
{
"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}}"
}
}
]
} No token in the request
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Unknown or revoked token
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} The owner's plan does not include the 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."
}
} The token does not carry the Read scope
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} No integration with this id in the environment
{
"error": {
"code": "not_found",
"message": "Integration not found in this environment."
}
} More than 120 requests within the minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} List the elements of a source
GET/v1/integrations/{id}/elements?source=
For a source with an element, the elements the account offers (products of a shop, videos of a channel…): their id is the value of element. An empty list is not an error: some shops close their catalogue, and the element's address still works. Read scope.
curl "https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit" \
-H "Authorization: Bearer tl_your_token"
const response = await fetch('https://api.tinylink.fr/v1/integrations/Int_6aa862f59643e/elements?source=produit', {
headers: { Authorization: 'Bearer tl_your_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_your_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_your_token'},
)
data = response.json()
Possible responses
{
"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"
}
]
} No token in the request
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Unknown or revoked token
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} The owner's plan does not include the 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."
}
} The token does not carry the Read scope
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} No integration with this id in the environment
{
"error": {
"code": "not_found",
"message": "Integration not found in this environment."
}
} Source without element choice
{
"error": {
"code": "validation_failed",
"message": "The \"source\" parameter must be one of: produit.",
"details": {
"field": "source"
}
}
} More than 120 requests within the minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Add an integration block
POST/v1/pages/{id}/links
The route that adds a link, with integration_id and source. The block counts among the plan's links. The response gives the current content (title, url, image) and, in integration, the templates. Write scope.
integration_id— the connected account, requiredsource— what the block shows (derniere_video,chaine,produit…), see the account'ssourceselement— for a source with an element ("element": "required"): the id or address of the element; for a ranked source ("rank"): 1 (the latest, by default) to 5title,description— templates with the source's variables, such as{{title}}; by default those ofdefault_template. 100 and 200 characters at mostimage_template— an image variable of the source ({{thumbnail}}), ornullfor no imageformat—LIST,BANNERorSQUARE;size,visible,positionas for a link- No
url: the address comes from the source (the video, the product…).
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
-H "Authorization: Bearer tl_your_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_your_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_your_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_your_token'},
json={
'integration_id': 'Int_6aac6c7feedf0',
'source': 'derniere_video',
'format': 'BANNER',
},
)
data = response.json()
Possible responses
{
"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"
}
} The body is not a JSON object
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} No token in the request
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Unknown or revoked token
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Integration suspended by the plan limit
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} The plan's number of links per page is reached
{
"error": {
"code": "plan_limit_reached",
"message": "The plan allows 50 links per page (50 already used).",
"details": {
"max": 50,
"used": 50
}
}
} The owner's plan does not include the 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."
}
} The token does not carry the Write scope
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} No page with this id or slug in the environment
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Integration missing from the environment
{
"error": {
"code": "validation_failed",
"message": "Integration not found in this environment.",
"details": {
"field": "integration_id"
}
}
} Source the integration does not offer
{
"error": {
"code": "validation_failed",
"message": "The \"source\" field must be one of: chaine, derniere_video, dernier_short, video, short.",
"details": {
"field": "source"
}
}
} "A specific …" source without element
{
"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"
}
}
} Element not found on the platform
{
"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"
}
}
} Template citing a variable unknown to the source
{
"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"
}
}
} Address sent for an integration block
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"details": {
"field": "url"
}
}
} Element blocked by moderation
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} More than 120 requests within the minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Block for a specific element
POST/v1/pages/{id}/links
A source with an element asks for element: it is fetched from the platform at once, and refused if it cannot be found. Here a Shopify product, with a composed title. Write scope.
curl -X POST https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links \
-H "Authorization: Bearer tl_your_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_your_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_your_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_your_token'},
json={
'integration_id': 'Int_6aa862f59643e',
'source': 'produit',
'element': 'pack-explorher',
'title': '{{title}} — {{price}}',
'description': '',
},
)
data = response.json()
Possible responses
{
"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"
}
} The body is not a JSON object
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} No token in the request
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Unknown or revoked token
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Integration suspended by the plan limit
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} The plan's number of links per page is reached
{
"error": {
"code": "plan_limit_reached",
"message": "The plan allows 50 links per page (50 already used).",
"details": {
"max": 50,
"used": 50
}
}
} The owner's plan does not include the 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."
}
} The token does not carry the Write scope
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} No page with this id or slug in the environment
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Integration missing from the environment
{
"error": {
"code": "validation_failed",
"message": "Integration not found in this environment.",
"details": {
"field": "integration_id"
}
}
} Source the integration does not offer
{
"error": {
"code": "validation_failed",
"message": "The \"source\" field must be one of: chaine, derniere_video, dernier_short, video, short.",
"details": {
"field": "source"
}
}
} "A specific …" source without element
{
"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"
}
}
} Element not found on the platform
{
"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"
}
}
} Template citing a variable unknown to the source
{
"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"
}
}
} Address sent for an integration block
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"details": {
"field": "url"
}
}
} Element blocked by moderation
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} More than 120 requests within the minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Change an integration block
PATCH/v1/pages/{id}/links/{link}
title, description, image_template, element, plus the fields of any link (format, size, visible, archived, position, image). The account and source do not change: to show something else, add a block. An image sent replaces the platform's; removing it also removes the image template. Write scope.
curl -X PATCH https://api.tinylink.fr/v1/pages/P6ad34a0e4fef09/links/L6ad34a1de7ebe \
-H "Authorization: Bearer tl_your_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_your_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_your_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_your_token'},
json={
'title': '{{title}}',
'description': '{{price}}',
'format': 'SQUARE',
},
)
data = response.json()
Possible responses
{
"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"
}
} The body is not a JSON object
{
"error": {
"code": "invalid_json",
"message": "The request body must be a JSON object."
}
} No token in the request
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Unknown or revoked token
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} Integration suspended by the plan limit
{
"error": {
"code": "integration_suspended",
"message": "This integration is suspended: it exceeds the plan of this environment's owner.",
"details": {
"field": "integration_id"
}
}
} The owner's plan does not include the 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."
}
} The token does not carry the Write scope
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"write\" scope.",
"details": {
"required_scope": "write"
}
}
} No page with this id or slug in the environment
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} No link with this id on the page
{
"error": {
"code": "not_found",
"message": "Link not found on this page."
}
} "A specific …" source without element
{
"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"
}
}
} Element not found on the platform
{
"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"
}
}
} Template citing a variable unknown to the source
{
"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"
}
}
} Address sent for an integration block
{
"error": {
"code": "validation_failed",
"message": "The address of an integration block comes from its source: do not send \"url\".",
"details": {
"field": "url"
}
}
} Element blocked by moderation
{
"error": {
"code": "element_blocked",
"message": "This element is blocked by moderation and can no longer be modified."
}
} More than 120 requests within the minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
}