Bibliothèques clientes
Clients officiels LinkProfit pour Node, Python et PHP : un contrat commun pour les reprises, l’idempotence et la pagination, plus un démarrage rapide par langage.
Mis à jour le 14 août 2026
L’API REST n’est que du HTTP et du JSON, et un appel fetch est une façon
parfaitement convenable de s’en servir. Les bibliothèques clientes existent
pour les parties que personne n’aime écrire deux fois : reprendre correctement
une requête refusée par la limite de débit, rendre sûre une création
réessayée, et dérouler un curseur jusqu’au bout d’une liste.
Trois bibliothèques, un seul contrat :
| Langage | Paquet | Sources |
| --- | --- | --- |
| Node.js / TypeScript | @linkprofit/sdk | packages/sdk-node |
| Python | linkprofit | sdk/python |
| PHP | linkprofit/linkprofit-php | sdk/php |
Installation
Les paquets ne sont pas encore publiés sur npm, PyPI ni Packagist. La
publication attend les comptes de registre ; le code est complet et s’installe
dès aujourd’hui depuis une copie locale du dépôt, et les commandes ci-dessous
deviendront un simple npm install @linkprofit/sdk (et ses équivalents) dès
que les comptes existeront.
Node, depuis une copie locale :
npm install /path/to/linkprofit/packages/sdk-node
Python, depuis une copie locale :
pip install /path/to/linkprofit/sdk/python
PHP, via un dépôt Composer de type path dans votre composer.json :
{
"repositories": [
{ "type": "path", "path": "/path/to/linkprofit/sdk/php" }
],
"require": {
"linkprofit/linkprofit-php": "*"
}
}
Ce que les trois font de la même façon
Les bibliothèques sont délibérément ennuyeuses et délibérément semblables. Apprenez le comportement une fois, il vaut dans tous les langages.
Authentification. Vous passez une clé d’espace de travail (lp_live_…) ;
le client pose l’en-tête Authorization sur chaque requête. L’URL de base est
une option : le même code peut donc tourner contre une instance locale dans
les tests. Voir Authentification pour les portées
et la rotation.
Des reprises qui respectent le serveur. Un 429 ou un 5xx passager est
réessayé avec un délai croissant, et Retry-After est respecté plutôt que
deviné — le serveur sait déjà quand la fenêtre se libère. Le nombre de
tentatives est plafonné, et une requête qui échoue sur le fond
(validation_failed, conflict, not_found) n’est jamais réessayée :
répéter une requête fausse ne fait que gaspiller le budget de la limite de
débit.
Des mutations idempotentes. Chaque appel de mutation porte une
Idempotency-Key : une reprise après un délai d’attente réseau renvoie donc
la réponse stockée au lieu de créer un second lien. Vous pouvez fournir votre
propre clé — un identifiant de commande, un identifiant de tâche — quand la
reprise peut venir d’un autre processus ou d’une exécution ultérieure. Les
clés sont conservées 24 heures ; la même clé avec un corps différent répond
409.
La pagination par curseur sous forme d’itérateur. Les endpoints de liste
sont paginés par curseur, et les clients les exposent
comme des itérateurs : vous bouclez sur les liens, le client va chercher la
page suivante quand la page courante est épuisée et s’arrête quand le curseur
vaut null. Aucune arithmétique de pages, aucun risque de décalage d’une
unité qui perd une ligne en silence.
Les erreurs sous forme d’exceptions. Un échec lève le type d’erreur
naturel du langage, qui porte le code de l’API, le message lisible et, pour
les échecs de validation, les details champ par champ. Branchez sur le code,
pas sur le texte du message — ce sont les codes qui forment le
contrat documenté.
Les types de requête et de réponse du client Node sont générés à partir du document OpenAPI que rend la référence — publié sur /openapi.json — si bien que les types ne peuvent pas s’écarter de l’API en service. Les clients Python et PHP suivent le même document à la main, dans l’idiome de leur langage.
Démarrage rapide
Chaque paquet est livré avec un README qui décrit toute sa surface ; les extraits ci-dessous montrent la forme commune aux trois — construire un client avec une clé, appeler le groupe de ressources, récupérer un objet typé.
Node
import { LinkProfit } from "@linkprofit/sdk";
const client = new LinkProfit({ apiKey: process.env.LINKPROFIT_API_KEY });
const created = await client.createLink({
url: "https://example.com/summer-sale",
title: "Summer sale",
});
console.log(created.data.short_url);
Python
import os
from linkprofit import LinkProfit
client = LinkProfit(os.environ["LINKPROFIT_API_KEY"])
created = client.create_link(
{"url": "https://example.com/summer-sale", "title": "Summer sale"}
)
print(created["data"]["short_url"])
PHP
<?php
require __DIR__ . '/vendor/autoload.php';
use LinkProfit\LinkProfit;
$client = new LinkProfit(getenv('LINKPROFIT_API_KEY'));
$created = $client->createLink([
'url' => 'https://example.com/summer-sale',
'title' => 'Summer sale',
]);
echo $created['data']['short_url'];
Laquelle choisir
- Node / TypeScript — la surface la plus complète, parce que ses types viennent directement du document OpenAPI. Le choix naturel pour un backend JavaScript, une fonction serverless ou un script de build.
- Python — pour le reporting et le travail sur les données : tirer les statistiques dans un notebook, une tâche planifiée ou l’alimentation d’un tableau de bord.
- PHP — pour le monde des CMS. Un plugin WordPress ou un service Laravel qui raccourcit les liens au fil de la publication du contenu.
- Aucune des trois — si votre langage est ailleurs, l’API n’est que du
HTTP ordinaire. Le démarrage rapide est écrit
d’abord pour
curl, et tout ce que font les clients (reprises, idempotence, curseurs) est un comportement documenté que vous pouvez implémenter en cinquante lignes.
Quel que soit votre choix, la référence de l’API donne la liste complète des endpoints, des champs et des codes d’erreur — les bibliothèques ne sont qu’une commodité par-dessus, jamais une autre API.
À lire aussi
- Limites de débit — le budget dans lequel travaille la logique de reprise.
- Webhooks — recevoir les événements poussés au lieu d’aller les chercher.
- Serveur MCP — les mêmes opérations depuis un assistant IA.