Skip to main content
Connect to wss://scrape.st/ws for bidirectional, real-time data streaming across all sources. WebSocket delivers full SourceEvent payloads for every tracked source.

Connection

import WebSocket from "ws";

const ws = new WebSocket("wss://scrape.st/ws", {
  headers: { "x-api-key": "YOUR_API_KEY" },
});

ws.on("open", () => console.log("Connected"));
ws.on("message", (raw) => {
  const event = JSON.parse(raw.toString());
  console.log(`[${event.source}] ${event.mid}`, event.payload);
});
ws.on("close", () => console.log("Disconnected"));
ws.on("error", (e) => console.error("Error:", e.message));

Query Parameters

Append to the WebSocket URL:
ParameterTypeDefaultDescription
useFastXbooleanfalseReceive fast-x push events (~50ms latency)
ignoreFullPayloadbooleanfalseSkip enriched x payloads, keep fast-x + others
wss://scrape.st/ws?useFastX=true&ignoreFullPayload=true

Event Flow

When useFastX=true, you receive two events per post:
  1. fast-x — Arrives ~50ms after posting. Contains basic post data (text, author, timestamp) before GraphQL enrichment.
  2. x — Arrives ~200-500ms after posting. Full ResolvedXPost with engagement counts, media, entities, quoted posts.
If you only need speed and don’t care about engagement metrics, set ignoreFullPayload=true to skip the second event.

Keepalive

The server pings idle connections every 30 seconds. Connections with no activity for 60 seconds are terminated. To keep your connection alive, respond to pings (automatic in most WebSocket libraries) or send a manual ping:
// Manual keepalive
setInterval(() => ws.ping(), 25000);

Reconnection

WebSocket does not auto-reconnect. Implement retry logic:
function connect() {
  const ws = new WebSocket("wss://scrape.st/ws", {
    headers: { "x-api-key": "YOUR_API_KEY" },
  });

  ws.on("close", () => {
    console.log("Reconnecting in 3s...");
    setTimeout(connect, 3000);
  });

  ws.on("message", (raw) => {
    const event = JSON.parse(raw.toString());
    // Process event
  });
}

connect();

Payload Shape

Every message is a SourceEvent:
{
  "mid": "1886493083207827456",
  "sid": "44196397",
  "source": "x",
  "timestamp": 1712072400000,
  "payload": {
    "id": "1886493083207827456",
    "text": "Bitcoin hits new ATH! 🚀",
    "author": { "id": "44196397", "screen_name": "elonmusk", ... },
    ...
  }
}
See source pages for full payload details: X · Telegram · Discord