REST API · Votway

API SMM-панели: заказы и автоматизация

Создавайте заказы из своих скриптов и сервисов. Ключ — в кабинете: Настройки → API.

Авторизация

Передайте API-ключ в заголовке для каталога, баланса, транзакций и заказов.

X-API-Key: vw_your_key
Base URLhttps://votway.com/api/v1
Пример запроса
POST /api/v1/orders
{
  "service_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "link": "https://t.me/channel",
  "quantity": 1000
}

Платформы и услуги

Сначала платформы и категории, затем услуги. В заказ идёт id услуги (service_id). Смотрите order_type: default — ссылка и quantity; subscription — username и extra.min/max/posts либо пакет link+quantity; autoclick — канал или chat_id; traffic — ссылка, объём и extra с интервалом.

MethodPathAuthDescription
GET/catalog/platformsX-API-KeyПлатформы витрины (Telegram, VK, …). id платформы в заказ не передаётся
GET/catalog/categoriesX-API-KeyКатегории. Поле platform и id — фильтр GET /catalog/services?category_id=
GET/catalog/services?category_id=X-API-KeyУслуги: id, order_type, min/max, цена. Цены со скидкой владельца ключа
GET/catalog/services/{service_id}X-API-KeyОдна услуга — отсюда service_id для заказа
POST/catalog/calculateX-API-KeyПредрасчёт: { service_id, quantity } → amount, currency

Аккаунт

MethodPathAuthDescription
GET/profile/balanceX-API-KeyТекущий баланс (RUB)
GET/transactionsX-API-KeyИстория транзакций
GET/transactions/{transaction_id}X-API-KeyОдна транзакция

Заказы

Отмена — POST /cancel, если allow_user_cancel. Пауза и возобновление — /stop и /start при can_stop / can_start. Правки автоклика и трафика — PATCH при can_edit. Статус поллите GET, webhook нет. refill пока 501.

MethodPathAuthDescription
POST/ordersX-API-KeyСоздать заказ: service_id, link/quantity или extra по order_type услуги
GET/ordersX-API-KeyСписок (limit≤300, offset, search, platform, status_group, order_type)
GET/orders/{order_id}X-API-KeyСтатус, прогресс, флаги can_stop/can_start/can_edit, дочерние задачи
POST/orders/{order_id}/cancelX-API-KeyОтмена, если allow_user_cancel. Ответ: заказ, refund_amount, balance
POST/orders/{order_id}/stopX-API-KeyПауза автоклика, трафика или автопостинга, если can_stop
POST/orders/{order_id}/startX-API-KeyВозобновление, если can_start
PATCH/orders/{order_id}X-API-KeyПравки автоклика/трафика, если can_edit: клики, интервал, geo, source

Автоклик: каналы

Для закрытого Telegram: добавьте бота администратором, получите connect-code и опубликуйте код постом в самом канале → channels (chat_id) → POST /orders с chat_id. Для открытого канала укажите @username и используйте check-channel. Для MAX: connect-link → channels → заказ с platform=max и chat_id.

MethodPathAuthDescription
POST/orders/autoclick/check-channelX-API-KeyПроверка канала: service_id + channel или chat_id
POST/orders/autoclick/telegram/connect-codeX-API-KeyПостоянный персональный код для публикации постом в закрытом Telegram-канале
POST/orders/autoclick/telegram/channelsX-API-KeyПодключённые Telegram-каналы (опц. refresh, chat_id)
POST/orders/autoclick/max/connect-linkX-API-KeyПерсональная ссылка подключения MAX
POST/orders/autoclick/max/channelsX-API-KeyПодключённые MAX-каналы (опц. refresh, chat_id)

Telegram · MAX

API автопостинга

Подключайте Telegram и MAX из своего сервиса: привязывайте аккаунты, проверяйте каналы, оформляйте подписки и управляйте публикациями.

Открыть методы автопостинга в Swagger

Ваши клиенты — client_ref

Задайте постоянный идентификатор клиента, например customer_42: от 1 до 64 латинских букв, цифр, дефисов или подчёркиваний. Привязки, каналы и заказы разделяются по client_ref внутри вашего аккаунта. Создайте клиента через PUT перед подключением аккаунта.

Значение self зарезервировано для ваших собственных ресурсов, включая кабинет. Ключи одного владельца работают с теми же клиентами в пределах своих прав. Замена ключа не требует повторного создания клиентов.

Ключ и единый баланс

Получите персональный ключ в кабинете: Настройки → API. Передавайте X-API-Key с вашего сервера. Не передавайте заголовок Authorization вместе с ним и не размещайте ключ в браузере клиентов. Все заказы оплачиваются с баланса владельца ключа в рублях.

