curl --request POST \
--url https://scrapebadger.com/v1/twitter/stream/monitors \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "Tech Leaders Monitor",
"usernames": [
"elonmusk",
"sama"
],
"webhook_url": "https://example.com/webhooks/twitter",
"webhook_secret": "<string>",
"filter_types": []
}
'import requests
url = "https://scrapebadger.com/v1/twitter/stream/monitors"
payload = {
"name": "Tech Leaders Monitor",
"usernames": ["elonmusk", "sama"],
"webhook_url": "https://example.com/webhooks/twitter",
"webhook_secret": "<string>",
"filter_types": []
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Tech Leaders Monitor',
usernames: ['elonmusk', 'sama'],
webhook_url: 'https://example.com/webhooks/twitter',
webhook_secret: '<string>',
filter_types: []
})
};
fetch('https://scrapebadger.com/v1/twitter/stream/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/twitter/stream/monitors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Tech Leaders Monitor',
'usernames' => [
'elonmusk',
'sama'
],
'webhook_url' => 'https://example.com/webhooks/twitter',
'webhook_secret' => '<string>',
'filter_types' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/twitter/stream/monitors"
payload := strings.NewReader("{\n \"name\": \"Tech Leaders Monitor\",\n \"usernames\": [\n \"elonmusk\",\n \"sama\"\n ],\n \"webhook_url\": \"https://example.com/webhooks/twitter\",\n \"webhook_secret\": \"<string>\",\n \"filter_types\": []\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://scrapebadger.com/v1/twitter/stream/monitors")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Tech Leaders Monitor\",\n \"usernames\": [\n \"elonmusk\",\n \"sama\"\n ],\n \"webhook_url\": \"https://example.com/webhooks/twitter\",\n \"webhook_secret\": \"<string>\",\n \"filter_types\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/twitter/stream/monitors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Tech Leaders Monitor\",\n \"usernames\": [\n \"elonmusk\",\n \"sama\"\n ],\n \"webhook_url\": \"https://example.com/webhooks/twitter\",\n \"webhook_secret\": \"<string>\",\n \"filter_types\": []\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "Tech Leaders Monitor",
"usernames": [
"elonmusk",
"sama"
],
"status": "active",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"status_reason": "<string>",
"webhook_url": "<string>",
"webhook_secret_set": true,
"filter_types": [
"original"
],
"credits_per_account_per_day": 123,
"estimated_credits_per_day": 123,
"pricing_tier": "Standard"
}{
"error": "Invalid or missing API key"
}{
"error": "Insufficient credits"
}{
"error": "Rate limit exceeded. Please retry after a short delay."
}Create Stream Monitor
Create a new stream monitor to track one or more Twitter accounts in real time. New tweets from monitored accounts are delivered via WebSocket and optionally via webhook. Each monitored account consumes credits per day based on volume pricing.
curl --request POST \
--url https://scrapebadger.com/v1/twitter/stream/monitors \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"name": "Tech Leaders Monitor",
"usernames": [
"elonmusk",
"sama"
],
"webhook_url": "https://example.com/webhooks/twitter",
"webhook_secret": "<string>",
"filter_types": []
}
'import requests
url = "https://scrapebadger.com/v1/twitter/stream/monitors"
payload = {
"name": "Tech Leaders Monitor",
"usernames": ["elonmusk", "sama"],
"webhook_url": "https://example.com/webhooks/twitter",
"webhook_secret": "<string>",
"filter_types": []
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Tech Leaders Monitor',
usernames: ['elonmusk', 'sama'],
webhook_url: 'https://example.com/webhooks/twitter',
webhook_secret: '<string>',
filter_types: []
})
};
fetch('https://scrapebadger.com/v1/twitter/stream/monitors', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrapebadger.com/v1/twitter/stream/monitors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Tech Leaders Monitor',
'usernames' => [
'elonmusk',
'sama'
],
'webhook_url' => 'https://example.com/webhooks/twitter',
'webhook_secret' => '<string>',
'filter_types' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://scrapebadger.com/v1/twitter/stream/monitors"
payload := strings.NewReader("{\n \"name\": \"Tech Leaders Monitor\",\n \"usernames\": [\n \"elonmusk\",\n \"sama\"\n ],\n \"webhook_url\": \"https://example.com/webhooks/twitter\",\n \"webhook_secret\": \"<string>\",\n \"filter_types\": []\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://scrapebadger.com/v1/twitter/stream/monitors")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Tech Leaders Monitor\",\n \"usernames\": [\n \"elonmusk\",\n \"sama\"\n ],\n \"webhook_url\": \"https://example.com/webhooks/twitter\",\n \"webhook_secret\": \"<string>\",\n \"filter_types\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://scrapebadger.com/v1/twitter/stream/monitors")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Tech Leaders Monitor\",\n \"usernames\": [\n \"elonmusk\",\n \"sama\"\n ],\n \"webhook_url\": \"https://example.com/webhooks/twitter\",\n \"webhook_secret\": \"<string>\",\n \"filter_types\": []\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "Tech Leaders Monitor",
"usernames": [
"elonmusk",
"sama"
],
"status": "active",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"status_reason": "<string>",
"webhook_url": "<string>",
"webhook_secret_set": true,
"filter_types": [
"original"
],
"credits_per_account_per_day": 123,
"estimated_credits_per_day": 123,
"pricing_tier": "Standard"
}{
"error": "Invalid or missing API key"
}{
"error": "Insufficient credits"
}{
"error": "Rate limit exceeded. Please retry after a short delay."
}Authorizations
Your ScrapeBadger API key. You can find this in your dashboard at https://scrapebadger.com/dashboard/api-keys.
Body
Stream monitor configuration.
Human-readable name for the stream monitor.
1 - 100"Tech Leaders Monitor"
List of Twitter usernames to monitor (without @ symbol).
1 - 100 elements["elonmusk", "sama"]
HTTPS URL to receive webhook deliveries. Must use HTTPS.
"https://example.com/webhooks/twitter"
Secret used to sign webhook payloads with HMAC-SHA256.
Filter which tweet types to deliver. Null or omitted means all types.
original, reply, retweet, quote Response
Stream monitor created successfully.
Stream monitor configuration and status.
Unique stream monitor identifier.
Human-readable name of the monitor.
"Tech Leaders Monitor"
List of monitored Twitter usernames.
["elonmusk", "sama"]
Current status of the monitor. Suspended indicates the monitor was auto-paused due to insufficient credits.
active, paused, suspended Timestamp when the monitor was created.
Timestamp when the monitor was last updated.
Reason for the current status, if applicable (e.g., "insufficient_credits").
HTTPS URL receiving webhook deliveries.
Whether a webhook secret is configured. The actual secret is never returned.
Tweet types being delivered. Null means all types.
original, reply, retweet, quote Credit cost per monitored account per day.
Estimated total credit cost per day based on current account count.
Current pricing tier label.
"Standard"

