Документация API

REST API для программной работы с короткими ссылками: создание из ваших систем (сайт, CRM, скрипты), управление и выгрузка статистики. Все ответы — в формате JSON, кодировка UTF-8.

Авторизация Создание ссылки Список Изменение Удаление Статистика Экспорт CSV QR-код Ошибки

Авторизация

Создайте API-токен в кабинете: Настройки → API-токены → Новый токен. Токен показывается один раз — сохраните его сразу. Передавайте токен в заголовке каждого запроса:

Authorization: Bearer trc_sk_ваш_токен

Базовый адрес API: https://lnl.su/api

Токен привязан к одному рабочему пространству — все созданные им ссылки попадают туда, видит он тоже только его. Указывать пространство в запросах не нужно.
Токену доступны только ссылки и статистика. Управление аккаунтом, пространствами и другими токенами по токену запрещено (вернётся 403) — это защита на случай утечки.

Создание ссылки

POST/api/links
ПолеТипОписание
urlстрока, обязательноеКуда ведёт ссылка. Только http:// или https://.
aliasстрокаСвой код ссылки (lnl.su/алиас). Пусто — сгенерируется автоматически. Изменить после создания нельзя.
titleстрокаЗаголовок для списка в кабинете, посетителям не виден.
tagстрокаПроект/тег для группировки.
utm_passthroughbool, по умолч. trueПереносить query-параметры (UTM-метки) на целевой адрес.
expires_atстрока RFC 3339 или nullМомент, после которого ссылка перестаёт работать. Пример: 2026-12-31T23:59:59Z.
curl -X POST https://lnl.su/api/links \
  -H "Authorization: Bearer trc_sk_ваш_токен" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/landing?utm_source=email","alias":"vesna","title":"Весенняя акция","tag":"маркетинг"}'

Ответ 201 Created — объект ссылки (он же возвращается при изменении и в списке):

{
  "code": "vesna",
  "short_url": "https://lnl.su/vesna",
  "target_url": "https://example.com/landing?utm_source=email",
  "title": "Весенняя акция",
  "tag": "маркетинг",
  "active": true,
  "utm_passthrough": true,
  "clicks": 0,
  "expires_at": null,
  "created_at": "2026-07-02T12:00:00Z"
}

Список ссылок

GET/api/links?limit=200

Возвращает массив объектов ссылок пространства, новые сверху. limit — до 500, по умолчанию 200.

curl https://lnl.su/api/links -H "Authorization: Bearer trc_sk_ваш_токен"

Изменение ссылки

PATCH/api/links/{code}

Частичное обновление: передавайте только те поля, которые меняете. Короткий код при этом не меняется — можно перенаправить старую ссылку на новый адрес.

ПолеТипОписание
target_urlстрокаНовый целевой адрес.
titleстрокаЗаголовок.
tagстрокаПроект/тег.
activeboolfalse — выключить ссылку (посетители увидят страницу «отключена»), true — включить.
utm_passthroughboolПеренос UTM-меток.
expires_atстрока или nullНовый срок. null — убрать ограничение.
curl -X PATCH https://lnl.su/api/links/vesna \
  -H "Authorization: Bearer trc_sk_ваш_токен" \
  -H "Content-Type: application/json" \
  -d '{"active": false}'

Удаление ссылки

DELETE/api/links/{code}

Удаляет ссылку навсегда вместе с её статистикой. Ответ — 204 No Content. Если нужно просто остановить переходы, лучше выключить ссылку через PATCH — статистика сохранится.

curl -X DELETE https://lnl.su/api/links/vesna -H "Authorization: Bearer trc_sk_ваш_токен"

Статистика

GET/api/links/{code}/stats?days=30

days — период в днях от текущего момента (1–365, по умолчанию 30). Переходы ботов и превью-краулеров мессенджеров в цифры не входят (кроме поля bot_clicks).

{
  "code": "vesna",
  "range_days": 30,
  "total_clicks": 42,            // клики людей за период
  "unique_clicks": 30,           // уникальные посетители
  "bot_clicks": 7,               // отсеяно ботов (справочно)
  "countries_count": 4,
  "prev_total_clicks": 25,       // тот же период до этого — для сравнения
  "prev_unique_clicks": 18,
  "peak_date": "2026-06-24",     // самый активный день
  "peak_clicks": 9,
  "timeseries": [ {"date": "2026-06-03", "clicks": 5}, … ],
  "weekday":   [ {"name": "Пн", "clicks": 6}, … ],
  "devices":   [ {"name": "desktop", "clicks": 28}, … ],
  "browsers":  [ {"name": "Chrome", "clicks": 21}, … ],
  "countries": [ {"name": "RU", "clicks": 30}, … ],
  "referrers": [ {"name": "t.me", "clicks": 12}, … ]
}
GET/api/stats?days=30

То же самое, но сводно по всем ссылкам пространства токена; дополнительно — total_links, active_links и top_links (топ-10 ссылок за период).

Экспорт сырых событий (CSV)

GET/api/links/{code}/export.csv?days=30

Отдаёт CSV-файл (UTF-8 с BOM — открывается в Excel без кракозябр): по строке на каждый переход, включая ботов. Колонки: timestamp, country, device, browser, referrer. До 50 000 строк за запрос.

curl -o clicks.csv "https://lnl.su/api/links/vesna/export.csv?days=90" \
  -H "Authorization: Bearer trc_sk_ваш_токен"

QR-код ссылки

GET/{code}/qr.png?size=512

Публичный эндпоинт (без авторизации) — PNG с QR-кодом, ведущим на короткую ссылку. size — размер в пикселях, 128–1024, по умолчанию 512.

https://lnl.su/vesna/qr.png?size=1024

Ошибки

Ошибки приходят с соответствующим HTTP-кодом и телом вида:

{"error": "такой код уже занят"}
КодКогда
400Неверные данные: URL не начинается с http(s), битая дата, слишком большой файл и т. п.
401Нет токена, токен неверный или отозван.
403Операция недоступна по токену (управление аккаунтом, пространствами, токенами).
404Ссылка с таким кодом не найдена в вашем пространстве.
409Алиас уже занят или зарезервирован системой.
429Слишком много неудачных попыток входа (только для /api/auth/login).