Skip to main content
Rekla External API позволяет внешним партнёрам создавать публикации в Telegram-каналах пользователей Rekla, проверять доступ и отслеживать статусы. Base URL: https://api.rek.la

Подключение

1

Запросите доступ

Напишите в @rekla_support:
«Хочу подключиться как партнёр к Rekla External API»
Вам выдадут:
  • Partner ID — для заголовка X-Partner-Id
  • Webhook Secret — для проверки подписи вебхуков
  • Start-команда — для создания API-ключей пользователями
2

Получите API-ключ пользователя

Пользователь вводит команду в боте @rekla:
/start createapikey-<partner_name>
Бот создаёт ключ и показывает его пользователю. Одновременно Rekla отправит вебхук api_key.created на ваш сервер с данными ключа.
3

Делайте запросы

curl -H "X-API-Key: rekla_api:xxx" \
     -H "X-Partner-Id: your_partner_id" \
     https://api.rek.la/external-api/me

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

ЗаголовокОписание
X-API-KeyAPI-ключ пользователя Rekla
X-Partner-IdВаш идентификатор партнёра
API-ключ показывается пользователю один раз. Повторно получить его невозможно.

Эндпоинты

GET /external-api/me

Получить информацию о владельце API-ключа.
curl -H "X-API-Key: rekla_api:xxx" \
     -H "X-Partner-Id: your_partner_id" \
     https://api.rek.la/external-api/me
Ответ 200:
{
  "id": 753967249,
  "name": "Максим",
  "username": "m5286606"
}

GET /external-api/channels//can-post

Проверить, может ли пользователь публиковать в указанный канал. Проверяется два условия:
  1. У пользователя есть права автопостинга в канале
  2. Бот Rekla является администратором канала с правами на публикацию
curl -H "X-API-Key: rekla_api:xxx" \
     -H "X-Partner-Id: your_partner_id" \
     https://api.rek.la/external-api/channels/-1001568992973/can-post
Ответ 200:
{
  "autoposting_access": true
}
Ответ 403:
{
  "detail": "Access denied. You do not have permission in Rekla to post into this channel."
}
channel_id — это числовой Telegram ID канала (обычно начинается с -100).

POST /external-api/publications

Создать одну или несколько публикаций. Принимает массив объектов.
curl -X POST \
     -H "Content-Type: application/json" \
     -H "X-API-Key: rekla_api:xxx" \
     -H "X-Partner-Id: your_partner_id" \
     -d '[{
       "external_id": "pub-001",
       "channel_id": -1001568992973,
       "text": "Текст публикации",
       "text_len": 18,
       "media_type": "text",
       "price": 1500,
       "publish_date": "2026-03-01T12:00:00Z",
       "payment_status": "not_paid",
       "file_id": null,
       "file_url": null,
       "album": null,
       "poll": null,
       "inline_buttons": null,
       "auto_delete": null,
       "with_sound_notification": false,
       "wp_preview": false,
       "allow_comments": true,
       "has_spoiler": false,
       "protect_content": false,
       "wp_preview_config": null,
       "comment": null
     }]' \
     https://api.rek.la/external-api/publications
