Skip to main content
Developers · HTTP API

Streamrise API

Wholesale viewers, chat, and follower orders for Twitch and Kick. PerfectPanel-compatible, plus a native HTTP API — authenticated with a single API key.

PerfectPanel + Native Updated Twitch + Kick
01 Quick-start

First call in two minutes.

Four steps from a new account to a live order. You need a funded Streamrise account and a channel URL.

1

Create a Streamrise account

Sign up on stream-rise.com — registration is free. You fund a balance, and every order draws from it.

2

Copy your API key

AccountSettingsAPI

Your key is shown in Settings, ready to copy — regenerate it any time. Treat it like a password: anyone holding it can spend your balance.

3

Set your key as an environment variable

shell
export STREAMRISE_KEY=YOUR_API_KEY
4

Send your first order

Create an order with a single call. A 200 response carries the order ID and its initial state.

cURL
curl "https://stream-rise.com/api/newOrder?key=$STREAMRISE_KEY&service=twitchViewers&channel=yourchannel&amount=100"
200 OKResponse
JSON
{
  "orderId": 12345,
  "order": {
    "id": 12345,
    "service": "twitchViewers",
    "channel": "yourchannel",
    "amount": 100,
    "status": "active"
  }
}
If you see "status": "active", you're live.
02 Authentication

Every request carries a key.

Every request carries your API key — pass it as a key query parameter, a key field in the JSON body, or a key cookie. Find your key in your account — open Settings → API.

HTTP
# As a query parameter — native /api/* endpoints
GET https://stream-rise.com/api/getOrders?key=YOUR_API_KEY

# In the JSON body — PerfectPanel endpoint
POST https://stream-rise.com/perfectPanel
{ "key": "YOUR_API_KEY", "action": "balance" }

Where the key goes

