Интеграции
Подключайте URLY.UZ к Zapier, Make, n8n и своим системам через REST API, подписанные вебхуки, MCP, Telegram-бота и расширение для браузера.
Аутентификация
Все запросы отправляются с 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:
- Создайте модуль «Webhooks → Custom webhook» и скопируйте его адрес.
- Добавьте адрес в разделе Вебхуки кабинета URLY и выберите события.
- Для действий вызывайте URLY API модулем «HTTP → Make a request» с заголовком Authorization: Bearer.
n8n
В n8n:
- Добавьте узел-триггер «Webhook» (POST) и укажите его production-адрес как вебхук в URLY.
- Проверьте подпись в узле «Code» примером на Node.js выше (включите «Raw body» в узле Webhook).
- Для действий используйте узел «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-ключ и не загружает внешний код.