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

Базовый адрес: https://viewks.com/api/v1. API доступен при действующем тарифе Премиум. Передавайте ключ в Authorization: Bearer <ключ> или X-Api-Key. Cookie не используются для авторизации.

Ограничения на ключ: 120 запросов в минуту и 10 созданий заказов в секунду. При превышении ответ 429 содержит Retry-After в секундах. Лимиты действуют в памяти каждого экземпляра сервера.

Заказ: от 100 до 100000 просмотров. Скорости: slow — 30, normal — 10, fast — 5, very_fast — 2, max — 0 секунд. Вместо speed можно указать interval_sec от 0 до 3600, не меньше интервала максимальной скорости тарифа. По умолчанию используется максимальная скорость тарифа. external_id (до 64 символов) уникален для пользователя: повтор вернёт прежний заказ с кодом 200.

Список заказов: необязательные параметры status, kind, page, limit (до 100), since (ISO 8601). Отмена завершённого заказа возвращает 409.

Страницы: link — ссылка VK, views_per_post — 50…100000, auto_views — логическое значение. В PATCH указывайте только изменяемые поля.

POST /orders/:id/pause, /resume и /turbo управляют заказом; turbo: true при создании включает турбо и интервал 0. Турбо доступно один раз на Премиуме от 155 заданий. Пауза занимает слот; через 7 дней заказ отменяется. GET /blacklist возвращает правила, POST /blacklist принимает kind (POST_URL или KEYWORD) и value, DELETE /blacklist/:id удаляет правило. Лимит — 100 правил.

GET /me

curl -H 'Authorization: Bearer KEY' https://viewks.com/api/v1/me
{"ok":true,"data":{"tier":"premium","tasks_limit":10,"active_tasks":0,"daily_limit":null,"daily_remaining":null,"ends_at":"2027-01-01T00:00:00.000Z"}}

POST /orders

curl -X POST https://viewks.com/api/v1/orders -H 'Authorization: Bearer KEY' -H 'Content-Type: application/json' -d '{"url":"https://vk.com/wall1_2","quantity":100,"speed":"normal","external_id":"job-1"}'
{"ok":true,"data":{"id":"ORDER_ID","url":"https://vk.com/wall1_2","kind":"post","quantity":100,"delivered":0,"status":"running","source":"manual","page_id":null,"external_id":"job-1","created_at":"2026-01-01T00:00:00.000Z","updated_at":"2026-01-01T00:00:00.000Z","error":null}}

GET /orders

curl -H 'Authorization: Bearer KEY' 'https://viewks.com/api/v1/orders?status=running&limit=20'
{"ok":true,"data":[]}

GET /orders/:id

curl -H 'Authorization: Bearer KEY' https://viewks.com/api/v1/orders/ORDER_ID
{"ok":true,"data":{"id":"ORDER_ID","status":"running"}}

POST /orders/:id/cancel

curl -X POST -H 'Authorization: Bearer KEY' https://viewks.com/api/v1/orders/ORDER_ID/cancel
{"ok":true,"data":{"id":"ORDER_ID","status":"canceled"}}

GET /pages

curl -H 'Authorization: Bearer KEY' https://viewks.com/api/v1/pages
{"ok":true,"data":[]}

POST /pages

curl -X POST https://viewks.com/api/v1/pages -H 'Authorization: Bearer KEY' -H 'Content-Type: application/json' -d '{"link":"https://vk.com/example","views_per_post":1000,"auto_views":true}'
{"ok":true,"data":{"id":"PAGE_ID","autoViews":true,"viewsPerPost":1000}}

PATCH /pages/:id

curl -X PATCH https://viewks.com/api/v1/pages/PAGE_ID -H 'Authorization: Bearer KEY' -H 'Content-Type: application/json' -d '{"auto_views":false}'
{"ok":true,"data":{"id":"PAGE_ID","autoViews":false}}

DELETE /pages/:id

curl -X DELETE -H 'Authorization: Bearer KEY' https://viewks.com/api/v1/pages/PAGE_ID
{"ok":true,"data":{"deleted":true}}

Ошибки имеют вид {"ok":false,"error":{"code":"not_found","message":"Ресурс не найден."}}.

400validationНеверные параметры
401unauthorizedНеверный ключ
403plan_required, speed_not_allowed, forbiddenНет доступа
404not_foundРесурс не найден
409slots_full, daily_limit, order_finalЛимит или завершённый заказ
422invalid_targetНеверная ссылка
429rate_limitedПревышена частота
500internal_errorВнутренняя ошибка

Webhook

В кабинете задайте HTTPS-адрес и создайте секрет. При изменении статуса или числа просмотров отправляется order.updated; тестовое событие — ping. Заголовки X-ViewKs-Event и X-ViewKs-Signature содержат событие и sha256=HMAC-SHA256 от исходного тела. При ошибке повторы через 1 минуту, 5 минут, 30 минут и 2 часа; тайм-аут 5 секунд. Перенаправления не выполняются.

Проверяйте подпись по исходным байтам тела до разбора JSON и сравнивайте значения за постоянное время.

Node.js

const crypto = require('node:crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const a = Buffer.from(expected), b = Buffer.from(signature || '');
const valid = a.length === b.length && crypto.timingSafeEqual(a, b);

Python

import hashlib, hmac
expected = 'sha256=' + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
valid = hmac.compare_digest(expected, signature or '')