Права ключа: catalog:read — каталог и возможности; autopost:read — чтение; autopost:write — изменения. Создание, продление и отмена заказа дополнительно требуют orders:write. Для GET /profile/balance нужно balance:read.

От подключения до первой публикации

  1. Выберите услугу

    Получите service_id услуги автопостинга в каталоге. Запросите GET /autopost/capabilities?service_id=…: здесь режимы публикации, доступные AI-модели и ограничения.

  2. Создайте клиента

    PUT /autopost/clients/customer_42 с именем клиента или пустым объектом создаёт контекст. Повторный PUT обновляет его.

  3. Подтвердите привязку в боте

    POST link-sessions возвращает deep_link. Передайте ссылку клиенту и опрашивайте GET link-sessions по полученному id до status=linked. При expired создайте новую сессию. Для MAX укажите platform=max.

  4. Проверьте канал и выберите источники

    После выдачи боту необходимых прав вызовите channels/check. Нужны permissions=ready и can_order=true. Сохраните UUID id ответа как channel_id. Получите источники через GET sources с service_id или задайте собственные HTTPS-ссылки.

  5. Оформите заказ

    Передайте service_id, channel_id, external_order_id, months и settings. Укажите расписание или таймер. max_amount ограничивает сумму списания; 1500.00 в примере — условный предел, а не тариф.

  6. Дождитесь результата

    202 означает, что команда принята. Опрашивайте URL из Location с интервалом Retry-After до succeeded или failed. По subscription_id успешной операции получите подписку, настройки и очередь. При failed прочитайте error.

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

Пути указаны относительно домена API. Замените ключ, UUID, ссылки, идентификаторы и предел суммы своими значениями. UUID ниже приведены только для примера. Один Idempotency-Key соответствует одной команде.

1. Создать клиента и привязать аккаунт

После POST откройте deep_link из ответа в нужном мессенджере. В GET подставьте id сессии. Привязка требует подтверждения пользователя в боте.

PUT /api/v1/autopost/clients/customer_42
X-API-Key: vw_your_key
Content-Type: application/json

{
  "name": "Customer 42"
}

POST /api/v1/autopost/clients/customer_42/link-sessions
X-API-Key: vw_your_key
Idempotency-Key: link-customer42-001
Content-Type: application/json

{
  "service_id": "11111111-1111-4111-8111-111111111111",
  "platform": "telegram"
}

GET /api/v1/autopost/clients/customer_42/link-sessions/{id}
X-API-Key: vw_your_key
2. Подключить канал и получить источники

UUID канала из проверки нужен для channel_id. UUID источников из каталога нужны для source_ids. chat_id мессенджера нельзя подставлять вместо этих UUID.

POST /api/v1/autopost/clients/customer_42/channels/check
X-API-Key: vw_your_key
Idempotency-Key: check-customer42-001
Content-Type: application/json

{
  "service_id": "11111111-1111-4111-8111-111111111111",
  "platform": "telegram",
  "target": "https://t.me/your_channel"
}

GET /api/v1/autopost/clients/customer_42/sources?service_id=11111111-1111-4111-8111-111111111111&kind=catalog
X-API-Key: vw_your_key
3. Оформить подписку с расписанием

Пример: новые и старые публикации, по понедельникам в 09:00 и в диапазоне 17:00–19:00 по Москве. Для остальных дней добавьте слоты в days.

POST /api/v1/autopost/clients/customer_42/orders
X-API-Key: vw_your_key
Idempotency-Key: order-customer42-001
Content-Type: application/json

{
  "service_id": "11111111-1111-4111-8111-111111111111",
  "channel_id": "22222222-2222-4222-8222-222222222222",
  "external_order_id": "order-2026-001",
  "months": 1,
  "max_amount": "1500.00",
  "settings": {
    "source_selection": {
      "type": "catalog",
      "source_ids": [
        "33333333-3333-4333-8333-333333333333"
      ]
    },
    "queue_mode": "new_and_old",
    "publication": {
      "mode": "schedule",
      "timezone": "Europe/Moscow",
      "days": {
        "1": [
          {
            "at": "09:00"
          },
          {
            "from": "17:00",
            "to": "19:00"
          }
        ]
      }
    }
  }
}
4. Проверить операцию, заказ и очередь

Первые строки показывают заголовки ответа, следующие — запросы. Дождитесь конечного статуса операции, затем используйте её order_id и subscription_id. pending и reconciling означают, что команда ещё выполняется.

