Saltar al contenido
LinkProfit

Bibliotecas de cliente

Clientes oficiales de LinkProfit para Node, Python y PHP: un mismo contrato para reintentos, idempotencia y paginación, más un inicio rápido en cada lenguaje.

Actualizado el 14 de agosto de 2026

La API REST es HTTP y JSON a secas, y una llamada con fetch es una forma perfectamente válida de usarla. Las bibliotecas de cliente existen para las partes que a nadie le apetece escribir dos veces: reintentar bien una solicitud que ha topado con el límite, hacer que una creación reintentada sea segura y recorrer un cursor hasta el final de una lista.

Tres bibliotecas, un mismo contrato:

| Lenguaje | Paquete | Código fuente | | --- | --- | --- | | Node.js / TypeScript | @linkprofit/sdk | packages/sdk-node | | Python | linkprofit | sdk/python | | PHP | linkprofit/linkprofit-php | sdk/php |

Instalación

Los paquetes todavía no están en npm, PyPI ni Packagist. La publicación depende de las cuentas en los registros; el código está terminado y hoy se instala desde una copia local del repositorio, y los comandos de abajo se convertirán en un solo npm install @linkprofit/sdk (y sus equivalentes) en cuanto existan esas cuentas.

Node, desde una copia local:

npm install /path/to/linkprofit/packages/sdk-node

Python, desde una copia local:

pip install /path/to/linkprofit/sdk/python

PHP, mediante un repositorio de tipo path de Composer en tu composer.json:

{
  "repositories": [
    { "type": "path", "path": "/path/to/linkprofit/sdk/php" }
  ],
  "require": {
    "linkprofit/linkprofit-php": "*"
  }
}

Lo que las tres hacen igual

Las bibliotecas son deliberadamente aburridas y deliberadamente parecidas. Aprende el comportamiento una vez y te vale en cualquier lenguaje.

Autenticación. Le pasas una clave de espacio de trabajo (lp_live_…) y el cliente pone la cabecera Authorization en cada solicitud. La URL base es una opción, así que el mismo código puede ejecutarse contra una instancia local en las pruebas. Consulta Autenticación para los alcances y la rotación.

Reintentos que respetan al servidor. Un 429 o un 5xx pasajero se reintenta con espera creciente, y Retry-After se respeta en lugar de adivinarse: el servidor ya sabe cuándo se libera la ventana. El número de intentos está topado, y una solicitud que falla por sus propios motivos (validation_failed, conflict, not_found) no se reintenta nunca: repetir una solicitud incorrecta solo gasta presupuesto del límite de solicitudes.

Mutaciones idempotentes. Toda llamada que modifica algo lleva una Idempotency-Key, así que un reintento tras un tiempo de espera agotado en la red devuelve la respuesta guardada en lugar de crear un segundo enlace. Puedes aportar tu propia clave —el id de un pedido, el id de una tarea— cuando el reintento pueda venir de otro proceso o de una ejecución posterior. Las claves viven 24 horas; la misma clave con un cuerpo distinto responde 409.

Paginación por cursor como iterador. Los endpoints de listado se paginan por cursor, y los clientes los exponen como iteradores: tú recorres los enlaces, el cliente pide la página siguiente cuando se agota la actual y se detiene cuando el cursor vale null. Sin aritmética de páginas y sin el riesgo de ese desfase de uno que se come una fila en silencio.

Errores como excepciones. Los fallos lanzan el tipo de error natural de cada lenguaje, con el code de la API, el mensaje para personas y, en los fallos de validación, los details por campo. Ramifica según el código y no según el texto del mensaje: los códigos son el contrato documentado.

Los tipos de solicitud y respuesta del cliente de Node se generan a partir del mismo documento OpenAPI que renderiza la referencia —publicado en /openapi.json—, así que los tipos no pueden desviarse de la API en funcionamiento. Los clientes de Python y PHP siguen ese mismo documento a mano, con los modismos de su lenguaje.

Inicio rápido

Cada paquete incluye un README con toda su superficie; los fragmentos de abajo muestran la forma que comparten los tres: construyes un cliente con una clave, llamas al grupo de recursos y recibes de vuelta un objeto tipado.

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'];

Cuál conviene usar

  • Node / TypeScript — la superficie más completa, porque sus tipos salen directamente del documento OpenAPI. La opción natural para un backend en JavaScript, una función serverless o un script de compilación.
  • Python — para informes y trabajo con datos: llevar las analíticas a un cuaderno, a una tarea programada o a la alimentación de un panel.
  • PHP — para el mundo de los CMS. Un plugin de WordPress o un servicio en Laravel que acorta enlaces a medida que se publica el contenido.
  • Ninguna de ellas — si tu lenguaje es otro, la API es HTTP corriente. El inicio rápido empieza por curl, y todo lo que hacen los clientes (reintentos, idempotencia, cursores) es comportamiento documentado que puedes implementar en cincuenta líneas.

Elijas lo que elijas, la referencia de la API es la lista completa de endpoints, campos y códigos de error: las bibliotecas son una comodidad por encima de ella, nunca una API distinta.

También merece la pena leer

  • Límites de solicitudes — el presupuesto dentro del cual trabaja la lógica de reintentos.
  • Webhooks — recibe los eventos empujados en lugar de sondearlos.
  • Servidor MCP — las mismas operaciones desde un asistente de IA.