Перейти к содержимому
LinkProfit

API для разработчиков

REST API, который умеет всё то же, что и панель

Создавайте ссылки, читайте аналитику, подключайте домены и управляйте клиентскими рабочими пространствами по HTTP с bearer-ключом. API генерируется из тех же схем валидации, что использует продукт, публикуется в OpenAPI и заморожен на первой версии — несовместимые изменения приходят только новой версией.

Redirects served from the location closest to the click

Две области действия ключей, потому что вызывающих сторон тоже две

Ключ рабочего пространства действует внутри одного пространства: ссылки, аналитика, доступные ему домены и собственное потребление лимитов. Партнёрский ключ действует в масштабах бизнеса: клиенты и их подписки, продаваемые вами тарифы, все домены, платежи с разбивкой по комиссиям, выплаты и сводный обзор аналитики. Префиксы у них заметно разные, поэтому ключ, вставленный не в тот сервис, сразу отказывает, а не делает что-то неожиданное.

Ключи создаются в панели, показываются один раз и хранятся только как хеш. У каждого ключа свой список прав, поэтому интеграции, которой нужно только читать аналитику, можно выдать ключ, не способный ничего создать или удалить. Ключу можно задать срок действия и мгновенно его отозвать, а время последнего использования отображается — именно так находится интеграция, о настройке которой никто не помнит.

  • POST /links, GET /links, GET /links/{id}, PATCH /links/{id}, DELETE /links/{id}
  • POST /links/bulk — до ста ссылок за вызов
  • GET /links/{id}/qr — PNG или SVG, с пресетом и размером
  • GET /analytics/summary, /timeseries, /breakdown, /links/top, /export.csv
  • GET и POST /domains — подключить домен и прочитать нужные ему DNS-записи
  • GET /workspace — лимиты тарифа и текущее потребление
  • GET /partner/clients, /partner/plans, /partner/payments, /partner/payouts

Предсказуемость в том, что важно в три часа ночи

Каждая ошибка имеет одну и ту же форму — код, человекочитаемое сообщение и адрес документации, — поэтому клиентская библиотека может ветвиться по коду, а человек прочитать сообщение. Списки разбиваются на страницы курсорами, а не номерами страниц, и результат остаётся стабильным, пока под вами создаются новые ссылки.

Лимит частоты по умолчанию — шестьсот запросов в минуту для ключа рабочего пространства и вдвое больше для партнёрского ключа, а сам лимит, остаток и время сброса возвращаются заголовками в каждом ответе. Превышение даёт 429 с заголовком Retry-After, а не разрыв соединения, поэтому воспитанные клиенты корректно отступают. Экспорт аналитики идёт потоком, поэтому сто тысяч строк не требуют держать отчёт в памяти ни с одной стороны.

Webhook для событий, которые иначе пришлось бы опрашивать

Зарегистрируйте эндпоинт и получайте создание, изменение и удаление ссылок; события жизненного цикла домена, когда имя хоста переходит из ожидания SSL в активное состояние или в ошибку; а на партнёрских ключах — события подписок и платежей клиентов. Опрос эндпоинта статуса домена раз в минуту — ровно тот код, который никому не следует писать.

Каждая доставка несёт заголовок подписи HMAC-SHA256 с отметкой времени, чтобы ваш приёмник мог убедиться, что данные пришли от нас и не являются повтором. Неудавшиеся доставки повторяются пять раз с растущими паузами — минута, пять, тридцать, два часа, двенадцать, — после чего эндпоинт помечается неисправным и уходит письмо. Тестовое событие отправляется из панели, поэтому интеграцию можно проверить до того, как от неё начнёт что-то зависеть.

Документация, сгенерированная из работающего кода

Спецификация OpenAPI собирается из тех же схем, по которым API проверяет входные данные, а значит, она не может разойтись с реализацией так, как расходится написанный руками справочник. Она публикуется файлом, который можно скормить генератору клиентов, и отрисовывается как просматриваемый справочник на этом сайте, рядом с написанными вручную руководствами по быстрому старту, пагинации, ошибкам, webhook и лимитам частоты.

Первая версия заморожена. Новые поля могут добавляться, существующее поведение не изменится, а всё, что сломало бы вызывающую сторону, ждёт второй версии по другому пути. Если вы выбираете сокращатель, чтобы строить на нём, а не просто пользоваться, это обещание стоит больше любого отдельного эндпоинта.

Код, который говорит сам за себя

Создание ссылки — 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"
    }
  }'
Создание ссылки — 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"));
Создание ссылки — 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())

Частые вопросы

Какие тарифы включают доступ к API?

Для партнёров доступ к API начинается с тарифа Growth и включён во все более старшие. Для ваших собственных клиентов решаете вы: доступ к API — один из переключателей на каждом создаваемом вами тарифе, поэтому он может быть премиальным уровнем вашего сервиса или входить везде.

Может ли API работать на моём собственном хосте?

В первой версии — нет. API отдаётся с api.linkprofit.com, и партнёры документируют его своим клиентам как API своего сервиса. Всё, что клиент видит в браузере, — панель, ссылки, письма, оформление оплаты — находится на ваших доменах; имя хоста API — единственное честно оговорённое исключение.

Есть ли песочница для тестов?

Используйте отдельное рабочее пространство и ключ с областью действия в его границах. Созданные там ссылки разрешаются на настоящем домене и дают настоящую аналитику, а это полезнее симулированной среды, когда вы проверяете, что редиректы, таргетинг и webhook ведут себя так, как описано.

Запустите свой брендированный сокращатель ссылок

Подключите домен, опубликуйте цены и пригласите первого клиента — большинство партнёров запускаются за вечер.

Для пробного периода карта не нужна.