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

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.

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
keystringRequired—Your 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.9,
    "min": 10,
    "max": 10000,
    "refill": true,
    "cancel": false
  },
  {
    "service": 2,
    "name": "Twitch Chatbots",
    "type": "Custom Comments",
    "category": "Twitch",
    "rate": 8,
    "min": 10,
    "max": 1500,
    "refill": true,
    "cancel": false
  }
]
POST/perfectPanel

Returns the current account balance and its currency.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequired—Your 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
keystringRequired—Your API key.
actionstringRequiredstatusMust be "status".
orderstringRequired—A 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
{
  "orderid": 12345,
  "charge": null,
  "start_count": null,
  "status": "in_progress",
  "remains": 100,
  "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
keystringRequired—Your API key.
actionstringRequiredstatusMust be "status".
ordersstringRequired—Comma-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": {
    "orderid": 12345,
    "charge": null,
    "start_count": null,
    "status": "completed",
    "remains": 100,
    "currency": "USD"
  },
  "12346": {
    "orderid": 12346,
    "charge": null,
    "start_count": null,
    "status": "in_progress",
    "remains": 50,
    "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
keystringRequired—Your API key.
actionstringRequiredaddMust be "add".
serviceintegerRequired—Numeric service ID from the services list.
linkstringRequired—Full channel URL the order targets.
quantityintegerRequired—Units to deliver, within the service min and max.
intervalstringOptional—Viewer services: drip interval in minutes.
commentsstringOptional—Chatbot services: newline-separated custom messages.
periodAmountstringOptional—Period 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
{
  "orderId": 23501,
  "order": 23501
}
400Error — not enough balance
JSON
{
  "error": "noBalance"
}
POST/perfectPanel

Cancels one or more orders. Cancellation is enabled per account on request and needs a service that supports it; otherwise the call returns an error.

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
actionstringRequiredcancelMust be "cancel".
ordersstringRequired—Comma-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
200Error — cancel not enabled for your account
JSON
[
  {
    "order": null,
    "cancel": {
      "error": "Access denied"
    }
  }
]
200Error — unknown order
JSON
[
  {
    "order": 23501,
    "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
keystringRequired—Your 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": 10
  },
  {
    "service": "tiktok",
    "order": 20
  },
  {
    "service": "youtube",
    "order": 30
  }
]
GET/api/getServices

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your 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",
        "serviceSubType": "hourly",
        "enabled": true,
        "availableParamsToSend": [ … ],
        "fieldsData": { … }
      },
      "twitchChatBotsViewers": {
        "service": "twitchChatBotsViewers",
        "serviceFamily": "twitch",
        "serviceType": "viewers",
        "serviceSubType": "period",
        "enabled": true,
        "availableParamsToSend": [ … ],
        "fieldsData": { … }
      }
    },
    "kick": { … }
  },
  "types": {
    "channel": "text",
    "amount": "integer",
    "interval": "integer",
    "claimPoints": "boolean"
  },
  "fieldMeta": { … }
}
GET/api/getPrices

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
servicestringOptional—Filter: only services whose name contains this text.
Example request
cURL
curl "https://stream-rise.com/api/getPrices?key=YOUR_API_KEY&service=twitchViewers"
Response
200Success
JSON
{
  "twitchViewers": {
    "0": {
      "0": 0.0038
    }
  },
  "twitchViewersPeriod": {
    "0": {
      "0": 0.0048,
      "500": 0.0042
    },
    "1": {
      "0": 0.045,
      "500": 0.039,
      "1000": 0.0355
    }
  }
}
GET/api/availableToSend

