Newsroom monitoring

Watch public channels and accounts and get new items at a webhook.

The job

Desks follow sources, not feeds. Point a monitor at a channel or search and your tool receives each new item as it appears.

Endpoints

EndpointReturnsCost
GET /v1/telegram/channel/postsTelegram public channel posts1 credit
GET /v1/bluesky/profile/postsBluesky profile posts1 credit
GET /v1/youtube/searchYouTube search1 credit
GET /v1/twitter/search/postsX post search1 credit
POST /v1/monitorsCreate a monitorFree

Failed requests and cached repeats cost 0 credits. Send max_age_days to accept a recent cached copy. See credits and caching.

Recipe

  1. List the public sources you follow.
  2. Create a monitor per source or search.
  3. Verify the signature on each delivery, then route it to the desk.
Preview
The API is in early access. Calls use api.socialscrape.io and return the shapes in the reference.
Python
import os
import requests

API = "https://api.socialscrape.io"
HEADERS = {"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]}


def get(path, **params):
    res = requests.get(API + path, headers=HEADERS, params=params, timeout=60)
    res.raise_for_status()
    return res.json()["data"]

# Telegram public channel posts
posts = get("/v1/telegram/channel/posts", handle="telegram")
# YouTube search
fresh = get("/v1/youtube/search", query="breaking news", type="video", upload_date="hour", sort="latest")

for p in posts["items"][:5]:
    print(p["published_at"], p["url"])
for v in fresh["items"][:5]:
    print(v["url"])
TypeScript
const API = "https://api.socialscrape.io";
const headers = { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! };

async function get(path: string, params: Record<string, string | number | boolean>) {
  const query = new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)]));
  const res = await fetch(`${API}${path}?${query}`, { headers });
  if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
  return (await res.json()).data;
}

// Telegram public channel posts
const posts = await get("/v1/telegram/channel/posts", { handle: "telegram" });
// YouTube search
const fresh = await get("/v1/youtube/search", { query: "breaking news", type: "video", upload_date: "hour", sort: "latest" });

for (const p of posts.items.slice(0, 5)) console.log(p.published_at, p.url);
for (const v of fresh.items.slice(0, 5)) console.log(v.url);

Good to know

Telegram returns public web-preview pages only. Verification of what you find stays your job.

Questions

How often does a monitor check?
You choose the interval. The limits are in the monitors guide.

Build on social data early.

Developers and agent builders get the first keys.

Get early access