URLY.UZ

Интеграции

Подключайте URLY.UZ к Zapier, Make, n8n и своим системам через REST API, подписанные вебхуки, MCP, Telegram-бота и расширение для браузера.

Скачать спецификацию OpenAPI API

Аутентификация

Все запросы отправляются с API-ключом (кабинет → API-ключи). Давайте ключу только нужные права, например webhooks:write для вебхуков.

Authorization: Bearer urly_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Вебхуки

Добавьте адрес вебхука в кабинете или через POST /api/v1/webhooks. URLY отправляет каждое событие POST-запросом в JSON; заголовок urly-webhook-id не меняется при повторных доставках, используйте его для защиты от дублей.

События
СобытиеНазначение
link.createdссылка создана
link.updatedссылка изменена
link.deletedссылка удалена в корзину
clicks.hourlyсводка переходов за час
link.clickedкаждый переход (Business)
domain.verifiedдомен подтверждён
subscription.changedизменился тариф или подписка
curl -s https://urly.uz/api/v1/webhooks \
  -H "Authorization: Bearer $URLY_API_KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://hooks.example.uz/urly","events":["link.created","clicks.hourly"]}'

Проверка подписи

Заголовок urly-signature имеет вид t=<время>,v1=<подпись>. Подпись — HMAC-SHA256("<время>.<тело запроса>") с секретом вебхука. В течение 24 часов после смены секрета приходят два значения v1. Отклоняйте запросы старше 5 минут.

// Node.js
const crypto = require("crypto");
function verify(rawBody, header, secret) {
  const items = header.split(",").map((kv) => kv.split("="));
  const t = Number(items.find(([k]) => k === "t")[1]);
  const want = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - t) < 300;
  return fresh && items.some(([k, v]) => k === "v1" && v.length === want.length &&
    crypto.timingSafeEqual(Buffer.from(v), Buffer.from(want)));
}
# Python
import hashlib, hmac, time
def verify(raw_body: bytes, header: str, secret: str) -> bool:
    items = [kv.split("=", 1) for kv in header.split(",")]
    t = int(next(v for k, v in items if k == "t"))
    want = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return abs(time.time() - t) < 300 and any(
        k == "v1" and hmac.compare_digest(v, want) for k, v in items)

При ответе не 2xx URLY повторяет доставку до 9 раз с интервалами от 30 секунд до 12 часов. После серии неудач или ответа 410 адрес отключается.

Zapier

В Zapier URLY подключается через Webhooks by Zapier и действие API Request:

  • Триггер: добавьте адрес «Catch Hook» как вебхук в URLY (REST hook: подписка через POST /api/v1/webhooks, отписка через DELETE /api/v1/webhooks/{id}).
  • Действие: POST /api/v1/links — создать короткую ссылку; в ответе есть поле short_url.
  • Триггер опросом: GET /api/v1/links?limit=25 возвращает новые ссылки первыми (дубли отсекайте по id).

Make

В Make:

  1. Создайте модуль «Webhooks → Custom webhook» и скопируйте его адрес.
  2. Добавьте адрес в разделе Вебхуки кабинета URLY и выберите события.
  3. Для действий вызывайте URLY API модулем «HTTP → Make a request» с заголовком Authorization: Bearer.

n8n

В n8n:

  1. Добавьте узел-триггер «Webhook» (POST) и укажите его production-адрес как вебхук в URLY.
  2. Проверьте подпись в узле «Code» примером на Node.js выше (включите «Raw body» в узле Webhook).
  3. Для действий используйте узел «HTTP Request» с Header Auth (Authorization: Bearer …).

MCP

AI-ассистенты (Claude, IDE и другие MCP-клиенты) подключаются к /api/v1/mcp по Streamable HTTP с API-ключом.

{
  "mcpServers": {
    "urly": {
      "type": "http",
      "url": "https://urly.uz/api/v1/mcp",
      "headers": { "Authorization": "Bearer ${URLY_API_KEY}" }
    }
  }
}

Инструменты: create_link, list_links, get_link_stats, create_qr. Они подчиняются правам ключа.

Telegram

Подключите бота в разделе Настройки → Telegram: сокращайте ссылки в чате, получайте статистику и QR-коды.

Расширение для браузера

Расширение для Chrome и Firefox сокращает текущую страницу в один клик, копирует результат и показывает QR-код. Оно использует только ваш API-ключ и не загружает внешний код.