Lists the fields each service accepts when creating an order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
Example request
cURL
curl "https://stream-rise.com/api/availableToSend?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "whiteList": {
    "twitchViewers": {
      "service": "twitchViewers",
      "availableParamsToSend": [
        "channel",
        "amount",
        "interval",
        "viewersInList",
        "uniqueViewerPercent",
        …
      ]
    },
    "twitchChatBotsViewers": {
      "service": "twitchChatBotsViewers",
      "availableParamsToSend": [
        "channel",
        "amount",
        "interval",
        "messageInterval",
        "textToSend",
        …
      ]
    }
  },
  "types": {
    "channel": "text",
    "amount": "integer",
    "interval": "integer",
    "textToSend": "text",
    "claimPoints": "boolean"
  }
}
GET/api/availableToChange

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
Example request
cURL
curl "https://stream-rise.com/api/availableToChange?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "whiteList": {
    "twitchViewers": {
      "service": "twitchViewers",
      "availableParamsToChange": [
        "channel",
        "amount",
        "interval",
        "viewersInList",
        …
      ]
    },
    "twitchChatBotsViewers": {
      "service": "twitchChatBotsViewers",
      "availableParamsToChange": [
        "channel",
        "amount",
        "interval",
        "messageInterval",
        "textToSend",
        …
      ]
    }
  },
  "types": {
    "channel": "text",
    "amount": "integer",
    "interval": "integer",
    "textToSend": "text"
  }
}
GET/api/availableToUpgrade

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
Example request
cURL
curl "https://stream-rise.com/api/availableToUpgrade?key=YOUR_API_KEY"
Response
200Success
JSON
{
  "whiteList": {
    "twitchViewers": {
      "service": "twitchViewers",
      "availableParamsToUpgrade": []
    },
    "twitchViewersPeriod": {
      "service": "twitchViewersPeriod",
      "availableParamsToUpgrade": [
        "time",
        "raidsAmount",
        "init_amount",
        "init_viewersInList",
        "init_chatBots"
      ]
    }
  },
  "types": {
    "time": "bigint",
    "raidsAmount": "integer",
    "init_amount": "integer",
    "init_viewersInList": "integer",
    "init_chatBots": "integer"
  }
}
GET/api/getParamsLimits

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
servicestringOptional—Service 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": 0,
    "max": 10000
  },
  "interval": {
    "min": 60,
    "max": 1547483647
  },
  "viewersInList": {
    "min": 0,
    "max": 10000
  },
  "uniqueViewerPercent": {
    "min": 0,
    "max": 100
  }
}
GET/api/validateOrderProperty

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
servicestringRequired—Service the field belongs to.
fieldstringRequired—Field name, e.g. "channel".
valuestringRequired—Value to validate.
Example request
cURL
curl "https://stream-rise.com/api/validateOrderProperty?service=twitchViewers&field=channel&value=username"
Response
200Valid
JSON
{
  "online": false,
  "viewers": 0,
  "broadcaster_language": "en"
}
400Error — invalid value
JSON
{
  "type": "fieldError",
  "message": "fieldError",
  "details": [
    {
      "field": "channel",
      "message": "error_field_channel",
      "type": "wrongChannel"
    }
  ]
}

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
keystringRequired—Your API key.
servicestringRequired—Service name, e.g. twitchViewers.
channelstringRequired—Target channel name or URL.
amountintegerRequired—Units to deliver.
periodstringOptional—Period services: period type.
periodAmountstringOptional—Period services: how long the order runs.
intervalstringOptional—Viewer services: drip interval in minutes.
commentsstringOptional—Chatbot 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": 12345
}
400Error — channel not found
JSON
{
  "error": "wrongChannel"
}
400Error — not enough balance
JSON
{
  "error": "noBalance"
}
GET/api/getOrders

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idsstringOptional—Comma-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,
    "interval": 50,
    "pause": false,
    "online": true,
    "activeThreads": 100,
    "completed": false,
    "orderTime": 1794022254843,
    "endTime": 1794026088675,
    …
  },
  "12346": {
    "id": 12346,
    "service": "twitchChatBotsViewers",
    "channel": "username2",
    "amount": 50,
    "interval": 500,
    "pause": true,
    "online": false,
    "activeThreads": 0,
    "completed": false,
    "orderTime": 1794011254843,
    "endTime": null,
    …
  }
}
GET/api/getOrdersPage

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

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
startnumberOptional—First row index (0-based).
endnumberOptional—Last row index.
totalbooleanOptional—Include the total row count.
sortKeystringOptional—Column to sort by, e.g. orderTime.
sortDirectionstringOptional—"asc" or "desc".
searchValuestringOptional—Free-text filter.
serviceTypestringOptional—Filter by service type.
idsstringOptional—Comma-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,
      "pause": false,
      "online": true,
      "completed": false,
      "orderTime": 1794022254843,
      …
    }
  ],
  "total": 42
}
GET/api/pauseOrder

Pauses delivery on an active order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idstringRequired—Order ID.
Example request
cURL
curl "https://stream-rise.com/api/pauseOrder?key=YOUR_API_KEY&id=12345"
Response
200Success
HTTP
OK
403Error — not your order or unknown ID
HTTP
Forbidden
GET/api/resumeOrder

Resumes a paused order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idstringRequired—Order ID.
Example request
cURL
curl "https://stream-rise.com/api/resumeOrder?key=YOUR_API_KEY&id=12345"
Response
200Success
HTTP
OK
403Error — not your order or unknown ID
HTTP
Forbidden
404Error — order already completed
HTTP
Not Found
GET/api/deleteOrder

Permanently removes an order.

