Test your stream and integrate with our API
Get your API key from the dashboard after adding a "Self Hosted" destination
GET /api/public/stream/status
Returns the current live/offline status of your stream, HLS playback URL, and bandwidth usage information.
Provide your API key using one of these methods (in order of preference):
X-API-Key: YOUR_API_KEY
Authorization: Bearer YOUR_API_KEY
?apiKey=YOUR_API_KEY or ?key=YOUR_API_KEY
60 requests per minute per API key. Exceeding this limit will return a 429 Too Many Requests error.
{
"isLive": true,
"hlsUrl": "https://simulcast.me/hls/abc123/index.m3u8?apiKey=...",
"streamKeyLabel": "My Gaming Stream",
"startedAt": 1234567890,
"playbackToken": "abc123...",
"bandwidth": {
"usedGB": "2.45",
"limitGB": 10,
"remainingGB": "7.55",
"overageGB": "0.00",
"overageSats": 0,
"hourStart": 1234560000
}
}
{
"isLive": false,
"hlsUrl": null,
"streamKeyLabel": "My Gaming Stream",
"startedAt": null,
"playbackToken": null,
"bandwidth": {
"usedGB": "0.00",
"limitGB": 10,
"remainingGB": "10.00",
"overageGB": "0.00",
"overageSats": 0,
"hourStart": 1234560000
}
}
isLive (boolean) - Whether the stream is currently livehlsUrl (string|null) - HLS playback URL (includes API key in query string)streamKeyLabel (string) - Your stream key's label/namestartedAt (number|null) - Unix timestamp when stream startedplaybackToken (string|null) - Secure token for HLS preview (not needed for API)bandwidth (object) - Bandwidth usage information for current hourusedGB - GB used this hourlimitGB - Free tier limit (10 GB/hour)remainingGB - GB remaining in free tieroverageGB - GB over limit (charged at 5 sats/GB)overageSats - Sats charged for overage this hour{
"error": "Invalid API key or destination disabled"
}
{
"error": "Rate limit exceeded. Maximum 60 requests per minute.",
"retryAfter": 30
}
{
"error": "API key required. Provide via X-API-Key header, Authorization: Bearer header, or ?apiKey= query parameter."
}
curl -H "X-API-Key: YOUR_API_KEY" \
https://simulcast.me/api/public/stream/status
curl "https://simulcast.me/api/public/stream/status?apiKey=YOUR_API_KEY"
const API_KEY = 'YOUR_API_KEY';
const API_URL = 'https://simulcast.me/api/public/stream/status';
async function checkStream() {
try {
const response = await fetch(API_URL, {
headers: { 'X-API-Key': API_KEY }
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const data = await response.json();
if (data.isLive) {
console.log('Stream is LIVE:', data.hlsUrl);
// Use data.hlsUrl in your video player
} else {
console.log('Stream is OFFLINE');
}
} catch (error) {
console.error('Error:', error);
}
}
// Check every 5 seconds
checkStream();
setInterval(checkStream, 5000);
import requests
API_KEY = "YOUR_API_KEY"
API_URL = "https://simulcast.me/api/public/stream/status"
# Using header (recommended)
response = requests.get(
API_URL,
headers={"X-API-Key": API_KEY}
)
if response.status_code == 200:
data = response.json()
if data["isLive"]:
print(f"Stream is LIVE: {data['hlsUrl']}")
print(f"Bandwidth: {data['bandwidth']['usedGB']} GB used")
else:
print("Stream is OFFLINE")
else:
print(f"Error: {response.status_code} - {response.text}")
const API_KEY = 'YOUR_API_KEY';
const API_URL = 'https://simulcast.me/api/public/stream/status';
// Using fetch
async function checkStream() {
try {
const response = await fetch(API_URL, {
headers: { 'X-API-Key': API_KEY }
});
const data = await response.json();
if (data.isLive) {
console.log('Stream is LIVE:', data.hlsUrl);
} else {
console.log('Stream is OFFLINE');
}
} catch (error) {
console.error('Error:', error);
}
}
// Or using axios
const axios = require('axios');
axios.get(API_URL, {
headers: { 'X-API-Key': API_KEY }
})
.then(response => {
const data = response.data;
if (data.isLive) {
console.log('Stream is LIVE:', data.hlsUrl);
}
})
.catch(error => console.error('Error:', error));
<!DOCTYPE html>
<html>
<head>
<title>My Stream</title>
<script src="https://vjs.zencdn.net/8.6.1/video.min.js"></script>
<link href="https://vjs.zencdn.net/8.6.1/video-js.css" rel="stylesheet">
</head>
<body>
<div id="status">Loading...</div>
<video id="video" class="video-js" controls style="display:none;"></video>
<script>
const API_KEY = 'YOUR_API_KEY';
const API_URL = 'https://simulcast.me/api/public/stream/status';
async function checkStream() {
const response = await fetch(API_URL, {
headers: { 'X-API-Key': API_KEY }
});
const data = await response.json();
const statusDiv = document.getElementById('status');
const video = document.getElementById('video');
if (data.isLive) {
statusDiv.textContent = `๐ด LIVE: ${data.streamKeyLabel}`;
videojs('video').src({
type: 'application/x-mpegURL',
src: data.hlsUrl
});
video.style.display = 'block';
} else {
statusDiv.textContent = 'โซ OFFLINE';
video.style.display = 'none';
}
}
checkStream();
setInterval(checkStream, 5000);
</script>
</body>
</html>
You can play your HLS stream directly in VLC Media Player using the HLS URL from the API response.
Ctrl+N / Cmd+N)data.hlsUrl)vlc "https://simulcast.me/hls/YOUR_TOKEN/index.m3u8?apiKey=YOUR_API_KEY"
A WordPress plugin to easily embed your self-hosted Simulcast.me livestream using the API and HLS player.
To accept tips, simply install and activate WooCommerce. The plugin will automatically create a hidden "Stream Tip" product for you. Users can click "Support the Stream" on the player, select an amount, and checkout via your existing WooCommerce payment gateways.
Bitcoin Payment Options: To accept Bitcoin tips via Lightning Network, you can install one of these payment plugins:
/wp-content/plugins/ directoryEmbed the player on any page or post using the shortcode:
[simulcast_player]
If you use 12 GB in one hour, you'll be charged:
โข 3 sats/min for streaming (if not first destination)
โข 2 GB ร 5 sats/GB = 10 sats for bandwidth overage
Total: 3 sats/min + 10 sats/hour overage