HTTP/1.1 202 Accepted
Location: /api/v1/autopost/clients/customer_42/operations/{id}
Retry-After: 2

GET /api/v1/autopost/clients/customer_42/operations/{id}
X-API-Key: vw_your_key

GET /api/v1/autopost/clients/customer_42/orders/{order_id}
X-API-Key: vw_your_key

GET /api/v1/autopost/clients/customer_42/subscriptions/{subscription_id}/queue
X-API-Key: vw_your_key
5. Переключить подписку на таймер

Сначала прочитайте подписку. Передайте её ETag в If-Match вместе с кавычками; 1 здесь только пример. PATCH возвращает 202: дождитесь завершения операции и проверьте applied_settings_revision.

GET /api/v1/autopost/clients/customer_42/subscriptions/{id}
X-API-Key: vw_your_key

HTTP/1.1 200 OK
ETag: "1"

PATCH /api/v1/autopost/clients/customer_42/subscriptions/{id}/settings
X-API-Key: vw_your_key
If-Match: "1"
Content-Type: application/json

{
  "publication": {
    "mode": "ad_timer",
    "interval_min": 30,
    "interval_max": 60
  }
}
Свои источники и подписи публикаций

Это объект settings для создания заказа или тело PATCH настроек. Для новых источников передавайте source_selection вместе с source_signature_settings. Ключ настройки подписи — ссылка своего источника или UUID источника каталога. В этом примере очередь собирает только новые публикации.

{
  "source_selection": {
    "type": "custom",
    "urls": [
      "https://t.me/your_source"
    ]
  },
  "queue_mode": "new",
  "publication": {
    "mode": "ad_timer",
    "interval_min": 30,
    "interval_max": 60
  },
  "signature_settings": {
    "mode": "append",
    "text": "Наш канал",
    "url": "https://t.me/your_channel"
  },
  "source_signature_settings": {
    "https://t.me/your_source": {
      "mode": "replace",
      "url": "https://t.me/your_channel"
    }
  }
}

Правила интеграции

Повторы запросов
Все POST требуют Idempotency-Key: 1–128 латинских букв, цифр или символов . _ : -. После тайм-аута повторите прежний URL с тем же ключом и телом. Другое тело с тем же ключом даёт 409 idempotency_conflict. Для новой команды создайте новый ключ. PUT и DELETE этого заголовка не требуют.
Ваш номер заказа и предел оплаты
external_order_id обязателен для заказа и каждого продления: 1–128 латинских букв, цифр или символов . _ : -. Он уникален для client_ref. Повтор с теми же параметрами вернёт прежнюю операцию; другие параметры дадут external_order_conflict. max_amount задаётся строкой с двумя знаками после точки; если цена выше, запрос отклоняется с price_changed.
Изменение настроек
PATCH требует If-Match из GET подписки. Без него — 428, при устаревшей версии — 412. Перечитайте настройки и согласуйте изменения. Передавайте изменяемый раздел целиком; пропущенные разделы сохраняются. null не допускается. Ориентируйтесь также на actions в подписке.
Источники и ИИ
Выбирайте один тип source_selection: catalog с source_ids или custom с urls. Для своих источников поддерживаются HTTPS-ссылки t.me, telegram.me и max.ru. Промпты, модели и индивидуальные настройки ИИ изменяет администратор. При создании заказа и PATCH не передавайте ai_settings или source_settings, даже пустые: запрос будет отклонён. ИИ тарифа работает с сохранёнными настройками.
Подпись со ссылкой
signature_settings.mode: off — выключено, remove — удалить найденную подпись, replace — заменить только найденную, append — добавлять свою всегда. text задаёт кликабельный текст (по умолчанию название канала), url — адрес или приглашение (для приватного канала обязателен). Ищем отдельную короткую строку в конце со ссылкой на Telegram/MAX-канал. source_signature_settings задаёт полное переопределение для источника; mode: off отключает общий режим. Правила действуют на ещё не отправленные посты и не обходят остальные рекламные фильтры.
Расписание и таймер
В schedule обязательны timezone и days. Дни недели: 1 — понедельник, 7 — воскресенье. Слот — at либо диапазон from/to в формате HH:MM; даты в dates — YYYY-MM-DD. Для ad_timer интервалы задаются в минутах, по умолчанию 30–60. queue_mode по умолчанию new_and_old; new — только новые публикации.
Подписка и очередь
Список подписок по умолчанию показывает active и paused; status=all включает остальные. publish-next отправляет следующий пост очереди. При delivery_unknown доставка отдельного поста не подтверждена: он не отправляется повторно и не блокирует следующие публикации. Для диагностики пустой очереди используйте summary и empty_reason. При отмене проверяйте can_cancel, возврат — в refunded_amount заказа.
Списки и статусы
Списки возвращают data и next_cursor. Передавайте курсор без изменений с теми же фильтрами, пока он не станет null. limit — от 1 до 100, по умолчанию 50. Webhooks пока нет: проверяйте статусы запросами GET.
Ошибки автопостинга
Ответ содержит error: code, message, request_id, retryable и fields. 401 — ключ, 403 — недостаточно прав, 402 — баланс, 404 — ресурс недоступен в данном контексте, 409 — конфликт, 422 — поля запроса. При 429 соблюдайте Retry-After; при 503 повторите с задержкой и тем же ключом. Для поддержки сохраните X-Request-ID.
Лимиты запросов
Лимиты учитываются по ключу и общему аккаунту владельца. Создание ссылок привязки и проверка каналов имеют отдельные ограничения. Несколько ключей не увеличивают общий лимит; при ограничении API вернёт 429.
Все 25 операций автопостинга