PerfectPanel reads key from the JSON body; native /api/* reads it from the query string. A key cookie works too — whichever your stack makes easiest.

Some reads need no key

Field validation (/api/validateOrderProperty) is open, so you can check a channel name before you even have an account.

Get a key

Open Settings → API in your account to copy or regenerate your key. Accounts are free; you only pay per order from your balance.

Keep your key server-side. Your API key can spend your balance. Never embed it in client-side code, a mobile app, or a public repository.
03 Endpoints

API reference.

PerfectPanel

A single POST endpoint switched by an "action" field — a drop-in for SMM-panel software that speaks the PerfectPanel protocol.

POST/perfectPanel

Returns the full service catalogue with live, per-account discounted rates.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
actionstringRequiredservicesMust be "services".
Example request
cURL
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"services"}'
Response
200Success
JSON
[
  {
    "service": 1,
    "name": "Twitch Viewers",
    "type": "Default",
    "category": "Twitch",
    "rate": "0.90",
    "min": "10",
    "max": "10000",
    "cancel": true
  },
  {
    "service": 2,
    "name": "Twitch Chatbots",
    "type": "Custom Comments",
    "category": "Twitch",
    "rate": "8.00",
    "min": "10",
    "max": "1500",
    "cancel": false
  }
]
POST/perfectPanel

Returns the current account balance and its currency.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
actionstringRequiredbalanceMust be "balance".
Example request
cURL
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"balance"}'
Response
200Success
JSON
{
  "balance": "100.84",
  "currency": "USD"
}
POST/perfectPanel

Returns the charge, start count, status, and remaining units for one order.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
actionstringRequiredstatusMust be "status".
orderstringRequiredA single order ID.
Example request
cURL
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"status","order":12345}'
Response
200Success
JSON
{
  "charge": "0.27",
  "start_count": "3572",
  "status": "In progress",
  "remains": "157",
  "currency": "USD"
}
200Error — unknown order
JSON
{
  "error": "Incorrect order ID"
}
POST/perfectPanel

Returns status for many orders at once, keyed by order ID.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
actionstringRequiredstatusMust be "status".
ordersstringRequiredComma-separated order IDs.
Example request
cURL
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"status","orders":"12345,12346,99999"}'
Response
200Success
JSON
{
  "12345": {
    "charge": "0.27",
    "start_count": "3572",
    "status": "Partial",
    "remains": "157",
    "currency": "USD"
  },
  "12346": {
    "charge": "1.44",
    "start_count": "234",
    "status": "In progress",
    "remains": "10",
    "currency": "USD"
  },
  "99999": {
    "error": "Incorrect order ID"
  }
}
POST/perfectPanel

Creates an order. The service is addressed by its numeric PerfectPanel ID from the services list.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
actionstringRequiredaddMust be "add".
serviceintegerRequiredNumeric service ID from the services list.
linkstringRequiredFull channel URL the order targets.
quantityintegerRequiredUnits to deliver, within the service min and max.
intervalstringOptionalViewer services: drip interval in minutes.
commentsstringOptionalChatbot services: newline-separated custom messages.
periodAmountstringOptionalPeriod services: how long the order runs.
Code samples
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"add","service":1,"link":"https://twitch.tv/username","quantity":100}'
const res = await fetch("https://stream-rise.com/perfectPanel", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    key: "YOUR_API_KEY",
    action: "add",
    service: 1,
    link: "https://twitch.tv/username",
    quantity: 100
  })
});
const data = await res.json();
import requests

res = requests.post(
    "https://stream-rise.com/perfectPanel",
    json={
        "key": "YOUR_API_KEY",
        "action": "add",
        "service": 1,
        "link": "https://twitch.tv/username",
        "quantity": 100,
    },
)
data = res.json()
Response
200Success
JSON
{
  "order": 23501
}
POST/perfectPanel

Cancels one or more orders. Availability depends on the service supporting cancellation.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
actionstringRequiredcancelMust be "cancel".
ordersstringRequiredComma-separated order IDs.
Example request
cURL
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"cancel","orders":"23501,23502"}'
Response
200Success
JSON
[
  {
    "order": 23501,
    "cancel": 1
  },
  {
    "order": 23502,
    "cancel": {
      "error": "Incorrect order ID"
    }
  }
]

Service catalog

Native catalogue endpoints — richer than PerfectPanel "services", with families, per-service fields, price tables, and limits.

GET/api/getFamilyServices

Lists the service families (platforms) and their display order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
Example request
cURL
curl "https://stream-rise.com/api/getFamilyServices?key=YOUR_API_KEY"
Response
200Success
JSON
[
  {
    "service": "twitch",
    "order": 1
  },
  {
    "service": "kick",
    "order": 2
  },
  {
    "service": "youtube",
    "order": 3
  },
  {
    "service": "tiktok",
    "order": 4
  }
]
GET/api/getServices

Returns every service grouped by family, with per-service field metadata.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
Example request
cURL
curl "https://stream-rise.com/api/getServices?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "services": {
    "twitch": {
      "twitchViewers": {
        "service": "twitchViewers",
        "serviceFamily": "twitch",
        "serviceType": "viewers",
        "enabled": true,
        "fieldsData": { … }
      },
      "twitchChatBots": {
        "service": "twitchChatBots",
        "serviceFamily": "twitch",
        "serviceType": "chatbots",
        "enabled": true,
        "fieldsData": { … }
      }
    },
    "kick": { … }
  },
  "types": { … }
}
GET/api/getPrices

Returns the price table for a service (per-tier unit prices).

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
servicestringOptionalFilter to a single service.
Example request
cURL
curl "https://stream-rise.com/api/getPrices?key=YOUR_API_KEY&service=twitchViewers"
Response
200Success
JSON
{
  "twitchViewers": {
    "1": {
      "10": 0.9,
      "50": 4.2,
      "100": 7.8
    }
  }
}
GET/api/availableToSend

Lists the fields each service accepts when creating an order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
Example request
cURL
curl "https://stream-rise.com/api/availableToSend?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "twitchViewers": [
    "channel",
    "amount",
    "interval"
  ],
  "twitchChatBots": [
    "channel",
    "amount",
    "comments"
  ],
  "types": {
    "viewers": [
      "channel",
      "amount"
    ],
    "chatbots": [
      "channel",
      "amount",
      "comments"
    ]
  }
}
GET/api/availableToChange

Lists the fields each service allows changing on an existing order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
Example request
cURL
curl "https://stream-rise.com/api/availableToChange?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "twitchViewers": [
    "channel",
    "amount"
  ],
  "twitchChatBots": [
    "channel",
    "comments"
  ],
  "types": {
    "viewers": [
      "channel",
      "amount"
    ],
    "chatbots": [
      "channel",
      "comments"
    ]
  }
}
GET/api/availableToUpgrade

Lists the fields each service allows upgrading on an existing order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
Example request
cURL
curl "https://stream-rise.com/api/availableToUpgrade?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "twitchViewers": [
    "amount"
  ],
  "twitchViewersPeriod": [
    "amount",
    "period"
  ],
  "types": {
    "viewers": [
      "amount"
    ]
  }
}
GET/api/getParamsLimits

Returns the min/max bounds for each numeric field of a service.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
servicestringOptionalService to read limits for.
Example request
cURL
curl "https://stream-rise.com/api/getParamsLimits?key=YOUR_API_KEY&service=twitchViewers"
Response
200Success
JSON
{
  "amount": {
    "min": 10,
    "max": 10000
  },
  "interval": {
    "min": 1,
    "max": 60
  }
}
GET/api/validateOrderProperty

Validates a single order field (e.g. a channel name) before you submit. No key required.

Request
Query parameters
FieldTypeRequiredDefaultDescription
servicestringRequiredService the field belongs to.
fieldstringRequiredField name, e.g. "channel".
valuestringRequiredValue to validate.
Example request
cURL
curl "https://stream-rise.com/api/validateOrderProperty?service=twitchViewers&field=channel&value=username"
Response
200Valid
HTTP
200 OK
200Error — invalid value
JSON
{
  "error": {
    "channel": "Channel not found"
  }
}

Orders

Native order management — create, read, modify, pause, and remove orders. Services are addressed by their string name (e.g. twitchViewers).

GET/api/newOrder

Creates an order and returns its ID and initial state.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
servicestringRequiredService name, e.g. twitchViewers.
channelstringRequiredTarget channel name or URL.
amountintegerRequiredUnits to deliver.
periodstringOptionalPeriod services: period type.
periodAmountstringOptionalPeriod services: how long the order runs.
intervalstringOptionalViewer services: drip interval in minutes.
commentsstringOptionalChatbot services: newline-separated messages.
Code samples
curl "https://stream-rise.com/api/newOrder?key=YOUR_API_KEY&service=twitchViewers&channel=username&amount=100"
const res = await fetch(
  "https://stream-rise.com/api/newOrder?key=YOUR_API_KEY&service=twitchViewers&channel=username&amount=100"
);
const data = await res.json();
import requests

res = requests.get(
    "https://stream-rise.com/api/newOrder",
    params={
        "key": "YOUR_API_KEY",
        "service": "twitchViewers",
        "channel": "username",
        "amount": 100,
    },
)
data = res.json()
Response
200Success
JSON
{
  "orderId": 12345,
  "order": {
    "id": 12345,
    "service": "twitchViewers",
    "channel": "username",
    "amount": 100,
    "status": "active"
  }
}
200Error — field validation
JSON
{
  "error": {
    "channel": "channelEmpty"
  }
}
GET/api/getOrders

Returns your orders keyed by ID. Optionally filter to specific IDs.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idsstringOptionalComma-separated IDs to filter.
Example request
cURL
curl "https://stream-rise.com/api/getOrders?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "12345": {
    "id": 12345,
    "service": "twitchViewers",
    "channel": "username",
    "amount": 100,
    "pause": false
  },
  "12346": {
    "id": 12346,
    "service": "twitchChatBots",
    "channel": "username2",
    "amount": 50,
    "pause": true
  }
}
GET/api/getOrdersPage

Returns a sorted, searchable, paginated page of orders plus an optional total.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
startnumberOptionalFirst row index (0-based).
endnumberOptionalLast row index.
totalbooleanOptionalInclude the total row count.
sortKeystringOptionalColumn to sort by, e.g. orderTime.
sortDirectionstringOptional"asc" or "desc".
searchValuestringOptionalFree-text filter.
serviceTypestringOptionalFilter by service type.
idsstringOptionalComma-separated IDs to filter.
Example request
cURL
curl "https://stream-rise.com/api/getOrdersPage?key=YOUR_API_KEY&start=0&end=15&total=true&sortKey=orderTime&sortDirection=desc"
Response
200Success
JSON
{
  "history": [
    {
      "id": 12345,
      "service": "twitchViewers",
      "channel": "username",
      "amount": 100,
      "orderTime": 1711500000000,
      "pause": false
    }
  ],
  "total": "42"
}
GET/api/pauseOrder

Pauses delivery on an active order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idstringRequiredOrder ID.
Example request
cURL
curl "https://stream-rise.com/api/pauseOrder?key=YOUR_API_KEY&id=12345"
Response
200Success
HTTP
200 OK
GET/api/resumeOrder

Resumes a paused order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idstringRequiredOrder ID.
Example request
cURL
curl "https://stream-rise.com/api/resumeOrder?key=YOUR_API_KEY&id=12345"
Response
200Success
HTTP
200 OK
GET/api/deleteOrder

Permanently removes an order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idstringRequiredOrder ID.
Example request
cURL
curl "https://stream-rise.com/api/deleteOrder?key=YOUR_API_KEY&id=12345"
Response
200Success
HTTP
200 OK
POST/api/calculateUpgradePrice

Calculates the price and discount for upgrading an order, without applying it.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idstringRequiredOrder ID.
orderobjectRequiredNew order properties to price.
Example request
cURL
curl -X POST "https://stream-rise.com/api/calculateUpgradePrice?key=YOUR_API_KEY" -H "Content-Type: application/json" -d '{"id":12345,"order":{"amount":200}}'
Response
200Success
JSON
{
  "price": 5.5,
  "totalDiscount": 0.55
}
POST/api/upgradeOrder

Applies an upgrade (e.g. more units) to an existing order.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idstringRequiredOrder ID.
orderobjectRequiredNew order properties.
Example request
cURL
curl -X POST "https://stream-rise.com/api/upgradeOrder?key=YOUR_API_KEY" -H "Content-Type: application/json" -d '{"id":12345,"order":{"amount":200}}'
Response
200Success
HTTP
200 OK
POST/api/changeOrder

Changes editable properties of an order, such as the target channel.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredYour API key.
idstringRequiredOrder ID.
orderobjectRequiredProperties to change.
Example request
cURL
curl -X POST "https://stream-rise.com/api/changeOrder?key=YOUR_API_KEY" -H "Content-Type: application/json" -d '{"id":12345,"order":{"channel":"new_channel_name"}}'
Response
200Success
HTTP
200 OK
200Error — field validation
JSON
{
  "error": {
    "channel": "Invalid channel name"
  }
}

Real-time

Order status pushed over WebSocket — the same live feed the Streamrise panel runs on. Use it instead of a polling loop; /api/getOrders stays available as the fallback. Classic HTTP webhooks (a POST to your URL) are planned and not live yet.

WSwss://stream-rise.com

Open a WebSocket to the site origin, authenticate with your API key, and subscribe to the ordersUpdates thread. Order changes are then pushed to you as they happen (batched roughly every 250 ms), with only the fields your key is allowed to read. Concurrent sockets per key are limited (default 4; partner limits are set per key). Subscribe to orderUpdatesByOrderId instead to scope the feed to a single order, and send {"event":"unsubscribe","thread":"…"} to stop a thread.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequiredFirst message after connect: {"key": "YOUR_API_KEY"} — authenticates the socket. Unauthenticated sockets get {"event":"no auth"}.
eventstringRequired"subscribe" or "unsubscribe" — sent as the next message(s) after auth.
threadstringRequired"ordersUpdates" for all your orders, or "orderUpdatesByOrderId" for a single order.
Code samples
# wscat (npm i -g wscat)
wscat -c wss://stream-rise.com
> {"key": "YOUR_API_KEY"}
< {"event":"auth","message":"Authenticated","socketsLeft":3}
> {"event": "subscribe", "thread": "ordersUpdates"}
< {"event":"subscribe","message":"subscribed to ordersUpdates"}
const WebSocket = require('ws');
const ws = new WebSocket('wss://stream-rise.com');
ws.on('open', () => ws.send(JSON.stringify({ key: 'YOUR_API_KEY' })));
ws.on('message', (m) => {
  const msg = JSON.parse(m.toString());
  if (msg.event === 'auth') {
    ws.send(JSON.stringify({ event: 'subscribe', thread: 'ordersUpdates' }));
  }
  if (msg.event === 'threadMessage' && msg.thread === 'ordersUpdates') {
    console.log(msg.message.orders); // { "<orderId>": { ...changed fields } }
  }
});
import asyncio, json, websockets

async def main():
    async with websockets.connect("wss://stream-rise.com") as ws:
        await ws.send(json.dumps({"key": "YOUR_API_KEY"}))
        async for raw in ws:
            msg = json.loads(raw)
            if msg.get("event") == "auth":
                await ws.send(json.dumps({"event": "subscribe", "thread": "ordersUpdates"}))
            if msg.get("event") == "threadMessage" and msg.get("thread") == "ordersUpdates":
                print(msg["message"]["orders"])  # { "<orderId>": { ...changed fields } }

asyncio.run(main())
Response
WSOn connect
JSON
{
  "event": "socketClientId",
  "socketClientId": 13
}
WSAfter key message
JSON
{
  "event": "auth",
  "message": "Authenticated",
  "socketsLeft": 3
}
WSSubscribe acknowledged
JSON
{
  "event": "subscribe",
  "message": "subscribed to ordersUpdates"
}
WSOrder update — pushed, batched ~250 ms
JSON
{
  "event": "threadMessage",
  "thread": "ordersUpdates",
  "message": {
    "orders": {
      "12345": { "status": …, /* changed, whitelisted fields */ }
    }
  }
}
WSToo many sockets for this key
JSON
{
  "event": "too many",
  "message": "Too many sockets connected for this client"
}
04 Error codes

