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

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

Создавайте ссылки, управляйте ими и выгружайте статистику программно — через REST API Quik.mn.

Все сервисы

Все продукты платформы Quik.mn — через REST API и в веб-интерфейсе.

Короткая ссылка
REST API
QR-код
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
QR-меню
REST API
Подпись для почты
REST API
UTM builder
Бесплатные инструменты

Базовый адрес

Все endpoint начинаются с базового адреса:

https://quik.mn/api/v1

Авторизация

В каждом запросе передавайте API-ключ из панели управления в заголовке Authorization — вот так:

Authorization: Bearer qk_live_...

Никому не передавайте свой ключ. Если он попал в чужие руки, создайте новый в панели управления.

Список endpoint

Короткая ссылка
POST /api/v1/links Создать новую короткую ссылку
GET /api/v1/links Получить список ссылок
GET /api/v1/links/{id} Данные одной ссылки
PATCH /api/v1/links/{id} Изменить ссылку
DELETE /api/v1/links/{id} Удалить ссылку
POST /api/v1/links/{id}/extend Продлить срок — body: {"days": 365}
QR-код
GET /api/v1/links/{id}/qr Получить QR-код — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Создать счётчик Email Counter — ответ: gif_url + embed_html
GET /api/v1/timers Список счётчиков
GET /api/v1/timers/{id} Данные одного счётчика
PATCH /api/v1/timers/{id} Изменить счётчик
DELETE /api/v1/timers/{id} Удалить счётчик
Страница обратного отсчёта
POST /api/v1/countdowns Создать страницу Countdown — ответ: page_url
GET /api/v1/countdowns Список страниц
GET /api/v1/countdowns/{id} Данные одной страницы
PATCH /api/v1/countdowns/{id} Изменить страницу
DELETE /api/v1/countdowns/{id} Удалить страницу
Quik Bio
POST /api/v1/bio-pages Создать страницу Bio — ответ: page_url (аватар загружается только через веб)
GET /api/v1/bio-pages Список ваших страниц Bio
GET /api/v1/bio-pages/{id} Одна страница Bio — вместе со ссылками
PATCH /api/v1/bio-pages/{id} Изменить страницу Bio
DELETE /api/v1/bio-pages/{id} Удалить страницу Bio
GET /api/v1/bio-pages/{id}/stats Статистика Bio — просмотры и клики
GET /api/v1/bio-pages/{id}/links Список ссылок страницы Bio
POST /api/v1/bio-pages/{id}/links Добавить ссылку в Bio
PATCH /api/v1/bio-pages/{id}/links/{lid} Изменить ссылку в Bio
DELETE /api/v1/bio-pages/{id}/links/{lid} Удалить ссылку из Bio
QR-меню
POST /api/v1/menus Создать меню — ответ: page_url
GET /api/v1/menus Список ваших меню
GET /api/v1/menus/{id} Одно меню — вместе с блюдами
PATCH /api/v1/menus/{id} Изменить меню
DELETE /api/v1/menus/{id} Удалить меню
GET /api/v1/menus/{id}/stats Статистика сканирований — всего, за 30 дней и по столам
GET /api/v1/menus/{id}/items Список блюд
POST /api/v1/menus/{id}/items Добавить блюдо — фото загружается только через веб
PATCH /api/v1/menus/{id}/items/{iid} Изменить блюдо
DELETE /api/v1/menus/{id}/items/{iid} Удалить блюдо
Подпись для почты
POST /api/v1/signatures Создать подпись — логотип принимается только в виде адреса (URL)
GET /api/v1/signatures Список ваших подписей
GET /api/v1/signatures/{id} Одна подпись — вместе с signature_html
PATCH /api/v1/signatures/{id} Изменить подпись
DELETE /api/v1/signatures/{id} Удалить подпись
Аккаунт
GET /api/v1/me Данные текущего аккаунта

Параметры

POST /api/v1/links — поля body:

