Statistiques
Les vues et les clics sur la période de votre choix, pour un élément, pour les éléments d'un tag ou pour tout l'environnement, avec leur répartition par provenance, pays et appareil.
- GET
/v1/links/{id}/statsClics d'un lien réduit - GET
/v1/pages/{id}/statsVues d'une page - GET
/v1/statsStatistiques de l'environnement - GET
/v1/tags/{id}/statsStatistiques d'un tag
Clics d'un lien réduit
GET/v1/links/{id}/stats
?days= vaut 1, 7, 30 (par défaut), 90, ou 0 pour depuis toujours. Portée Lecture.
total— le total de la période ;previous_totalcelui de la période précédente etchange_pctla variation en pourcentageall_time_total— le total depuis la créationdaily— la série par jour ; avec?days=0, elle est remplacée parmonthly, une entrée par mois (month,count)referrers— la provenance : un nom de domaine,directouunknowncountries— le code du pays sur deux lettres, ouunknowndevices—desktop,mobile,tablet,console,tvouunknown
curl "https://api.tinylink.fr/v1/links/promo/stats?days=7" \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/links/promo/stats?days=7', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/links/promo/stats?days=7');
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/links/promo/stats?days=7',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"metric": "clicks",
"days": 7,
"from": "2026-09-29",
"to": "2026-10-05",
"total": 42,
"previous_total": 35,
"change_pct": 20.0,
"all_time_total": 318,
"daily": [
{
"date": "2026-09-29",
"count": 4
},
{
"date": "2026-09-30",
"count": 9
},
{
"date": "2026-10-01",
"count": 6
},
{
"date": "2026-10-02",
"count": 3
},
{
"date": "2026-10-03",
"count": 8
},
{
"date": "2026-10-04",
"count": 7
},
{
"date": "2026-10-05",
"count": 5
}
],
"referrers": [
{
"source": "instagram.com",
"count": 25
},
{
"source": "direct",
"count": 17
}
],
"countries": [
{
"country": "FR",
"count": 36
},
{
"country": "BE",
"count": 6
}
],
"devices": [
{
"device": "mobile",
"count": 31
},
{
"device": "desktop",
"count": 11
}
]
} 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"
}
}
} Aucun lien réduit avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Link not found in this environment."
}
} Période non proposée
{
"error": {
"code": "validation_failed",
"message": "The \"days\" parameter must be one of: 1, 7, 30, 90, 0 (all time).",
"details": {
"field": "days"
}
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Vues d'une page
GET/v1/pages/{id}/stats
Mêmes paramètres et mêmes champs, avec metric à views. S'y ajoute links : les clics de chacun des liens de la page sur la période. Portée Lecture.
curl "https://api.tinylink.fr/v1/pages/ma-page/stats?days=7" \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/pages/ma-page/stats?days=7', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/pages/ma-page/stats?days=7');
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/pages/ma-page/stats?days=7',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"metric": "views",
"days": 7,
"from": "2026-09-29",
"to": "2026-10-05",
"total": 42,
"previous_total": 35,
"change_pct": 20.0,
"all_time_total": 318,
"daily": [
{
"date": "2026-09-29",
"count": 4
},
{
"date": "2026-09-30",
"count": 9
},
{
"date": "2026-10-01",
"count": 6
},
{
"date": "2026-10-02",
"count": 3
},
{
"date": "2026-10-03",
"count": 8
},
{
"date": "2026-10-04",
"count": 7
},
{
"date": "2026-10-05",
"count": 5
}
],
"referrers": [
{
"source": "instagram.com",
"count": 25
},
{
"source": "direct",
"count": 17
}
],
"countries": [
{
"country": "FR",
"count": 36
},
{
"country": "BE",
"count": 6
}
],
"devices": [
{
"device": "mobile",
"count": 31
},
{
"device": "desktop",
"count": 11
}
],
"links": [
{
"id": "L6ac4011edb7c6",
"title": "Mon site",
"clicks": 19
},
{
"id": "L6ac4011ee9fab",
"title": "Contact",
"clicks": 4
}
]
} 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"
}
}
} Aucune page avec cet identifiant ou ce slug dans l'environnement
{
"error": {
"code": "not_found",
"message": "Page not found in this environment."
}
} Période non proposée
{
"error": {
"code": "validation_failed",
"message": "The \"days\" parameter must be one of: 1, 7, 30, 90, 0 (all time).",
"details": {
"field": "days"
}
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Statistiques de l'environnement
GET/v1/stats
Les chiffres de tout l'environnement du jeton, comme sur le tableau de bord. ?days= vaut 1, 7, 30 (par défaut), 90, ou 0 pour depuis toujours ; ?limit= (de 1 à 100, 10 par défaut) fixe la longueur des classements. Portée Lecture.
page_views— les vues des pages ;page_link_clicks— les clics sur les liens de ces pages ;short_link_clicks— les clics des liens réduits. Chacun portetotal,previous_total,change_pctetall_time_total, comme les statistiques d'un élémentclick_through_rate— la part des vues de pages suivies d'un clic, en pourcentage (value), et celle de la période précédente (previous_value) ;nullsans vuedaily— une entrée par jour avec les trois compteurs ; avec?days=0, elle est remplacée parmonthly, une entrée par moisreferrers,countries,devices— la provenance, le pays et l'appareil des vues de pages et des clics de liens réduits, dans le même format que pour un élémenttop_pages— les pages les plus vues sur la période, avec leurs vues et les clics sur leurs liens ;top_links— les liens réduits les plus cliqués
curl "https://api.tinylink.fr/v1/stats?days=7&limit=1" \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/stats?days=7&limit=1', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/stats?days=7&limit=1');
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/stats?days=7&limit=1',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"days": 7,
"from": "2026-09-29",
"to": "2026-10-05",
"page_views": {
"total": 104,
"previous_total": 88,
"change_pct": 18.2,
"all_time_total": 1240
},
"page_link_clicks": {
"total": 42,
"previous_total": 40,
"change_pct": 5.0,
"all_time_total": 517
},
"short_link_clicks": {
"total": 50,
"previous_total": 62,
"change_pct": -19.4,
"all_time_total": 688
},
"click_through_rate": {
"value": 40.4,
"previous_value": 45.5
},
"daily": [
{
"date": "2026-09-29",
"page_views": 12,
"page_link_clicks": 5,
"short_link_clicks": 8
},
{
"date": "2026-09-30",
"page_views": 18,
"page_link_clicks": 7,
"short_link_clicks": 6
},
{
"date": "2026-10-01",
"page_views": 9,
"page_link_clicks": 3,
"short_link_clicks": 11
},
{
"date": "2026-10-02",
"page_views": 15,
"page_link_clicks": 6,
"short_link_clicks": 4
},
{
"date": "2026-10-03",
"page_views": 22,
"page_link_clicks": 9,
"short_link_clicks": 7
},
{
"date": "2026-10-04",
"page_views": 17,
"page_link_clicks": 8,
"short_link_clicks": 9
},
{
"date": "2026-10-05",
"page_views": 11,
"page_link_clicks": 4,
"short_link_clicks": 5
}
],
"referrers": [
{
"source": "instagram.com",
"count": 71
},
{
"source": "direct",
"count": 58
},
{
"source": "t.co",
"count": 17
},
{
"source": "QR Code",
"count": 8
}
],
"countries": [
{
"country": "FR",
"count": 118
},
{
"country": "BE",
"count": 21
},
{
"country": "CA",
"count": 9
},
{
"country": "unknown",
"count": 6
}
],
"devices": [
{
"device": "mobile",
"count": 109
},
{
"device": "desktop",
"count": 41
},
{
"device": "tablet",
"count": 4
}
],
"top_pages": [
{
"id": "P6ac4011ea1b2c",
"name": "Ma page",
"url": "https://tnylnk.fr/ma-page",
"views": 104,
"link_clicks": 42
}
],
"top_links": [
{
"id": "6ac401093831b",
"url": "https://tnlnk.fr/promo",
"target_url": "https://exemple.fr/promo",
"clicks": 50
}
]
} 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"
}
}
} Période non proposée
{
"error": {
"code": "validation_failed",
"message": "The \"days\" parameter must be one of: 1, 7, 30, 90, 0 (all time).",
"details": {
"field": "days"
}
}
} Longueur de classement hors de 1 à 100
{
"error": {
"code": "validation_failed",
"message": "The \"limit\" parameter must be between 1 and 100.",
"details": {
"field": "limit"
}
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
} Statistiques d'un tag
GET/v1/tags/{id}/stats
Les mêmes chiffres, limités aux pages et aux liens réduits qui portent le tag, avec les mêmes paramètres. S'y ajoute tag, le tag lui-même. Avec ?limit=100, top_pages et top_links donnent les chiffres de chacun des éléments du tag (100 au plus de chaque type). Portée Lecture.
curl "https://api.tinylink.fr/v1/tags/46/stats?days=7&limit=1" \
-H "Authorization: Bearer tl_votre_jeton"
const response = await fetch('https://api.tinylink.fr/v1/tags/46/stats?days=7&limit=1', {
headers: { Authorization: 'Bearer tl_votre_jeton' },
});
const data = await response.json();
$ch = curl_init('https://api.tinylink.fr/v1/tags/46/stats?days=7&limit=1');
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/tags/46/stats?days=7&limit=1',
headers={'Authorization': 'Bearer tl_votre_jeton'},
)
data = response.json()
Réponses possibles
{
"tag": {
"id": 46,
"name": "Campagne",
"color": "#1E90FF",
"elements_count": 2,
"created_at": "2026-10-05T21:56:57+02:00"
},
"days": 7,
"from": "2026-09-29",
"to": "2026-10-05",
"page_views": {
"total": 104,
"previous_total": 88,
"change_pct": 18.2,
"all_time_total": 1240
},
"page_link_clicks": {
"total": 42,
"previous_total": 40,
"change_pct": 5.0,
"all_time_total": 517
},
"short_link_clicks": {
"total": 50,
"previous_total": 62,
"change_pct": -19.4,
"all_time_total": 688
},
"click_through_rate": {
"value": 40.4,
"previous_value": 45.5
},
"daily": [
{
"date": "2026-09-29",
"page_views": 12,
"page_link_clicks": 5,
"short_link_clicks": 8
},
{
"date": "2026-09-30",
"page_views": 18,
"page_link_clicks": 7,
"short_link_clicks": 6
},
{
"date": "2026-10-01",
"page_views": 9,
"page_link_clicks": 3,
"short_link_clicks": 11
},
{
"date": "2026-10-02",
"page_views": 15,
"page_link_clicks": 6,
"short_link_clicks": 4
},
{
"date": "2026-10-03",
"page_views": 22,
"page_link_clicks": 9,
"short_link_clicks": 7
},
{
"date": "2026-10-04",
"page_views": 17,
"page_link_clicks": 8,
"short_link_clicks": 9
},
{
"date": "2026-10-05",
"page_views": 11,
"page_link_clicks": 4,
"short_link_clicks": 5
}
],
"referrers": [
{
"source": "instagram.com",
"count": 71
},
{
"source": "direct",
"count": 58
},
{
"source": "t.co",
"count": 17
},
{
"source": "QR Code",
"count": 8
}
],
"countries": [
{
"country": "FR",
"count": 118
},
{
"country": "BE",
"count": 21
},
{
"country": "CA",
"count": 9
},
{
"country": "unknown",
"count": 6
}
],
"devices": [
{
"device": "mobile",
"count": 109
},
{
"device": "desktop",
"count": 41
},
{
"device": "tablet",
"count": 4
}
],
"top_pages": [
{
"id": "P6ac4011ea1b2c",
"name": "Ma page",
"url": "https://tnylnk.fr/ma-page",
"views": 104,
"link_clicks": 42
}
],
"top_links": [
{
"id": "6ac401093831b",
"url": "https://tnlnk.fr/promo",
"target_url": "https://exemple.fr/promo",
"clicks": 50
}
]
} 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"
}
}
} Aucun tag avec cet identifiant dans l'environnement
{
"error": {
"code": "not_found",
"message": "Tag not found in this environment."
}
} Période non proposée
{
"error": {
"code": "validation_failed",
"message": "The \"days\" parameter must be one of: 1, 7, 30, 90, 0 (all time).",
"details": {
"field": "days"
}
}
} Longueur de classement hors de 1 à 100
{
"error": {
"code": "validation_failed",
"message": "The \"limit\" parameter must be between 1 and 100.",
"details": {
"field": "limit"
}
}
} Plus de 120 requêtes dans la minute
{
"error": {
"code": "rate_limited",
"message": "Too many requests: 120 per minute per token."
}
}