Добавьте /api/v1 перед путями ниже. Точные параметры, обязательные поля, права ключа и схемы ответов приведены в Swagger. Для capabilities, accounts, channels и sources нужен service_id; для DELETE аккаунта и канала — также service_id в query.

  • GET
    /autopost/capabilities

    Режимы, платформы, AI-модели и ограничения услуги

  • GET
    /autopost/clients

    Клиенты интеграции

  • PUT
    /autopost/clients/{client_ref}

    Создать клиента или обновить имя

  • GET
    /autopost/clients/{client_ref}

    Получить клиента

  • POST
    /autopost/clients/{client_ref}/link-sessions

    Создать сессию привязки

  • GET
    /autopost/clients/{client_ref}/link-sessions/{id}

    Проверить подтверждение привязки

  • GET
    /autopost/clients/{client_ref}/accounts

    Привязанные аккаунты

  • DELETE
    /autopost/clients/{client_ref}/accounts/{id}

    Отвязать аккаунт

  • GET
    /autopost/clients/{client_ref}/channels

    Каналы и их доступность для заказа

  • POST
    /autopost/clients/{client_ref}/channels/check

    Подключить канал и проверить права

  • DELETE
    /autopost/clients/{client_ref}/channels/{id}

    Отключить свободный канал

  • GET
    /autopost/clients/{client_ref}/sources

    Каталог и пользовательские источники

  • POST
    /autopost/clients/{client_ref}/orders

    Создать заказ; результат — операция

  • GET
    /autopost/clients/{client_ref}/orders

    Заказы, в том числе поиск по external_order_id

  • GET
    /autopost/clients/{client_ref}/orders/{id}

    Статус, сумма и подписка заказа

  • POST
    /autopost/clients/{client_ref}/orders/{id}/cancel

    Отменить заказ при can_cancel

  • GET
    /autopost/clients/{client_ref}/subscriptions

    Подписки; по умолчанию активные и на паузе

  • GET
    /autopost/clients/{client_ref}/subscriptions/{id}

    Состояние, настройки, ETag и доступные действия

  • PATCH
    /autopost/clients/{client_ref}/subscriptions/{id}/settings

    Изменить настройки с If-Match

  • POST
    /autopost/clients/{client_ref}/subscriptions/{id}/pause

    Приостановить публикации

  • POST
    /autopost/clients/{client_ref}/subscriptions/{id}/resume

    Возобновить публикации

  • POST
    /autopost/clients/{client_ref}/subscriptions/{id}/publish-next

    Отправить следующий пост очереди

  • POST
    /autopost/clients/{client_ref}/subscriptions/{id}/renewals

    Продлить подписку

  • GET
    /autopost/clients/{client_ref}/subscriptions/{id}/queue

    Публикации и диагностика очереди

  • GET
    /autopost/clients/{client_ref}/operations/{id}

    Проверить выполнение команды

В этом выпуске доступны выбор источников, настройка расписания, таймера и подписей публикаций. Промпты ИИ редактируются только администратором. Отдельное управление источниками, API шаблонов расписания и webhooks пока не входят в контракт.

Swagger

Интерактивная документация: все методы, поля запросов и ответов, примеры тел. Можно сразу выполнить запрос со своим ключом.

Ошибки и лимиты

Для каталога и общих методов заказов ошибки содержат detail. В API автопостинга используется объект error — формат описан выше. 401 — нет или неверный ключ. 429 — подождите и повторите. POST /orders/{id}/refill возвращает 501. Пополнение баланса по ключу недоступно.