справка за API

REST API
Градете върху вашите връзки.

Удостоверявайте се с API токен, изброявайте и създавайте връзки, четете посещения и се абонирайте за уеб кукички.

Основен URL адрес https://letl.ink/api/v1 Само HTTPS

Планове Growth Ultimate
На тази страница

Първи стъпки

REST API е наличен на Growth и Ultimate. Заявките отиват до https://letl.ink/api/v1 през HTTPS. Работно пространство на Free или Solo получава 403 plan_required от /api/v1; крайната точка на MCP е затворена отделно на Ultimate.

  1. Отворете Интеграции → REST API (само за собственици и администратори на работни пространства).
  2. Генерирайте токен. Не изтича.
  3. Съхранявайте го като парола. Един токен обслужва REST API, MCP сървъра и всяка платформа за автоматизация, свързана към това работно пространство, така че повторното му генериране ги обезсилва всички наведнъж.

Членовете могат да копират съществуващ токен, ако такъв е бил генериран; само собственици и администратори могат да го въртят.

Удостоверяване

Изпратете токена като X-API-KEY или като Authorization: Bearer. И двете се приемат на /api/v1 и на /mcp. Заявка без изобщо токен връща 401 unauthenticated.

GET кой съм аз
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/auth/me

Еквивалентна заглавка: Authorization: Bearer YOUR_TOKEN

Конвенции

Те се държат във всяка крайна точка по-долу.

Плик за отговор

Всеки успешен отговор е JSON обект с ключ data и ключ meta, когато има какво да се каже за резултата — пагинация, прозорец за разрешена дата, дали е включена география. Всяка повреда е обект с error ключ, съдържащ стабилен code, човешки message и понякога details. Разклоняване на code, никога на текст на съобщение.

Форми
// success
{ "data": { … }, "meta": { … } }

// failure
{ "error": { "code": "invalid_parameter",
             "message": "sort must be one of: created_at, clicks.",
             "details": { "parameter": "sort" } } }

Пагинация

Крайните точки на списъка приемат limit (1–200, по подразбиране 50) и offset. Блокът meta отчита total, has_more и next_offset, така че можете да пейджирате, без да правите аритметика: продължете да се обаждате с offset = meta.next_offset, докато has_more стане false.

Страниране през всяка връзка
offset=0
while [ "$offset" != "null" ]; do
  page=$(curl -s -H "X-API-KEY: $TOKEN" \
    "https://letl.ink/api/v1/links?limit=200&offset=$offset")
  echo "$page" | jq -c '.data[]'
  offset=$(echo "$page" | jq -r '.meta.next_offset')
done

Сортиране, филтриране и търсене

GET /links приема sort (created_at, clicks, short_code, title, updated_at), direction (asc/desc), search (съвпада с кратък код, заглавие и дестинация), type, archived, favorite и domain. Неизвестните стойности се отхвърлят с invalid_parameter и списъка на разрешените, вместо да бъдат тихо игнорирани.

Прозорци за дата

start_date и end_date използват YYYY-MM-DD и включват и двата дни. Прозорец е прикрепен към дъното на задържане на вашия план — искането на план за 30-дневно задържане за една година история връща 30-те дни, които има, и meta.date_range ви казва реално използвания прозорец.

Ограничения на скоростта

600 заявки в минута на акаунт, на плъзгащ се прозорец. Всеки отговор носи X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset (времево клеймо на Unix). Превишаването на ограничението връща 429 rate_limited със заглавка Retry-After за секунди. Отдръпнете се на Retry-After, вместо да опитате отново веднага.

Заглавия на всеки отговор
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 586
X-RateLimit-Reset: 1789000816

Версиониране

Пътят носи версията. Добавянето на поле към отговор или нов незадължителен параметър не е критична промяна и може да се случи по всяко време, така че анализирайте отбранително и игнорирайте ключовете, които не разпознавате. Всичко, което би променило или премахнало съществуващо поле, се доставя под нов префикс на версията.

Крайни точки

акаунт

GET /me Тест за свързване

Идентичност, работно пространство, план и всяко право, което планът носи. Най-евтиният начин да потвърдите токен и да откриете какво е позволено да прави акаунтът, преди да го опитате.

