Saltar al contenido
LinkProfit

API para desarrolladores

Una API REST que cubre todo lo que hace el panel

Crea enlaces, lee analíticas, conecta dominios y gestiona espacios de trabajo de clientes por HTTP con una clave Bearer. La API se genera a partir de los mismos esquemas de validación que usa el producto, se publica como OpenAPI y está congelada en la versión uno: los cambios incompatibles solo llegan como versión nueva.

Redirects served from the location closest to the click

Dos alcances de clave, porque hay dos tipos de llamante

Una clave de espacio de trabajo actúa dentro de un solo espacio: enlaces, analíticas, dominios disponibles para él y su propio consumo. Una clave de partner actúa sobre todo el negocio: clientes y sus suscripciones, los planes que vendes, todos los dominios, los pagos con su desglose de comisiones, las liquidaciones y una visión agregada de las analíticas. Los dos prefijos son visiblemente distintos, así que una clave pegada en el servicio equivocado falla de inmediato en lugar de hacer algo sorprendente.

Las claves se crean en el panel, se muestran una sola vez y se guardan únicamente como hash. Cada clave lleva su propia lista de alcances, así que a una integración que solo necesita leer analíticas se le puede emitir una clave incapaz de crear o borrar nada. A las claves se les puede poner fecha de caducidad y se revocan al instante, y se muestra la última vez que se usó cada una, que es como se encuentra la integración que nadie recuerda haber montado.

  • POST /links, GET /links, GET /links/{id}, PATCH /links/{id}, DELETE /links/{id}
  • POST /links/bulk — hasta cien enlaces por llamada
  • GET /links/{id}/qr — PNG o SVG, con un preajuste y un tamaño
  • GET /analytics/summary, /timeseries, /breakdown, /links/top, /export.csv
  • GET y POST /domains — conecta un dominio y lee los registros DNS que necesita
  • GET /workspace — límites del plan y consumo actual
  • GET /partner/clients, /partner/plans, /partner/payments, /partner/payouts

Predecible en lo que importa a las tres de la mañana

Todos los errores tienen la misma forma —un código, un mensaje legible y una URL de documentación—, así que una biblioteca cliente puede ramificar por el código y una persona puede leer el mensaje. Las listas se paginan con cursores en lugar de números de página, lo que mantiene los resultados estables mientras se crean enlaces por debajo.

Los límites por defecto son seiscientas solicitudes por minuto en una clave de espacio de trabajo y el doble en una clave de partner, con el límite, las solicitudes restantes y el momento de reinicio devueltos como cabeceras en cada respuesta. Superarlos devuelve un 429 con cabecera Retry-After en lugar de cortar la conexión, para que los clientes bien educados se replieguen correctamente. Las exportaciones de analíticas van en streaming, así que cien mil filas no obligan a sostener un informe en memoria por ninguna de las dos partes.

Webhooks para los eventos que si no acabarías consultando en bucle

Registra un endpoint y recibirás la creación, actualización y borrado de enlaces; los eventos del ciclo de vida del dominio a medida que un hostname pasa de SSL pendiente a activo o a error; y, en claves de partner, los eventos de suscripción y pago de clientes. Consultar cada minuto un endpoint de estado de dominio es exactamente el tipo de código que nadie debería estar escribiendo.

Cada entrega lleva una cabecera de firma HMAC-SHA256 con marca de tiempo para que tu receptor pueda verificar que el payload viene de nosotros y no es una repetición. Las entregas fallidas se reintentan cinco veces con esperas crecientes —un minuto, cinco, treinta, dos horas, doce—, tras lo cual el endpoint se marca como fallido y se envía un correo. Desde el panel se puede mandar un evento de prueba, de modo que la integración es verificable antes de que algo real dependa de ella.

Documentación generada a partir del código que se ejecuta

La especificación OpenAPI se construye con los mismos esquemas contra los que valida la API, lo que significa que no puede desviarse de la implementación como sí le pasa a una referencia escrita a mano. Se publica como archivo que puedes pasar a un generador de clientes y se renderiza como documentación de referencia navegable en este sitio, junto a guías escritas a mano de inicio rápido, paginación, errores, webhooks y límites de solicitudes.

La versión uno está congelada. Se pueden añadir campos nuevos, el comportamiento existente no cambiará, y todo lo que rompiese a un llamante espera a una versión dos en otra ruta. Si estás eligiendo un acortador sobre el que construir y no simplemente para usarlo, esa promesa vale más que cualquier endpoint concreto.

Código que habla por sí solo

Crear un enlace — curl
curl -X POST https://api.linkprofit.com/v1/links \
  -H 'Authorization: Bearer lp_live_XXXXXXXX' \
  -H 'Content-Type: application/json' \
  -d '{
    "url": "https://example.com/spring-collection",
    "domain_id": "dom_8kq2vn41",
    "slug": "spring",
    "title": "Spring collection",
    "utm": {
      "utm_source": "newsletter",
      "utm_medium": "email",
      "utm_campaign": "spring-2026"
    }
  }'
Crear un enlace — JavaScript fetch
const response = await fetch("https://api.linkprofit.com/v1/links", {
  method: "POST",
  headers: {
    Authorization: "Bearer lp_live_XXXXXXXX",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    url: "https://example.com/spring-collection",
    domain_id: "dom_8kq2vn41",
    slug: "spring",
  }),
});

if (!response.ok) {
  const { error } = await response.json();
  throw new Error(error.code + ": " + error.message);
}

const link = await response.json();
console.log(link, response.headers.get("X-RateLimit-Remaining"));
Crear un enlace — Python requests
import requests

response = requests.post(
    "https://api.linkprofit.com/v1/links",
    headers={"Authorization": "Bearer lp_live_XXXXXXXX"},
    json={
        "url": "https://example.com/spring-collection",
        "domain_id": "dom_8kq2vn41",
        "slug": "spring",
    },
    timeout=10,
)

if response.status_code == 429:
    raise SystemExit("rate limited, retry after " + response.headers["Retry-After"])

response.raise_for_status()
print(response.json())

Preguntas frecuentes

¿Qué planes incluyen acceso a la API?

Para los partners, el acceso a la API empieza en el plan Growth y está incluido en todos los superiores. Para tus propios clientes lo decides tú: el acceso a la API es uno de los interruptores de cada plan que crees, así que puede ser un nivel premium de tu servicio o venir incluido en todos.

¿Puede la API funcionar en mi propio hostname?

En la versión uno no. La API se sirve desde api.linkprofit.com, y los partners la documentan a sus clientes como la API de su servicio. Todo lo que un cliente ve en el navegador —panel, enlaces, correos, checkout— está en tus dominios; el hostname de la API es la única excepción honesta.

¿Hay un entorno de pruebas?

Usa un espacio de trabajo dedicado y una clave acotada a él. Los enlaces creados ahí se resuelven en un dominio real y producen analíticas reales, lo cual es más útil que un entorno simulado cuando estás comprobando que las redirecciones, la segmentación y los webhooks se comportan como dice la documentación.

Lanza tu acortador de enlaces de marca

Conecta un dominio, publica tus precios e invita a tu primer cliente: la mayoría de los partners arrancan en una tarde.

No hace falta tarjeta para la prueba.