Skip to content

For resellers & agencies

The Kick viewers API

One base URL, one header, no OAuth and no bearer tokens. Your keys spend from the same account balance as the dashboard, at the same prices.

Base URL & authentication

Every endpoint lives under one base URL. Authenticate each request with your secret API key in the X-API-Key header — no OAuth, no bearer tokens, no sessions.

Base URL   https://buykickviewers.com/api/v1
Auth       X-API-Key: bckv_live_xxxxxxxxxxxxxxxxxxxxxxxx
Accept     application/json

Create and manage keys in the panel under Account → API keys. You can hold up to 5 active keys and revoke any of them at any time. The raw key is shown once at creation — store it somewhere safe. Keys spend from your normal account balance, at the same prices as the dashboard; there is no separate API wallet.

Quick start — check your balance

curl https://buykickviewers.com/api/v1/balance \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"

# → { "success": true, "balance": "150.75", "currency": "USD" }

Endpoints

MethodPathWhat it doesLimit
GET/balanceYour account balance.60/min
GET/ordersYour orders (panel and API together), newest first, 20 per page.30/min
GET/orders/{id}One order in full.60/min
POST/ordersPlace an order. Requires an Idempotency-Key header.30/min
POST/orders/{id}/cancelCancel an order that has not started yet.30/min
GET/key/infoThis key's caps, expiry and status.60/min
GET/key/usageThis key's spend totals and recent events.30/min

Paths are relative to the base URL above. Today the API sells live viewers and clip views; the other services are refused with a clear error until their delivery paths launch.

Endpoint reference — copy & paste

GET  /balance — your account balance

curl https://buykickviewers.com/api/v1/balance \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"
{
  "success": true,
  "balance": "150.75",
  "currency": "USD"
}

GET  /orders — list your orders

Everything your account has ever ordered — dashboard orders and API orders live in the same list. Add ?page=2 to page through. There is no total count: you have reached the last page when a response returns fewer than 20 orders (or an empty list). speed on an order is the delivery pace it was sold at — see speed_preset under POST /orders; it is null only on orders placed before delivery speed was available.

curl "https://buykickviewers.com/api/v1/orders?page=1" \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"
{
  "success": true,
  "page": 1,
  "per_page": 20,
  "orders": [
    {
      "id": "LV-1042",
      "order_id": 1042,
      "service": "live_viewers",
      "channel": "yourchannel",
            "quantity": 1000,
      "speed": { "preset": "normal", "min_s": 0.9, "max_s": 1.5 },
      "status": "Delivering",
      "status_code": "ACTIVE",
      "cost": "10.00",
      "created_at": "2026-09-15T18:24:07+00:00",
      "hours": 2
    }
  ]
}

GET  /orders/{id} — one order in full

Use the numeric order_id (1042 above, not LV-1042). You see the same live progress the dashboard shows.

curl https://buykickviewers.com/api/v1/orders/1042 \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"
{
  "success": true,
  "id": "LV-1042",
  "order_id": 1042,
  "service": "live_viewers",
  "channel": "yourchannel",
    "quantity": 1000,
  "speed": { "preset": "normal", "min_s": 0.9, "max_s": 1.5 },
  "status": "Delivering",
  "status_code": "ACTIVE",
  "cost": "10.00",
  "created_at": "2026-09-15T18:24:07+00:00",
  "hours": 2,
  "status_hint": "Delivery is running. Your paid time is counting down.",
  "cancel_allowed": false
}

POST  /orders — place an order

The heart of the API. The Idempotency-Key header is required: pick any unique string (up to 255 characters) per logical order. If your network drops mid-request, send the exact same request again with the same key and you get the same order back — never a double buy.

curl -X POST https://buykickviewers.com/api/v1/orders \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Idempotency-Key: order-2026-09-15-001" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
        "service": "live_viewers",
        "channel": "yourchannel",
        "quantity": 1000,
        "hours": 2
      }'
HTTP/1.1 201 Created
{
  "success": true,
  "replayed": false,
  "order": {
    "id": "LV-1043",
    "order_id": 1043,
    "service": "live_viewers",
    "channel": "yourchannel",
        "quantity": 1000,
    "speed": { "preset": "normal", "min_s": 0.9, "max_s": 1.5 },
    "status": "Queued",
    "status_code": "NEW_ORDER",
    "cost": "10.00",
    "created_at": "2026-09-15T18:31:22+00:00",
    "hours": 2,
    "status_hint": "Your order is in the queue. You can still cancel it for a full refund.",
    "cancel_allowed": true
  }
}