Every error, spelled out.

There are no HTTP error codes to special-case — a failed call still returns 200 OK with a small error field. It takes one of two shapes: a string from PerfectPanel, or a { field: reason } map from native /api/*. Filter by any text below.

PerfectPanel error

JSON
{ "error": "Incorrect order ID" }

Native field error

JSON
{ "error": { "channel": "channelEmpty" } }
7 errors
scopeerror responsewhen it happenshow to fix
perfectPanel{ "error": "Incorrect order ID" }The order ID is unknown or not under this key.Confirm the ID was returned to this account.
perfectPanel{ "error": "Access denied" }The action is not permitted for this key.Use a key allowed to run that action.
perfectPanel{ "error": "Service doesn't support cancel" }The service cannot be cancelled.Check cancel on the service in the catalogue first.
/api/*{ "error": { "channel": "channelEmpty" } }A required field was left empty.Read the field key and supply a value.
/api/*{ "error": { "channel": "Channel not found" } }The channel does not exist or is unreachable.Validate it first with /api/validateOrderProperty.
/api/*{ "error": { "channel": "Invalid channel name" } }A field failed validation on change or upgrade.Fix the named field and resend.
both{ "error": "..." }The key is missing, wrong, or revoked.Send a valid key from your account Settings → API.
No errors match that filter. Clear the filter to see them all.
05 SLA & reliability

What we aim for. Targets

99.5%
Uptime target
The availability we design and operate for — a target, not a contractual guarantee.
100%
Refunded
Unfilled or cancelled units are returned to your balance in full.
4h
Support reply
Typical first reply to a developer issue, 9–21 UTC.

These are operating targets, not contractual guarantees. Questions or an incident? Reach us at /contacts.

06 Changelog

Stable and unversioned.

The Streamrise API is stable and unversioned. New services, fields, and endpoints are added without breaking existing calls — so there are no version cut-overs to track and no deprecation deadlines to chase.

Today
Compatible

Two interfaces: a PerfectPanel-compatible endpoint and a native /api/* surface, both authenticated with your key.

Additive

New services and fields are added without changing existing request or response shapes.

Planned

Webhooks, request-rate tiers, and a published change history are on the roadmap.

07 Still need help

Talk to the people who run it.

Developer support, priority-routed.

API issues skip the general queue. Send the order ID and the exact request you made, and we can trace it directly.

Email developer support General contacts Replies typically within 4 hours, 9-21 UTC
How do I get a Streamrise API key?

Sign in to your Streamrise account and open Settings → API — your key is shown there, ready to copy (regenerate it any time). Treat it like a password — it spends from your balance.

What is the Streamrise API rate limit?

There is no enforced request-rate limit today. Please pace bulk calls sensibly; published volume tiers are on the roadmap.

Does Streamrise have webhooks?

Not yet — webhooks are planned. For now, poll /api/getOrders or PerfectPanel status to track delivery.

Does Streamrise refill or refund orders?

There is no separate refill endpoint today. Unfilled or cancelled units are refunded to your balance.

Is the API versioned?

No. The API is stable and unversioned — new services and fields are added without breaking existing calls.

How do I avoid duplicate orders on retries?

There is no idempotency key today, so avoid blindly retrying a write that may have already gone through — check /api/getOrders first.