Request
Query parameters
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idstringRequired—Order ID.
Example request
cURL
curl "https://stream-rise.com/api/deleteOrder?key=YOUR_API_KEY&id=12345"
Response
200Success
HTTP
OK
403Error — not your order or unknown ID
HTTP
Forbidden
404Error — order already completed
HTTP
Not Found
POST/api/calculateUpgradePrice

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

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idstringRequired—Order ID.
orderobjectRequired—New 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,
  "fieldCosts": {
    "amount": 6.05
  }
}
404Error — not your order or unknown ID
HTTP
Not Found
POST/api/upgradeOrder

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

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idstringRequired—Order ID.
orderobjectRequired—New 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
OK
400Error — not enough balance
JSON
{
  "type": "not_enough_money",
  "action": "notification",
  "message": "not_enough_money"
}
400Error — nothing to upgrade
JSON
{
  "error": "no changes"
}
POST/api/changeOrder

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

Request
Body
FieldTypeRequiredDefaultDescription
keystringRequired—Your API key.
idstringRequired—Order ID.
orderobjectRequired—Properties 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
OK
400Error — field validation
JSON
{
  "error": {
    "channel": "wrongChannel"
  }
}
403Error — order already completed
JSON
{
  "error": "orderCompleted"
}

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 wss://stream-rise.com, send your API key as the first message, then subscribe to the ordersUpdates thread. When a new order is created you get its full snapshot at once; after that, changed fields arrive as deltas, collected and sent every 250 ms. Only the fields your key is allowed to read are sent. Sockets per key are limited: by default you can keep 25 sockets open at once (partner limits are set per key), and an open Streamrise panel tab counts as one of them. The feed covers all your orders — to follow one order, filter by its id on your side. Send an unsubscribe message for ordersUpdates to stop the feed.

Messages you send
Message fields
FieldTypeRequiredDefaultDescription
keystringRequired—Message 1, right after connecting: a JSON object with your API key in "key". A valid key gets the "auth" reply. A wrong key gets no reply: messages sent while the key is being checked are dropped, later messages get "no auth", and a new message with "key" starts the check again.
eventstringRequired—Message 2 and later, after the "auth" reply: "subscribe" to start the feed or "unsubscribe" to stop it.
threadstringRequired—Sent together with "event". Use "ordersUpdates" — the feed of all your orders.
Code samples
# wscat (npm i -g wscat). Lines with > are what you send, lines with < are server replies.
wscat -c wss://stream-rise.com
< {"event":"socketClientId","socketClientId":13}
> {"key": "YOUR_API_KEY"}
< {"event":"auth","message":"Authenticated","socketsLeft":24}
> {"event": "subscribe", "thread": "ordersUpdates"}
< {"event":"subscribe","message":"subscribed to ordersUpdates"}
< {"event":"threadMessage","thread":"ordersUpdates","message":{"orders":{"12345":{"activeThreads":87,"online":true}}}}
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 } }
  }
  if (msg.event === 'too many' || msg.event === 'no auth' || msg.event === 'error') {
    console.error(msg); // too many sockets / wrong key / rejected command
  }
});
ws.on('close', (code) => console.log('closed', code)); // reconnect here
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 } }
            if msg.get("event") in ("too many", "no auth", "error"):
                print("error:", msg)  # too many sockets / wrong key / rejected command

asyncio.run(main())
Messages from the server
WSOn connect
JSON
{
  "event": "socketClientId",
  "socketClientId": 13
}
WSAfter a valid key
JSON
{
  "event": "auth",
  "message": "Authenticated",
  "socketsLeft": 24
}
WSSubscribe acknowledged
JSON
{
  "event": "subscribe",
  "message": "subscribed to ordersUpdates"
}
WSNew order — full snapshot, sent at once (shortened)
JSON
{
  "event": "threadMessage",
  "thread": "ordersUpdates",
  "message": {
    "orders": {
      "12345": {
        "id": 12345,
        "channel": "username",
        "service": "twitchViewers",
        "amount": 100,
        "activeThreads": 0,
        "online": false,
        "pause": false,
        "completed": false,
        "price": "1.5"
      }
    }
  }
}
WSChanged fields only — sent every 250 ms, several orders per message
JSON
{
  "event": "threadMessage",
  "thread": "ordersUpdates",
  "message": {
    "orders": {
      "12345": {
        "activeThreads": 87,
        "online": true
      },
      "12346": {
        "pause": true
      }
    }
  }
}
WSUnsubscribe acknowledged
JSON
{
  "event": "unsubscribe",
  "message": "unsubscribed from ordersUpdates"
}
WSCommand before a valid key
JSON
{
  "event": "no auth",
  "message": "you should authenticate to use socket, send your key in key property"
}
WSToo many sockets for this key — the socket is closed
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.