Retrying the same Idempotency-Key returns the same order with "replayed": true and HTTP 200 instead of 201 — bill nothing twice. Reusing a key with different parameters (service, channel, quantity, hours) is refused with 422: one key, one order.

  • service — live_viewers, clip_views today; other services answer with a clear error until they launch.
  • channel — the Kick channel: a bare username or a kick.com URL. For a service delivered to a clip it is read out of the clip link instead and may be omitted.
  • target — for clip_views: the full kick.com clip link (https://kick.com/streamer/clips/clip_…). The clip id is stored and echoed back as target, with target_url beside it; the channel is read from the link. A bare id, a VOD link or a non-kick.com link is refused with 422 and the reason. Not accepted for channel-targeted services.
  • quantity — how many units. For live viewers: minimum 10, maximum 5,000 per order (the per-channel limit below). Priced at $5.00 per 1,000 viewers per hour, deducted from your balance. A one-time service has its own minimum and takes up to 500,000 per order.
  • per-channel limit — one channel can carry 5,000 viewers at a time on your account, counted across your own live orders on that channel. Going over is a 422. The limit is per channel, not per account: every other channel has its own full allowance, so it caps how deep you can go on one stream, never how many streams you can run. An order stops counting the moment its paid hours end or it is cancelled, which frees the room straight away.
  • hours — for live viewers: how long the viewers stay, pay-as-you-go (2 = two hours). One-time services don't use it.
  • cost — computed server-side from the live price table, exactly like the dashboard; a total from the caller is never trusted.
  • speed_preset — optional delivery pace: one of the tier keys in the table below (the same tiers the dashboard's speed picker offers, under the same names), or custom. Omit it and the order runs on the service's default tier — marked in the table — exactly as a dashboard order does, and the response echoes that tier. A tier the service does not offer, or one that cannot finish the order inside the hours you are buying, is refused with 422 and the reason.
  • speed_min_s, speed_max_s — required together when speed_preset is custom: the random gap between units, in seconds, with max_s ≥ min_s. Decimals are fine (0.5 is half a second). The fastest custom pace is one unit every 0.1 seconds; the slowest is 3,600 seconds, and a max_s above that is clamped down rather than refused. A custom pace is under the same rule as the tiers: it has to finish the order inside the hours you are buying. For any other preset the two fields are ignored — the range is the tier's.
  • speed (response) — the pace the order was actually sold at, echoed on every order payload: the tier key and the gap it resolved to at sale time, e.g. { "preset": "normal", "min_s": 0.9, "max_s": 1.5 } (a null gap pair means the network's shared ceiling), or { "preset": "custom", … } with your own numbers. null only on orders placed before delivery speed was available. Retrying an Idempotency-Key compares the preset, and for custom the numbers too.

Delivery speeds — the tiers each service offers

Pass the key as speed_preset. Each rate is the same figure the dashboard prints for that tier; "up to" marks the network's shared ceiling, which every running order divides between them. The gap is the pause between one unit and the next, drawn at random inside the range. The default tier is what an order runs on when you send no preset.

Servicespeed_presetWhat it deliversGap between units
Live viewers fastest Fastest (up to 400 viewers/minute) the network ceiling
fast Fast (150 viewers/minute) 0.3–0.5 s
normal — default Normal (50 viewers/minute) 0.9–1.5 s
slow Slow (20 viewers/minute) 2–4 s
slowest Slowest (10 viewers/minute) 4–8 s
Clip views fastest Fastest (1,500 views/hour) 2–2.8 s
fast Fast (1,000 views/hour) 3–4.2 s
normal — default Normal (1,000 views/day) 60–112.8 s
slow Slow (500 views/day) 120–225.6 s
slowest Slowest (250 views/day) 240–451.2 s

A tier that cannot finish your order inside the hours you are buying is refused with 422: pick a faster tier or add hours. The dashboard applies the same rule.

POST  /orders/{id}/cancel — cancel an order

Only orders that have not started delivering can be cancelled — status_code NEW_ORDER (Queued) or VALIDATING (Checking your channel, or your clip) — and the full amount goes straight back to your balance. Cancelling a running order is refused with 409.

curl -X POST https://buykickviewers.com/api/v1/orders/1043/cancel \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"
{
  "success": true,
  "id": "LV-1043",
  "order_id": 1043,
  "service": "live_viewers",
  "channel": "yourchannel",
    "quantity": 1000,
  "speed": { "preset": "normal", "min_s": 0.9, "max_s": 1.5 },
  "status": "Cancelled",
  "status_code": "CANCELED",
  "cost": "10.00",
  "created_at": "2026-09-15T18:31:22+00:00",
  "hours": 2,
  "status_hint": "Cancelled. Anything you did not use was returned to your balance.",
  "cancel_allowed": false
}

GET  /key/info — this key's caps and status

curl https://buykickviewers.com/api/v1/key/info \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"
{
  "success": true,
  "name": "My reseller bot",
  "prefix": "bckv_live_f4a2",
  "daily_limit": "100.00",
  "monthly_limit": null,
  "per_order_limit": null,
  "expires_at": null,
  "created_at": "2026-09-15T16:02:11+00:00",
  "is_active": true
}

null means "no cap set" — the key is then only bounded by your account balance.

GET  /key/usage — spend totals and recent events

curl https://buykickviewers.com/api/v1/key/usage \
  -H "X-API-Key: bckv_live_your_key_here" \
  -H "Accept: application/json"
{
  "success": true,
  "daily_spent": "20.00",
  "monthly_spent": "84.50",
  "total_orders_created": 9,
  "total_amount_spent": "152.75",
  "last_used_at": "2026-09-15T18:31:22+00:00",
  "recent_events": [
    { "event": "order.created", "reason": "order 1043", "at": "2026-09-15T18:31:22+00:00" },
    { "event": "order.replayed", "reason": "order 1042", "at": "2026-09-15T18:26:40+00:00" }
  ]
}

Rate limits & spending caps

Per-key rate limits — with tiers

Limits are counted per key, not per IP: reads 60/minute, listings and writes 30/minute. Your account's tier multiplies them — 1× standard, 2.5× automatically once your lifetime deposits pass $500 (applies to every key on the account), with higher tiers available on request.

Every successful response and every rate-limit refusal carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a refusal also carries Retry-After.

Per-key spending caps

Optional daily, monthly and per-order dollar caps, an IP allowlist and an expiry date — all set when you create the key and enforced server-side on every order. A cap refusal is a 422 with a clear message, and the spend counters roll over automatically each day and month.

Errors

Every error is JSON with the same shape — an HTTP status that says what happened and one line that says why:

{ "success": false, "error": "The account balance is not enough for this order." }
401Missing, unknown, revoked or expired key — or the account behind it is banned or its email unverified.
403Your IP is not on this key's allowlist.
404No such order on your account, or no such endpoint.
405This endpoint exists, but not with that HTTP method.
409Cancel refused — read the error line: the order already started, it is already finished, or the cancellation could not be completed (nothing was changed — safe to retry).
422Validation or business refusal (parameters, balance, a spending cap, an unavailable service, a missing Idempotency-Key).
429Rate limit exceeded — see Retry-After.
500Unexpected server error — retry in a moment; if it persists, tell us.
503Temporary outage — retry after a few seconds.

Order statuses

Every order carries both a human status (wording may change as we polish copy) and a stable machine field status_code — switch your automation on status_code and treat status as display text. The full vocabulary:

status_codestatusWhat it means
NEW_ORDERQueuedIn the queue — still cancellable for a full refund.
VALIDATINGChecking your channel or Checking your clipWe are verifying the channel — or, for clip views, the clip — before delivery starts. Still cancellable for a full refund.
ACTIVEDeliveringDelivery is running; for hourly services the paid time is counting down, for one-time services the count is climbing.
COMPLETEDCompletedFinished and delivered in full.
PAUSED_BY_CLIENTPausedYou paused it; the clock is stopped.
STREAMER_OFFLINE_HOLDWaiting for your streamThe stream went offline; we resume automatically when you are back.
CANCELEDCancelledCancelled by you; anything unused was refunded.
REFUNDING_IN_PROGRESSRefund in progressWe are returning the unused part to your balance.
REFUNDED_*RefundedRefunded (the suffix carries the reason).
VALIDATION_FAILED*Couldn't startWe could not start the order on that channel; it was refunded.
FAQ

API questions

How do I get an API key?
Create a free account, open Account → API keys in the panel, and use the form at the top of that page to generate a key — the full API documentation sits on the same page. You can hold up to 5 active keys and revoke any of them at any time. The raw key (format bckv_live_…) is shown once at creation, so store it securely.
How do I authenticate?
Send your key in the X-API-Key header on every request — for example: X-API-Key: bckv_live_your_key_here. There is no OAuth and no bearer token.
How do I avoid double-buying an order?
Every order request requires an Idempotency-Key header — any unique string you pick. If a request times out or your script crashes, send the exact same request with the same key and you get the same order back with replayed: true, never a second charge.
What are the rate limits?
Limits are per key: 60 requests/minute on read endpoints and 30/minute on listings and writes. Every response includes X-RateLimit headers, and limits scale up automatically — 2.5× once your lifetime deposits pass $500.
Can I cap what a key can spend?
Yes — every key can carry a daily, monthly and per-order dollar cap, an IP allowlist and an expiry date. Caps are enforced server-side on every order, and you can watch each key's spend in the panel or via the /key/usage endpoint.
Can I resell or run agency workloads through the API?
Yes — that is exactly what it is built for. Keys spend from your account balance, so top up once and let all your keys draw from it. Contact us on Telegram for dedicated reseller terms and higher rate-limit tiers.

Automate your Kick growth

Free account → API keys → first order in minutes.

Get your API key
Live support