AVANCÉ
DocsAnalyse et règles via l’API
Deux choses reposent sur un lien et valent la peine d’être automatisées : lire son trafic et le diriger. Les statistiques sont des GET en lecture seule qu’une clé de lecture peut appeler ; les règles de routage sont des actions d’écriture qui s’évaluent dans la redirection à la périphérie. Les deux sont les mêmes endpoints que le tableau de bord utilise.
Lire les statistiques d’un lien
GET /api/links/:slug/stats renvoie un résumé pour une plage de temps. Choisissez la plage avec ?range= - l’une de 1h, 24h, 7d, 30d, 90d, 183d, 365d, mtd ou ytd - ou donnez une fenêtre explicite avec ?from=<ms>&to=<ms> en millisecondes d’époque.
curl "https://qr2r.com/api/links/aA3k9/stats?range=30d" \
-H "Authorization: Bearer $KILO_API_KEY"La réponse renvoie la plage résolue, votre offre, les totaux d’en-tête, une série temporelle et des ventilations par dimension :
{
"range": { "from": 1716408000000, "to": 1719000000000, "clamped": false, "bucket": "day" },
"plan": { "slug": "pro", "limits": { /* … */ } },
"totals": { "opens": 1284, "visitors": 512 },
"timeseries": [ /* one point per bucket */ ],
"meta": { "generated_at": 1719000000000, "query_ms": 37, "cache": "miss" }
}opens compte les redirections servies ; visitors est le décompte distinct. Quand les dimensions de votre offre le permettent, la réponse porte aussi des blocs de ventilation (pays, appareils, référents, qualité du trafic et plus). La rétention et les dimensions que vous obtenez dépendent de l’offre : si vous demandez une fenêtre plus longue que ce que votre offre garde, la réponse revient avec range.clamped mis à true et from poussé jusqu’au bord de votre rétention.
Les mêmes chiffres, aucune IP brute
Ce sont les chiffres dont s’alimente la vue d’analyse du tableau de bord - l’API n’est que l’autre client. Comme partout chez Kilo, aucune IP brute n’est jamais stockée pour les produire ; les données dérivées de l’IP sont d’abord hachées avec un pepper rotatif.
Des GET compagnons couvrent les mêmes données sous des formes différentes : /stats/breakdown pour une seule dimension, /stats/timeseries pour la série seule et /stats/export pour un téléchargement. Les totaux au niveau du groupe vivent à GET /api/groups/:id/stats.
Lister et ajouter des règles de routage
Les règles d’un lien décident où va réellement un scan. Lisez-les avec GET /api/links/:slug/rules :
{ "rules": [ /* rule objects, in priority order */ ] }Ajoutez-en une avec POST /api/links/:slug/rules. Le type d’une règle est geo, device ou ab, et chacune porte une target_url. Une règle géo cible une liste de codes pays ISO-2 :
curl https://qr2r.com/api/links/aA3k9/rules \
-H "Authorization: Bearer $KILO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "type": "geo", "condition": { "countries": ["DE", "AT"] }, "target_url": "https://example.com/de" }'Une création renvoie 201 avec la règle stockée :
{
"id": 44,
"type": "geo",
"condition": { "countries": ["DE", "AT"] },
"target_url": "https://example.com/de",
"weight": 1,
"priority": 0,
"created_at": 1719000000000
}Mettez à jour la cible, le poids ou la priorité d’une règle avec PUT /api/rules/:id, et retirez-en une avec DELETE /api/rules/:id (qui renvoie { "ok": true }). Réordonnez les règles d’un lien de façon atomique avec POST /api/links/:slug/rules/reorder.
Les règles sont une fonctionnalité payante
Appliqué à l’API, pas seulement au tableau de bord : une règle geo ou device nécessite la limite d’offre targeting_rules, et une règle ab nécessite ab_testing. Sans cela, la création est refusée avec 402 plan_required, si bien que l’offre gratuite ne peut pas être débloquée en appelant l’endpoint directement.
Les règles s’évaluent à la périphérie dans la redirection elle-même, sans jamais toucher une base de données sur le chemin chaud - la mécanique est dans le guide des règles de routage. Voilà la surface de l’API : clés et scopes, liens, statistiques et règles, jusqu’au bout.
Retour à tous les guides