Premiers pas avec l'API
L'API TinyLink donne à vos outils — un script, Zapier, Make, votre site — les mêmes gestes que l'application : créer une page et y ajouter des liens, réduire une adresse, poser des tags, générer un QR code, lire les statistiques. Elle est incluse dans les offres Pro et Business.
Marche à suivre
- Ouvrez Bibliothèque, puis l'onglet Intégrations : la carte API TinyLink est la première.
- Cliquez sur Générer un jeton : un panneau s'ouvre sur la droite. Choisissez les portées du jeton — Lecture, Écriture (créer, modifier, ajouter des liens, générer des QR codes) et Suppression — puis validez. Ne cochez que ce dont votre outil a besoin.
- Le jeton apparaît en tête du panneau, masqué comme un mot de passe : l'œil l'affiche, le bouton à côté le copie. Il reste disponible à cet endroit, vous pourrez le reprendre plus tard avec le bouton Gérer de la carte.
- Envoyez-le dans l'en-tête de chaque requête :
Authorization: Bearer tl_…, à l'adressehttps://api.tinylink.fr/v1.
Un jeton par environnement
Le jeton n'ouvre que l'environnement où il a été généré : vos autres espaces restent hors de portée. Il agit au nom de l'admin qui l'a généré, et cesse de fonctionner si cette personne n'est plus admin de l'environnement.
Le panneau Gérer est réservé aux admins : eux seuls voient le jeton et le modifient. Il est rangé chiffré chez TinyLink. Les portées se changent sans changer le jeton : vos outils n'ont rien à modifier. Régénérer en crée un nouveau et désactive l'ancien sur-le-champ — à faire si vous pensez qu'il a fuité. Révoquer le supprime. Le panneau indique aussi la date du dernier appel et le nombre d'appels.
Premier appel
GET/v1/me
Toutes les réponses sont en JSON. GET /v1/me vérifie le jeton et rend l'environnement, les portées et les plafonds de l'offre. À partir du 1er novembre 2026 s'y ajoute limits.visits_per_month : les visites du mois (used), le quota de l'offre (max, null sans quota) et la date de remise à zéro (resets_on).
curl https://api.tinylink.fr/v1/me \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/me', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/me');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.get(
'https://api.tinylink.fr/v1/me',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"environment": {
"id": "Env_60c7cf02dd971TT",
"name": "Mon équipe",
"color": "#1e90ff",
"description": null,
"personal": false,
"blocked": false
},
"token": {
"scopes": [
"read",
"write"
],
"created_at": "2026-10-05T21:56:57+02:00",
"created_by": "Camille Martin",
"last_used_at": "2026-10-05T21:57:19+02:00"
},
"plan": "Pro",
"limits": {
"pages": {
"used": 4,
"max": 10
},
"links": {
"used": 27,
"max": 100
},
"links_per_page": 50,
"socials_per_page": 8,
"requests_per_minute": 120
}
} Jeton absent de la requête
{
"error": {
"code": "missing_token",
"message": "Send your token in the header: Authorization: Bearer tl_…"
}
} Jeton inconnu ou révoqué
{
"error": {
"code": "invalid_token",
"message": "This token does not exist or has been revoked."
}
} L'offre du propriétaire n'inclut pas 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."
}
} Le jeton ne porte pas la portée Lecture
{
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"read\" scope.",
"details": {
"required_scope": "read"
}
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Sans écrire de code : l'extension de navigateur
Le même jeton connecte l'extension TinyLink pour Chrome : elle réduit la page que vous lisez et liste vos liens réduits depuis la barre du navigateur.
Dans votre langage
Chaque exemple de cette documentation existe en curl, en JavaScript, en PHP et en Python : choisissez l'onglet, votre choix est gardé d'une page à l'autre. Rien n'impose l'un d'eux — l'API, c'est du HTTP et du JSON, et tout autre client convient aussi : Postman, ou le module HTTP de Zapier et de Make. Réduire une adresse, par exemple :
curl -X POST https://api.tinylink.fr/v1/links \
-H "Authorization: Bearer tl_votre_jeton" \
-H "Content-Type: application/json" \
-d '{"url":"https://exemple.fr/promo","slug":"promo"}'
const response = await fetch('https://api.tinylink.fr/v1/links', {
method: 'POST',
headers: {
Authorization: 'Bearer tl_votre_jeton',
'Content-Type': 'application/json',
},
body: JSON.stringify({ url: 'https://exemple.fr/promo', slug: 'promo' }),
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/links');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer tl_votre_jeton', 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['url' => 'https://exemple.fr/promo', 'slug' => 'promo']),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
import requests
response = requests.post(
'https://api.tinylink.fr/v1/links',
headers={'Authorization': 'Bearer tl_votre_jeton'},
json={'url': 'https://exemple.fr/promo', 'slug': 'promo'},
)
data = response.json()
Conventions
Les mêmes règles valent pour toutes les routes :
- L'adresse de base est
https://api.tinylink.fr/v1.GET /v1, sans jeton, rend le nom de l'API, sa version et l'adresse de cette documentation. - Le corps d'une requête est un objet JSON, envoyé avec
Content-Type: application/json. GETlit, avec la portée Lecture.POSTcrée,PATCHmodifie etPUTpose un tag, avec la portée Écriture.DELETEsupprime, avec la portée Suppression.- Une création répond
201avec l'objet créé, une modification200avec l'objet à jour, une suppression204sans contenu. - Les listes de pages, de liens réduits et d'éléments d'un tag sont paginées :
?page=et?per_page=(50 par défaut, 100 au plus). La réponse porte un objetpagination:page,per_page,total,total_pages. - Une page ou un lien réduit se désigne par son identifiant ou par son adresse personnalisée (slug). Dans les limites,
nullveut dire illimité.