GET cURL
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/me
Отговор 200
{
  "data": {
    "user": { "id": 1, "email": "[email protected]", "name": "You" },
    "workspace": { "id": 12, "name": "My Workspace", "block_bots": true },
    "plan": {
      "id": "growth",
      "name": "Growth",
      "limits": {
        "links": 200,
        "monthly_clicks": 100000,
        "custom_domains": 3,
        "qr_codes": 30,
        "retention_days": 365
      },
      "features": {
        "api": true,
        "webhooks": true,
        "integrations": true,
        "ai_access": false,
        "geo_analytics": false,
        "smart_link_types": true
      }
    },
    "base_domain": "letl.ink"
  }
}
GET /usage

Колко от всяка надбавка се изразходва през този месец на фактуриране. Използвайте го, за да предупредите клиент, преди да достигне тавана на проследяваните кликвания — след него пренасочването продължава да работи, но кликванията спират да се записват.

Отговор 200
{
  "data": {
    "links": { "used": 42, "limit": 200, "remaining": 158, "percent_used": 21.0 },
    "clicks_this_month": { "used": 8140, "limit": 100000, "remaining": 91860, "percent_used": 8.1 },
    "custom_domains": { "used": 1, "limit": 3, "remaining": 2, "percent_used": 33.3 },
    "qr_codes": { "used": 4, "limit": 30, "remaining": 26, "percent_used": 13.3 }
  },
  "meta": { "plan": "growth", "period": "2026-09" }
}
GET /domains

Персонализирани домейни в работното пространство и дали всеки от тях е завършил DNS проверката. Само проверени домейни могат да се използват като поле domain при създаване на връзка.

GET /integrations

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

Връзки

Анализ

GET /analytics/summary

Заглавните числа за цялото работно пространство: кликвания през цялото време и в прозореца, уникални посетители, QR сканирания, пиков ден и разпределение по час от деня и ден от седмицата. Приема days (по подразбиране 30, прикрепено към вашето задържане).

Отговор 200 (съкратено)
{
  "data": {
    "window_days": 30,
    "clicks": {
      "total": 24592, "window": 8140, "last_7_days": 2103,
      "daily_average": 271,
      "peak_day": { "date": "Sep 02", "clicks": 612 }
    },
    "visitors": { "unique_total": 18204, "unique_window": 6021 },
    "qr": { "scans_total": 940, "scans_window": 310 },
    "timing": {
      "by_hour": [12, 4, 2, …],
      "by_weekday": [1420, 1610, 1585, 1490, 1310, 480, 245],
      "peak_hour": { "peakHour": 14, "peakValue": 812, "label": "14:00–14:59" },
      "peak_weekday": { "peakDay": 1, "peakValue": 1610, "label": "Tuesday" }
    },
    "links": { "active": 42, "limit": 200 }
  },
  "meta": { "plan": "growth", "geo_included": true, "retention_days": 365 }
}
GET /analytics/timeseries

Дневните кликвания се броят, готови за диаграма. Предайте link_id, за да го обхватите до една връзка, и days, за да зададете прозореца. Дните без трафик се връщат като нула, вместо да се пропускат, така че серията винаги е последователна.

Отговор 200
{
  "data": [
    { "date": "Sep 04", "clicks": 22 },
    { "date": "Sep 05", "clicks": 11 }
  ],
  "meta": { "window_days": 7, "total": 33, "link_id": null }
}
GET /analytics/breakdown

Щракванията са групирани по едно измерение, като всеки ред има дял от общия брой.

Параметри на заявката

  • dimension string

    channel, referrer, device, browser, os, brand, variation или country. browser, os, brand и variation се нуждаят от link_id.

    Задължително
  • link_id integer

    Обхват до една връзка. Пропуснете за цялото работно пространство.

    Не е задължително
  • limit integer

    1–100. По подразбиране е 10.

    Не е задължително
Отговор 200
{
  "data": [
    { "label": "Search", "value": 215, "share": 33.1 },
    { "label": "Social", "value": 201, "share": 30.9 },
    { "label": "Direct / none", "value": 142, "share": 21.8 }
  ],
  "meta": { "dimension": "channel", "link_id": 49, "total": 650 }
}
GET /events Пагиниран

Необработената емисия за посещения във всяка връзка в работното пространство, първо най-новите. Това е модерният заместител на GET /visits: същите данни, стандартен плик, поддръжка на limit и offset.

