Viewer Configurator API
REST · JSONTwitchKickYouTubeVK Video Live
Viewers with your settings — straight from your code
Everything the Viewer Panel can do: join speed, geo, authorized viewers, floating online, raids, one subscription for several channels. Orders stay under your control: pause, stop, change channel, renew.
https://stream-promotion.ru/configurator/api/Authorization: YOUR_KEYJSON, UTF-8from API settingsUSD by defaultWhich API do you need
key and action parameters. Made for reselling in an SMM panel.Open the docs → Authorization header.Quick start
- Set a keyin your account, “API settings”: Latin letters and digits only.
- Check the keywith
GET /user/info— it returns your balance. - Get the pricewith
POST /helper/calculator. Nothing is charged. - Create an orderwith
POST /orderand store theuuidfrom the response.
curl https://stream-promotion.ru/configurator/api/user/info \ -H "Authorization: YOUR_KEY"
<?php
$ch = curl_init('https://stream-promotion.ru/configurator/api/user/info');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: YOUR_KEY'],
]);
$res = json_decode(curl_exec($ch), true);
print_r($res); import requests
res = requests.get(
"https://stream-promotion.ru/configurator/api/user/info",
headers={"Authorization": "YOUR_KEY"},
timeout=30,
)
print(res.status_code, res.json()) const res = await fetch(
"https://stream-promotion.ru/configurator/api/user/info",
{ headers: { Authorization: "YOUR_KEY" } }
);
console.log(res.status, await res.json()); Response 200
{"balance": 176.0, "currency": "USD", "language": "en-gb"} balance is what you can spend on orders: money on the account plus bonus points, in the currency from your API settings.
Request builder
Fill in the fields and a ready-to-run request appears below. Check the price first, then place the order. This page sends nothing anywhere.
curl -X POST https://stream-promotion.ru/configurator/api/helper/calculator \
-H "Authorization: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"type":"twitch.viewers","total_time":"02:00:00","channels":[{"channel":"mychannel","viewers":{"maximum":50,"interval":1}}]}' curl -X POST https://stream-promotion.ru/configurator/api/order \
-H "Authorization: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"type":"twitch.viewers","total_time":"02:00:00","channels":[{"channel":"mychannel","viewers":{"maximum":50,"interval":1}}]}' The list only offers durations the API accepts without rounding. Add authorized viewers, views, raids and geo using the settings table.
Authorization
Pass the key in the Authorization header as is: no Bearer, no account number, no colon.
Authorization: k7Hq2mXv9PaL
- Keep the key on your server. Never put it into page code, a browser extension or a mobile app.
- Once you change the key in settings, the old one stops working immediately.
- No header — response 400. Wrong key or disabled account — 403.
All methods
Paths are relative to https://stream-promotion.ru/configurator/api. Only two methods charge money — they are marked.
| Method | What it does |
|---|---|
| GET/user/info | Balance, currency, language |
| GET/helper/type | Platforms |
| GET/helper/geo | Viewer countries and regions |
| GET/helper/kick/quality | Kick viewer quality |
| GET/helper/platforms | View devices, Twitch |
| GET/helper/referrers | View sources, Twitch |
| POST/helper/calculator | Order price, no charge |
| POST/ordercharges | Create an order |
| POST/orders | List orders |
| GET/order/{uuid} | Order details |
| PATCH/order/{uuid} | Edit, pause, stop |
| PUT/order/{uuid}/renewcharges | Renew an order |
Balance: GET /user/info
See the response in “Quick start”. Handy for checking the key and the balance before an order.
Reference lists: GET /helper/…
The values rarely change — cache them on your side for a day.
| Path | Returns |
|---|---|
/helper/type | twitch, kick, youtube, vk — the order type is built from them: twitch.viewers and so on. |
/helper/geo | A list of {id, label}, most popular first: Russia, SNG, SNG PRO, EuMix… 0 is Mix, mixed geo. |
/helper/kick/quality | 0 MQ, 1 HQ (+66 % to price), 2 UHQ (+133 %) |
/helper/platforms | 1 Web, 2 iOS, 3 Android, 4 Mobile Web, 5 Xbox, 6 PlayStation, 7 Curse |
/helper/referrers | 1 Following, 2 notification on site, 3 recommendations, 4 home page recommendations, 5 direct, 6 search, 7 directory, 8 telegram.org, 9 discord.com, 10 google.com, 11 twitch.tv — with it, pass value: the channel name |
Price: POST /helper/calculator
Same body as creating an order. Nothing is charged, no order is created. Response: total_amount — to pay, total_base — base price without discounts and markups.
curl -X POST https://stream-promotion.ru/configurator/api/helper/calculator \
-H "Authorization: YOUR_KEY" -H "Content-Type: application/json" \
-d '{"type":"twitch.viewers","total_time":"02:00:00",
"channels":[{"channel":"mychannel","viewers":{"maximum":50,"interval":1}}]}' Response 200
{"total_amount": "19.91", "total_base": "19.91", "currency": "RUB"} Create an order: POST /order
Charges the price to your balance. Minimum order amount is 0.10 in the account currency.
| Field | Description |
|---|---|
typerequired | twitch.viewers, kick.viewers, youtube.viewers or vk.viewers |
channelsrequired | Array of channels. Without a subscription only the first one counts. |
channels[].channelrequired | Channel name or link. For YouTube, a channel or a live stream link works. |
channels[].viewers.maximumrequired | Number of viewers. YouTube — up to 200 per order. |
channels[].viewers.intervalrequired | Pause between viewers joining, seconds: 0.1–300 |
total_timerequired | Duration D.HH:MM:SS. Allowed values are below. |
is_subscribeoptional | true — a subscription for several channels |
couponoptional | Promo code. An invalid code is ignored and the order is priced without it. |
max_total_amountoptional | Price limit. If the order costs more, you get 409 and nothing is charged. |
Example: Twitch with authorized viewers, views and raids
{
"type": "twitch.viewers",
"total_time": "1.00:00:00",
"viewers": {"auth_percent": 30, "is_collect_points": true,
"spread_percent": 20, "spread_delay": 300},
"views": {"views_per_viewers": 5, "retention": 300, "geo": 7},
"raid": {"count": 2, "time": 600, "viewers_percent": 50},
"is_casino": false,
"channels": [{"channel": "mychannel", "viewers": {"maximum": 100, "interval": 2}}],
"max_total_amount": 30
} Response 200
{"order_id": 7712345, "uuid": "3f8c1a2e-5b7d-4c1e-9a0b-2d4e6f8a1c3e"} order_id is the order number on the website, uuid is the ID for all other methods.
- If no response came back (connection drop, timeout, 500), do not retry blindly. First check the order list for the last few minutes.
Settings by platform
The viewers, views and raid blocks are set at the order level, next to type.
| Field | Twitch | Kick | YouTube | VK |
|---|---|---|---|---|
viewers.auth_percentauthorized viewers, % | 1–100 | — | — | 1–100 |
viewers.is_collect_pointscollect channel points | yes, with authorization | — | — | — |
viewers.spread_percentfloating viewers, % | 1–50 | — | — | — |
viewers.spread_delayspread pause, sec — required with spread_percent | 120–900 | — | — | — |
views.views_per_viewersviews per hour per viewer | 1–50 | 1–10 | — | — |
views.retentionretention, sec | 60–900, required with views | — | — | — |
views.unique_viewers_percentunique viewers, % | 1–100 | — | — | — |
views.geoid from /helper/geo | yes | yes | — | — |
views.platforms, views.referrers[{id, min, max}], % of views | yes | — | — | — |
raid.countnumber of raids | 1–10000 | — | — | — |
raid.timeraid duration, sec | 60–43200 | — | — | — |
raid.viewers_percentshare of viewers in a raid, % | 1–100 | — | — | — |
is_casinoindividual viewers | +45 % to price | — | — | — |
quality0 MQ, 1 HQ, 2 UHQ | — | yes | — | — |
A field the platform does not support is ignored. Geo is set in the views block. Views are on when views_per_viewers is above zero, raids — when raid.count is above zero. All pauses and durations are in seconds.
Duration: total_time
Format D.HH:MM:SS. An order is counted in one unit — minutes, hours, days, weeks or months. A month is 28 days.
00:15:0002:00:003.00:00:0014.00:00:0028.00:00:00- The largest unit is taken and the rest is lost:
02:30:00is 2 hours,1.12:00:00is 1 day,10.00:00:00is 1 week,30.00:00:00is 1 month. - Values out of range return an error: you cannot order 6 days, 13 hours or 5 minutes.
- Check the price in the calculator before ordering: it shows which duration you actually get.
Subscription: is_subscribe
One order for several channels at once — up to 100. Each channel has its own maximum and interval. Duration — days, weeks or months only. +25 % to price. The channel list of a subscription can be changed without limits.
{"type": "kick.viewers", "quality": 1, "is_subscribe": true, "total_time": "7.00:00:00",
"channels": [
{"channel": "main_channel", "viewers": {"maximum": 80, "interval": 1}},
{"channel": "second_channel", "viewers": {"maximum": 40, "interval": 1}}
]} Order list: POST /orders
All fields are optional. Without a date filter you get orders for the last 3 months.
| Field | Description |
|---|---|
filter.type | twitch, kick, youtube, vk |
filter.status | on — running, off — finished, all — all |
filter.order_id | Website order numbers, an array of numbers: [7712345] |
filter.is_freez, filter.is_stop, filter.is_subscribe | true / false |
filter.date_from, filter.date_to | 2026-10-01. The window is 93 days at most. |
limit | 1–50, 20 by default |
order | desc — newest first (default) or asc |
last_id | Next page cursor — take it from the previous response |
{"filter": {"type": "twitch", "status": "on"}, "limit": 20} Response 200
{
"items": [{
"uuid": "3f8c1a2e-…", "order_id": 7712345, "type": "twitch.viewers",
"viewers": {"count": 100, "interval": 2}, "channels": ["mychannel"],
"total_time": "1.00:00:00", "free_time": "0.17:42:10",
"is_subscribe": false, "is_stop": false, "is_freez": false,
"status": "on", "actions": ["edit", "stop", "pause", "renew"],
"added_at": "2026-10-11T12:05:40+03:00"
}],
"last_id": "Mjk4OTA0", "has_next": true
} Order details: GET /order/{uuid}
Same fields as in the list plus every setting of each channel: channels[].viewers, views, raid, priority. Time: total_time — purchased, free_time — left. Someone else's or unknown uuid — response 404.
Edit an order: PATCH /order/{uuid}
Send only what you change. Response: {"updated": true}.
{"is_freez": true} {"is_stop": true} {"channels": [{"channel": "new_channel"}]} {"channels": [{"channel": "mychannel",
"viewers": {"maximum": 60, "interval": 3, "spread_percent": 10, "spread_delay": 240}}]} - Resume after a pause —
{"is_freez": false}, start after a stop —{"is_stop": false}. maximumcan be lowered and raised within what you bought (your plan) — without restarting the order.- One order can be changed at most once every 10 seconds, otherwise 429.
- A finished order (
status: off) cannot be changed — it can only be renewed.
Renew: PUT /order/{uuid}/renew
Renews for the same period with the same settings and charges the price. If this order cannot be renewed, a new one is created: the response has "is_new": true and a new uuid.
{"uuid": "9a0b2d4e-…", "order_id": 7712399, "is_new": true} Statuses and limits
status: onViewers are on the channel, time is running.is_freez: trueViewers leave, order time is frozen. Limited.is_stop: trueViewers leave, order time keeps running.status: offTime is over. Only renewal is available.What you can do with an order right now is listed in the actions array: edit, pause/play, stop/start, renew.
| Order duration | Pause, total | Channel changes |
|---|---|---|
| up to 1 day | unlimited | 1 |
| 1–3 days | up to 12 hours | 2 |
| 3–7 days | up to 24 hours | 2, a week — 3 |
| over a week | up to 72 hours | 3, 2 months — 5 |
Channel changes are counted without a subscription and allowed once a day at most. In a subscription the channel list changes freely.
Errors
Unlike the shop API, the HTTP code matters here. Error body: {"code": "…", "message": "…"}. message holds a text in the language from your API settings or a code like error_order_type.
| HTTP | When |
|---|---|
| 400 | No header, wrong field, value out of range, not enough money |
| 403 | Wrong key or disabled account |
| 404 | Order not found or not yours; with body [] — unknown address |
| 405 | Wrong method: e.g. POST instead of GET |
| 409 | Price is above max_total_amount, nothing charged |
| 429 | The order was changed less than 10 seconds ago |
| 500 | Failure on our side. Check the order list before retrying |
| 503 | Maintenance, retry later (Retry-After header) |
| message | What to fix |
|---|---|
error_action | Unknown path. Check the URL: /configurator/api/… |
error_incorrect_request | The body is not JSON. Send Content-Type: application/json |
error_order_type | type is not in the list: twitch.viewers, kick.viewers… |
| “The channel does not match the service type” | The link points to another platform |
| “Validity period must be greater / less than N” | total_time out of range, see duration |
“Insufficient funds on balance” (error_user_credit) | Top up your balance |
error_param_*_min / _max | Field value out of range from the settings table |
error_order_allowed_action | The action is not in the order's actions |
error_order_channels_change_* | No channel changes left or a day has not passed yet |
| “Freezing timer limit reached” | Pause time is used up |
error_filter_* | Wrong list filter: date, limit, order number |
FAQ
Do I need a separate key for the configurator?
No. It is the same key as for the shop API, from “API settings”. The endpoint and the way to pass it differ: here it is the Authorization header, in the shop API — the key parameter.
The key is correct, but I get 403 “Invalid Authorization header”
Pass the key without Bearer, account number or spaces. Make sure the key is saved in settings and has not been changed since. A 400 response means the header never arrived: some proxies and hosting providers strip Authorization.
Is there a test mode?
There is no sandbox. /user/info, the reference lists and /helper/calculator are safe to try: they charge nothing. Only POST /order and PUT /renew charge money.
A reference list returned 404 with an empty list
The reference lists work. 404 with [] means the address was not recognised: check the full path, e.g. /configurator/api/helper/platforms, and the GET method. Still failing — send support the address, request body and server response.
Which currency are prices in, and which language are errors in?
Both come from “API settings”. If no currency is selected — USD.
Which platforms are supported? What about Trovo?
The configurator API covers Twitch, Kick, YouTube and VK Video Live. Viewers for other platforms, Trovo included, are catalog services ordered through the shop API.
Why did a 10-day order turn into one week?
Duration is counted in one unit and the remainder is dropped: 10 days is 1 week. Allowed: 1–5 days, 1–2 weeks, 1–2 months of 28 days. See the duration table.
What is interval?
The pause between viewers joining, in seconds. interval: 1 means 60 viewers a minute; with 100 viewers and interval: 2 everyone joins in about 3 minutes 20 seconds. The longer the pause, the more natural the online growth.
What do floating viewers and the spread pause do?
spread_percent is the share of viewers who leave and come back, so the online count is not a flat line. spread_delay is the pause between such swings, 120–900 seconds. Order creation used to take minutes (2–15) here — such values still work: anything below 60 is read as minutes. If you set spread_percent, pass spread_delay too.
What is retention and how many views to set?
views.retention — how many seconds a viewer watches before leaving and joining again. views.views_per_viewers — views per hour from one viewer. We advise no more than 5–10: higher growth looks unnatural.
Why authorized viewers?
Authorized viewers are logged into Twitch or VK accounts: they show up in the chat viewer list, and on Twitch they can collect channel points (is_collect_points). For now points only accumulate; spending them is planned. Unauthorized viewers count towards online but are not in the chat list.
What is is_casino?
“Individual viewers” for channels in casino and crypto categories, and for channels that drop out of categories and recommendations when boosted (shadow ban). Different servers and different geo. +45 % to price.
How do raids work?
raid.count — raids per order (set at purchase, up to 10,000), raid.time — how many seconds viewers stay on the other channel after the raid, raid.viewers_percent — the share of viewers that go on the raid. A raid starts by itself when the streamer runs the raid command in chat. Raids are paid: the first one raises the price noticeably, each next one costs less. A raid does not extend the order: when order time runs out, viewers leave, even mid-raid. Turn off subscriber-only chat during the stream: with it on, a raid may fail.
How much does geo cost?
Choosing a country does not change the price. The price depends on views, retention, authorization, floating viewers, raids, is_casino, Kick quality and subscription. The calculator shows the total.
What is the difference between MQ, HQ and UHQ on Kick?
The quality of viewer accounts. HQ costs 66 % more than MQ, UHQ — 133 % more.
Viewers did not arrive — what should I check?
Viewers join only a live stream. Make sure the stream is online, the order is not paused or stopped (is_freez, is_stop), free_time is above zero and the channel is correct. If all is fine, contact support and send the uuid.
Can I get viewers on a recording?
No, the configurator works with live streams. VOD and clip views are separate catalog services ordered through the shop API.
What is the difference between pause and stop?
On pause (is_freez) order time is frozen, but pause time is limited — see limits. On stop (is_stop) viewers leave and time keeps running. Need a break between streams, or bought in the morning for an evening stream — use pause (if actions contains pause).
How do I change the channel?
PATCH /order/{uuid} with a new channel. Without a subscription the number of changes is limited and allowed once a day at most; the remaining count is shown in the Viewer Panel. In a subscription channels change freely.
Can one order have several channels?
Without a subscription one channel works: only the first item of channels is used. In a subscription — up to 100 channels, each with its own maximum; viewers are split between the channels that are live right now.
Settings at order level or inside a channel?
For the quote and order creation the viewers, views and raid blocks are shared, at order level next to type. When editing (PATCH) they are set per channel — inside channels[], as in the example.
Can I lower or raise viewers in a running order?
Yes, within your plan and without a restart: change maximum via PATCH — down and back up to the purchased amount. More than you bought — only with a new order.
How do I renew without a gap?
Renew in advance: PUT /order/{uuid}/renew while free_time is above zero. A finished order cannot be renewed — a new one with the same settings is created: check is_new and store the new uuid. The API has no auto-renewal.
How do I find an order by its website number?
POST /orders with {"filter": {"order_id": [7712345]}}. The number is a number, not a string.
How often can I poll the status? Are there webhooks?
There are no webhooks — you poll for the state. No more than 3 requests per second; once a minute is enough for statuses. Poll the list via /orders rather than each order separately. One order can be changed at most once every 10 seconds.
What if the price changes between the quote and the order?
Prices are dynamic and can change. total_amount — what will be charged, total_base — base price without discounts and markups. To avoid overpaying pass max_total_amount: if the order turns out more expensive, you get 409 and nothing is charged. Minimum quantity and duration are visible in the Viewer Panel.
What if the balance is too low?
Response 400 with “Insufficient funds on balance” in message (error_user_credit). No order is created. Money and bonus points are counted together.
Do promo codes and bonus points work?
Promo code — in the coupon field. Bonus points are part of the balance and are spent together with money if the service accepts them.
Are API orders visible in the Viewer Panel?
Yes, it is the same list. Orders created in the Viewer Panel are available through the API as well.
No such question here yet. Message us — we will answer and add it to this page.
Send the request, the response and the order uuid — we will sort it out faster. Never send your key in a message.
스트리머를 위한 서비스
VK Video Live

Dlive

Shopee

Bigo
콘텐츠 크리에이터를 위한 서비스