url required Целевой адрес перехода (http://… или https://…).
alias optional Собственное короткое имя (буквы, цифры, - и _; 1–64 символа). Принимается и под именем «slug».
title optional Заголовок (до 200 символов).
expires_at optional Срок действия — дата в будущем (например, 2026-12-31 23:59:59). Максимум 1 год; без указания — 1 год. Отправка null в PATCH вернёт срок к 1 году.
expire_days optional Или в днях: 1/7/30/90/180/365. Проще, чем expires_at.
starts_at optional Время активации — дата и время в UTC (например, 2026-08-01 02:00:00). До назначенного момента посетители видят обратный отсчёт; оно должно быть раньше expires_at. Отправьте null в PATCH, чтобы ссылка включилась сразу.
on_duplicate optional Если активная ссылка на этот адрес уже есть: "reuse" (по умолчанию — вернётся существующая, с полем reused:true) или "create" (создать новую). При указании alias новая ссылка создаётся всегда.

GET /api/v1/links — параметры query:

limit Сколько записей вернуть на странице (1–100, по умолчанию 25).
offset Сколько строк пропустить (постраничный вывод).
q Поиск — по slug, заголовку и целевому адресу.

Формат ошибок

Каждая ошибка возвращает HTTP-код состояния (401, 404, 409, 422, 429) и единую структуру JSON:

{ "error": "alias_taken", "message": "Этот алиас зарезервирован или уже занят." }

Частые коды: unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).

Ограничения

60 запросов в минуту на каждый API-ключ
При превышении вернётся ответ 429 rate_limited — подождите немного и повторите запрос.

Пример запроса

Пример создания короткой ссылки на cURL:

curl -X POST https://quik.mn/api/v1/links \
  -H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/очень/длинный/путь",
    "alias": "promo",
    "title": "Весенняя кампания",
    "expires_at": "2026-12-31 23:59:59"
  }'

Webhook

Зарегистрируйте endpoint в разделе Webhook панели управления — и при каждом выбранном событии мы отправим POST с JSON на ваш URL. Ответ 2xx считается успешным; иначе мы повторим до 3 раз с задержкой от 1 минуты до 10 минут. После 10 неудач подряд webhook отключается автоматически.

link.created Срабатывает при создании новой короткой ссылки (в веб-интерфейсе и через API)
link.deleted Срабатывает при удалении ссылки
link.expired Срабатывает, когда истекает срок ссылки или исчерпан лимит кликов (ежедневная проверка)
link.clicks.milestone Срабатывает при переходе порога в 100 / 1 000 / 10 000 кликов — в payload приходит поле milestone
timer.expired Срабатывает при завершении счётчика Email Counter
countdown.expired Срабатывает при завершении страницы обратного отсчёта
webhook.ping Тестовое событие, отправляемое кнопкой «Проверить»

Структура каждой доставки (пример):

{
  "event": "link.created",
  "created_at": "2026-07-18T09:30:00+00:00",
  "data": {
    "link": {
      "id": 42, "slug": "promo", "short_url": "https://quik.mn/promo",
      "long_url": "https://example.com/очень/длинный/путь", "title": "Весенняя кампания",
      "clicks": 0, "active": true, "state": "ok",
      "created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
    }
  }
}

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

Каждая доставка приходит с такими заголовками: X-Quik-Event (название события), X-Quik-Signaturesha256=HMAC_SHA256(body, secret). Secret показывается только один раз — при создании вебхука. ОБЯЗАТЕЛЬНО проверяйте подпись по необработанному (raw) body и только сравнением за постоянное время:

<?php
// PHP — проверка подписи по сырому (raw) телу запроса
$payload   = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_QUIK_SIGNATURE'] ?? '';
$expected  = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('invalid signature');
}
$event = json_decode($payload, true);
// $event['event'], $event['data'] ...
http_response_code(200);
// Node.js (Express) — проверка подписи по сырому (raw) телу запроса
const crypto = require('crypto');

app.post('/quik-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.get('X-Quik-Signature') || '';
  const expected  = 'sha256=' +
    crypto.createHmac('sha256', secret).update(req.body).digest('hex');

  const a = Buffer.from(expected), b = Buffer.from(signature);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).send('invalid signature');
  }
  const event = JSON.parse(req.body); // event.event, event.data ...
  res.sendStatus(200);
});

Ограничения: на тарифе Free — 1 вебхук, на Pro — 3, на Business — 10. Endpoint должен быть общедоступным адресом http/https (внутренние сетевые адреса запрещены).

Получите свой API-ключ
Создайте ключ в разделе API панели управления и начинайте прямо сейчас.
Получить API-ключ