Отговор 200
{
  "data": [
    {
      "id": 2691,
      "link_id": 49,
      "short_code": "spring",
      "occurred_at": "2026-09-10T22:45:33+00:00",
      "ip_address": "203.0.113.7",
      "referrer": "https://twitter.com/",
      "browser": "Chrome",
      "os": "iOS",
      "device_type": "mobile",
      "device_brand": "Apple",
      "country": "US",
      "variation": "control"
    }
  ],
  "meta": { "limit": 50, "returned": 50, "geo_included": true }
}

Уеб кукички

GET /hooks

Крайни точки на Webhook, регистрирани в този акаунт.

POST /hooks

Регистрирайте HTTPS крайна точка, за да получавате JSON полезен товар при всяко записано кликване. До 25 на акаунт. Неуспешните доставки се опитват автоматично.

JSON тяло

  • target_url

    Трябва да е https://.

    Задължително
  • event

    По подразбиране е link_visited, което в момента е единственото събитие.

    Не е задължително
POST cURL
curl -X POST https://letl.ink/api/v1/hooks \
  -H "X-API-KEY: YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"target_url": "https://example.com/hooks/clicks"}'
DELETE /hooks/{id}

Премахване на крайна точка на webhook. POST /hooks/subscribe и DELETE /hooks/unsubscribe/{id} остават налични за REST Hook потока на Zapier.

Наследство

GET /auth/me Наследство

Оригиналният тест за връзка: връща вашия потребителски идентификатор, имейл и идентификатор/име на работното пространство като плосък обект. GET /me връща същата самоличност плюс вашите планови ограничения и флагове за функции и е по-добрият избор за нов код.

GET cURL
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/auth/me
Отговор 200
{
  "id": 1,
  "email": "[email protected]",
  "workspace_id": 12,
  "workspace_name": "My Workspace"
}
GET /visits Наследство

50-те най-скорошни посещения в работното пространство като гол JSON масив — без плик — с използване на имена на полета visit_id, visit_time, link_shortcode и visitor_*. Ето какво гласи стъпката „списък за изпълнение“ на Zapier REST Hook, така че формата му е замразена. Използвайте GET /events за нова работа.

POST /hooks/subscribe Zapier

REST Hook абонирайте се. Взема target_url и незадължителен event (по подразбиране link_visited) и връща създадения абонаментен апартамент, без плик. POST /hooks е същата операция в стандартната форма.

DELETE /hooks/unsubscribe/{id} Zapier

REST Хук отписване, връщане на {"success": true}. DELETE /hooks/{id} е еквивалентът в стандартната форма.

Грешки

  • 400 невалидна_заявка

    Основният текст не беше JSON обект или липсваше задължително поле.

  • 400 невалиден_параметър

    Параметър на заявка е неправилно образуван или е извън неговия разрешен набор. details.parameter назовава нарушителя.

  • 401 неудостоверен

    Не е изпратен токен. Добавете X-API-KEY или Authorization: Bearer.

  • 401 невалиден_токен

    Токенът не съответства на нито един акаунт. Може да е регенериран.

  • 403 серия

    Планът на акаунта не включва тази крайна точка или функция. details.upgrade_url точки при фактуриране.

  • 403 забранено

    Удостоверен, но не е разрешен — например член, който се опитва да извърши действие само за собственика.

  • 404 not_found

    Няма такъв ресурс в това работно пространство. Идентификационните номера от друго работно пространство се съобщават като ненамерени, а не като забранени.

  • 409 конфликт

    Заявката се сблъсква с текущото състояние — лимитът на webhook е достигнат или акаунтът все още няма работно пространство.

  • 422

    Връща се от POST /links/bulk, когато всеки ред в пакета е неуспешен. Проверете meta.errors.

  • 429 rate_limited

    Над 600 заявки в последната минута. Изчакайте Retry-After секунди.

Наследените GET /visits и GET /links/{id}/visits крайни точки връщат гол JSON масив със собствени имена на полета и са замразени за вече изградените върху тях интеграции на Zapier. Новият код трябва да използва GET /events и GET /links/{id}/events, които използват стандартния плик и поддържат страниране.

Все още имате въпроси?

Ние сме тук, за да помогнем. Обадете се и ние ще се свържем с вас възможно най-скоро.