Ответ 201:
{
  "publications": [
    {
      "id": 11607,
      "external_id": "pub-001"
    }
  ]
}
ПолеТипОбязательноОписание
external_idstringВаш внутренний ID публикации
channel_idintegerTelegram ID канала
textstringТекст публикации (HTML-разметка Telegram)
text_lenintegerДлина текста
media_typestringТип медиа: text, photo, video, animation, document, audio, voice, video_note, sticker, album, poll
file_idstringTelegram file_id (если есть)
file_urlstringURL файла (система получит file_id автоматически)
albumobjectКонфигурация альбома (обязательно при media_type: album)
pollobjectКонфигурация опроса (при media_type: poll)
inline_buttonsobjectИнлайн-кнопки
pricenumberЦена публикации
publish_datestringДата публикации (ISO 8601)
payment_statusstringnot_paid (по умолчанию), paid, barter
auto_deleteintegerАвтоудаление через N минут
with_sound_notificationbooleanЗвуковое уведомление (false по умолчанию)
wp_previewbooleanПредпросмотр ссылок
wp_preview_configobjectНастройки предпросмотра: is_disabled, url, prefer_small_media, show_above_text
allow_commentsbooleanРазрешить комментарии (true по умолчанию)
has_spoilerbooleanСпойлер на медиа
protect_contentbooleanЗащита от копирования
commentstringКомментарий к публикации
Альбомы (media_type: album): поле album обязательно и не может быть пустым. Только последний элемент альбома может содержать caption. Поле text должно совпадать с caption последнего элемента.Медиа-файлы: для типов кроме text и poll нужен file_id или file_url. При указании file_url система автоматически получит file_id через бота Rekla.Дата публикации: принимается в формате ISO 8601. Таймзона автоматически удаляется (хранится как naive datetime).
[{
  "external_id": "pub-photo-001",
  "channel_id": -1001568992973,
  "text": "Подпись к фото",
  "text_len": 14,
  "media_type": "photo",
  "file_id": null,
  "file_url": "https://example.com/image.jpg",
  "album": null,
  "poll": null,
  "inline_buttons": {
    "inline_keyboard": [[
      {"text": "Подробнее", "url": "https://example.com"}
    ]]
  },
  "price": 2000,
  "publish_date": "2026-03-01T14:00:00Z",
  "payment_status": "paid",
  "auto_delete": 1440,
  "with_sound_notification": false,
  "wp_preview": false,
  "allow_comments": false,
  "has_spoiler": false,
  "protect_content": true,
  "wp_preview_config": null,
  "comment": "Рекламная кампания #1"
}]
Коды ответов:
КодОписание
201Публикации созданы
403Нет доступа к одному или нескольким каналам
422Ошибка валидации входных данных
400Непредвиденная ошибка
Создание атомарно: если одна публикация из массива не пройдёт валидацию, ни одна не будет создана.

POST /external-api/publications/cancel

Отменить публикацию.
curl -X POST \
     -H "Content-Type: application/json" \
     -H "X-API-Key: rekla_api:xxx" \
     -H "X-Partner-Id: your_partner_id" \
     -d '{"publication_id": 11607, "channel_id": -1001568992973}' \
     https://api.rek.la/external-api/publications/cancel
Ответ 204: пустое тело (успешная отмена).
Отменить можно только публикацию, созданную через вашего партнёра. Попытка отменить чужую публикацию вернёт 404.

POST /external-api/publications/status

Проверить статус публикации.
curl -X POST \
     -H "Content-Type: application/json" \
     -H "X-API-Key: rekla_api:xxx" \
     -H "X-Partner-Id: your_partner_id" \
     -d '{"publication_id": 11607, "channel_id": -1001568992973}' \
     https://api.rek.la/external-api/publications/status
Ответ 200:
{
  "publication_id": 11607,
  "publication_link": "https://t.me/c/1568992973/42",
  "publish_date": "2026-03-01T12:00:00",
  "auto_delete": null,
  "publish_status": "published",
  "payment_status": "not_paid",
  "delete_date": null
}
СтатусОписание
createdПубликация создана, ожидает отправки
publishedОпубликована в канале
canceledОтменена
deletedУдалена из канала
errorОшибка при публикации

Вебхуки

При определённых событиях Rekla отправляет POST-запрос на ваш webhook_url.

Событие api_key.created

Отправляется когда пользователь создаёт API-ключ через команду /start createapikey-<partner>. Тело запроса:
{
  "user_id": 753967249,
  "raw_api_key": "rekla_api:fb27e09cd41f8a2e3dd93a..."
}
Заголовки:
ЗаголовокОписание
X-Webhook-EventТип события (api_key.created)
X-Webhook-IdУникальный UUID события
X-Webhook-TimestampUNIX timestamp отправки
X-Webhook-SignatureПодпись HMAC SHA256

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

import hmac, hashlib

def verify_webhook(body: bytes, timestamp: str, signature: str, secret: str) -> bool:
    expected = hmac.new(
        key=secret.encode(),
        msg=f"{timestamp}.{body.decode()}".encode(),
        digestmod=hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, expected)

Контакты

Поддержка интеграций: @rekla_support Версия API: 1.0.0 | Формат: application/json
Используя API, вы принимаете условия оферты.