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.
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.
Create a Streamrise account
Sign up on stream-rise.com — registration is free. You fund a balance, and every order draws from it.
Copy your API key
Account→Settings→API
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.
Set your key as an environment variable
export STREAMRISE_KEY=YOUR_API_KEYSend your first order
Create an order with a single call. A 200 response carries the order ID and its initial state.
curl "https://stream-rise.com/api/newOrder?key=$STREAMRISE_KEY&service=twitchViewers&channel=yourchannel&amount=100"{
"orderId": 12345,
"order": {
"id": 12345,
"service": "twitchViewers",
"channel": "yourchannel",
"amount": 100,
"status": "active"
}
}"status": "active", you're live.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.
# 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.
API reference.
PerfectPanel
A single POST endpoint switched by an "action" field — a drop-in for SMM-panel software that speaks the PerfectPanel protocol.
Returns the full service catalogue with live, per-account discounted rates.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
action | string | Required | services | Must be "services". |
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"services"}'[
{
"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
}
]Returns the current account balance and its currency.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
action | string | Required | balance | Must be "balance". |
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"balance"}'{
"balance": "100.84",
"currency": "USD"
}Returns the charge, start count, status, and remaining units for one order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
action | string | Required | status | Must be "status". |
order | string | Required | — | A single order ID. |
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"status","order":12345}'{
"charge": "0.27",
"start_count": "3572",
"status": "In progress",
"remains": "157",
"currency": "USD"
}{
"error": "Incorrect order ID"
}Returns status for many orders at once, keyed by order ID.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
action | string | Required | status | Must be "status". |
orders | string | Required | — | Comma-separated order IDs. |
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"status","orders":"12345,12346,99999"}'{
"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"
}
}Creates an order. The service is addressed by its numeric PerfectPanel ID from the services list.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
action | string | Required | add | Must be "add". |
service | integer | Required | — | Numeric service ID from the services list. |
link | string | Required | — | Full channel URL the order targets. |
quantity | integer | Required | — | Units to deliver, within the service min and max. |
interval | string | Optional | — | Viewer services: drip interval in minutes. |
comments | string | Optional | — | Chatbot services: newline-separated custom messages. |
periodAmount | string | Optional | — | Period services: how long the order runs. |
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(){
"order": 23501
}Cancels one or more orders. Availability depends on the service supporting cancellation.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
action | string | Required | cancel | Must be "cancel". |
orders | string | Required | — | Comma-separated order IDs. |
curl -X POST https://stream-rise.com/perfectPanel -H "Content-Type: application/json" -d '{"key":"YOUR_API_KEY","action":"cancel","orders":"23501,23502"}'[
{
"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.
Lists the service families (platforms) and their display order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
curl "https://stream-rise.com/api/getFamilyServices?key=YOUR_API_KEY"[
{
"service": "twitch",
"order": 1
},
{
"service": "kick",
"order": 2
},
{
"service": "youtube",
"order": 3
},
{
"service": "tiktok",
"order": 4
}
]Returns every service grouped by family, with per-service field metadata.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
curl "https://stream-rise.com/api/getServices?key=YOUR_API_KEY"{
"services": {
"twitch": {
"twitchViewers": {
"service": "twitchViewers",
"serviceFamily": "twitch",
"serviceType": "viewers",
"enabled": true,
"fieldsData": { … }
},
"twitchChatBots": {
"service": "twitchChatBots",
"serviceFamily": "twitch",
"serviceType": "chatbots",
"enabled": true,
"fieldsData": { … }
}
},
"kick": { … }
},
"types": { … }
}Returns the price table for a service (per-tier unit prices).
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
service | string | Optional | — | Filter to a single service. |
curl "https://stream-rise.com/api/getPrices?key=YOUR_API_KEY&service=twitchViewers"{
"twitchViewers": {
"1": {
"10": 0.9,
"50": 4.2,
"100": 7.8
}
}
}Lists the fields each service accepts when creating an order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
curl "https://stream-rise.com/api/availableToSend?key=YOUR_API_KEY"{
"twitchViewers": [
"channel",
"amount",
"interval"
],
"twitchChatBots": [
"channel",
"amount",
"comments"
],
"types": {
"viewers": [
"channel",
"amount"
],
"chatbots": [
"channel",
"amount",
"comments"
]
}
}Lists the fields each service allows changing on an existing order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
curl "https://stream-rise.com/api/availableToChange?key=YOUR_API_KEY"{
"twitchViewers": [
"channel",
"amount"
],
"twitchChatBots": [
"channel",
"comments"
],
"types": {
"viewers": [
"channel",
"amount"
],
"chatbots": [
"channel",
"comments"
]
}
}Lists the fields each service allows upgrading on an existing order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
curl "https://stream-rise.com/api/availableToUpgrade?key=YOUR_API_KEY"{
"twitchViewers": [
"amount"
],
"twitchViewersPeriod": [
"amount",
"period"
],
"types": {
"viewers": [
"amount"
]
}
}Returns the min/max bounds for each numeric field of a service.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
service | string | Optional | — | Service to read limits for. |
curl "https://stream-rise.com/api/getParamsLimits?key=YOUR_API_KEY&service=twitchViewers"{
"amount": {
"min": 10,
"max": 10000
},
"interval": {
"min": 1,
"max": 60
}
}Validates a single order field (e.g. a channel name) before you submit. No key required.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
service | string | Required | — | Service the field belongs to. |
field | string | Required | — | Field name, e.g. "channel". |
value | string | Required | — | Value to validate. |
curl "https://stream-rise.com/api/validateOrderProperty?service=twitchViewers&field=channel&value=username"200 OK{
"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).
Creates an order and returns its ID and initial state.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
service | string | Required | — | Service name, e.g. twitchViewers. |
channel | string | Required | — | Target channel name or URL. |
amount | integer | Required | — | Units to deliver. |
period | string | Optional | — | Period services: period type. |
periodAmount | string | Optional | — | Period services: how long the order runs. |
interval | string | Optional | — | Viewer services: drip interval in minutes. |
comments | string | Optional | — | Chatbot services: newline-separated messages. |
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(){
"orderId": 12345,
"order": {
"id": 12345,
"service": "twitchViewers",
"channel": "username",
"amount": 100,
"status": "active"
}
}{
"error": {
"channel": "channelEmpty"
}
}Returns your orders keyed by ID. Optionally filter to specific IDs.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
ids | string | Optional | — | Comma-separated IDs to filter. |
curl "https://stream-rise.com/api/getOrders?key=YOUR_API_KEY"{
"12345": {
"id": 12345,
"service": "twitchViewers",
"channel": "username",
"amount": 100,
"pause": false
},
"12346": {
"id": 12346,
"service": "twitchChatBots",
"channel": "username2",
"amount": 50,
"pause": true
}
}Returns a sorted, searchable, paginated page of orders plus an optional total.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
start | number | Optional | — | First row index (0-based). |
end | number | Optional | — | Last row index. |
total | boolean | Optional | — | Include the total row count. |
sortKey | string | Optional | — | Column to sort by, e.g. orderTime. |
sortDirection | string | Optional | — | "asc" or "desc". |
searchValue | string | Optional | — | Free-text filter. |
serviceType | string | Optional | — | Filter by service type. |
ids | string | Optional | — | Comma-separated IDs to filter. |
curl "https://stream-rise.com/api/getOrdersPage?key=YOUR_API_KEY&start=0&end=15&total=true&sortKey=orderTime&sortDirection=desc"{
"history": [
{
"id": 12345,
"service": "twitchViewers",
"channel": "username",
"amount": 100,
"orderTime": 1711500000000,
"pause": false
}
],
"total": "42"
}Pauses delivery on an active order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
id | string | Required | — | Order ID. |
curl "https://stream-rise.com/api/pauseOrder?key=YOUR_API_KEY&id=12345"200 OKResumes a paused order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
id | string | Required | — | Order ID. |
curl "https://stream-rise.com/api/resumeOrder?key=YOUR_API_KEY&id=12345"200 OKPermanently removes an order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
id | string | Required | — | Order ID. |
curl "https://stream-rise.com/api/deleteOrder?key=YOUR_API_KEY&id=12345"200 OKCalculates the price and discount for upgrading an order, without applying it.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
id | string | Required | — | Order ID. |
order | object | Required | — | New order properties to price. |
curl -X POST "https://stream-rise.com/api/calculateUpgradePrice?key=YOUR_API_KEY" -H "Content-Type: application/json" -d '{"id":12345,"order":{"amount":200}}'{
"price": 5.5,
"totalDiscount": 0.55
}Applies an upgrade (e.g. more units) to an existing order.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
id | string | Required | — | Order ID. |
order | object | Required | — | New order properties. |
curl -X POST "https://stream-rise.com/api/upgradeOrder?key=YOUR_API_KEY" -H "Content-Type: application/json" -d '{"id":12345,"order":{"amount":200}}'200 OKChanges editable properties of an order, such as the target channel.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | Your API key. |
id | string | Required | — | Order ID. |
order | object | Required | — | Properties to change. |
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"}}'200 OK{
"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.
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.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
key | string | Required | — | First message after connect: {"key": "YOUR_API_KEY"} — authenticates the socket. Unauthenticated sockets get {"event":"no auth"}. |
event | string | Required | — | "subscribe" or "unsubscribe" — sent as the next message(s) after auth. |
thread | string | Required | — | "ordersUpdates" for all your orders, or "orderUpdatesByOrderId" for a single order. |
# 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()){
"event": "socketClientId",
"socketClientId": 13
}{
"event": "auth",
"message": "Authenticated",
"socketsLeft": 3
}{
"event": "subscribe",
"message": "subscribed to ordersUpdates"
}{
"event": "threadMessage",
"thread": "ordersUpdates",
"message": {
"orders": {
"12345": { "status": …, /* changed, whitelisted fields */ }
}
}
}{
"event": "too many",
"message": "Too many sockets connected for this client"
}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
{ "error": "Incorrect order ID" }Native field error
{ "error": { "channel": "channelEmpty" } }| scope | error response | when it happens | how 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. |
What we aim for. Targets
These are operating targets, not contractual guarantees. Questions or an incident? Reach us at /contacts.
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.
Two interfaces: a PerfectPanel-compatible endpoint and a native /api/* surface, both authenticated with your key.
New services and fields are added without changing existing request or response shapes.
Webhooks, request-rate tiers, and a published change history are on the roadmap.
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.
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.