Onrender APInewsroomradar.onrender.com ↗
Access Newsroom Radar's video intelligence desk: live coverage, catch-up briefings, per-video transcripts, and monitored channel data for news organizations.
What is the Onrender API?
The Newsroom Radar API exposes 5 endpoints covering video intelligence from monitored YouTube news channels — including C-SPAN, Congress, White House, wire services, and competitor outlets. The list_videos endpoint returns paginated video records filterable by desk purpose and category label, while get_live_coverage surfaces currently live, upcoming, and recently ended streams in real time. Together these endpoints give structured access to a curated news-video monitoring desk.
curl -X GET 'https://api.parse.bot/scraper/49c1e2ba-47c1-4c76-bb2c-a478269daf1c/list_videos?sort=newest&purpose=editorial&category=C-SPAN' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace newsroomradar-onrender-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Newsroom Radar SDK — browse monitored videos, drill into detail."""
from parse_apis.newsroomradar_onrender_com_api import (
NewsroomRadar, VideoSort, Purpose, CatchUpWindow, VideoNotFound,
)
client = NewsroomRadar()
# List the newest editorial videos, capped at 5 total items.
for video in client.videos.list(sort=VideoSort.NEWEST, purpose=Purpose.EDITORIAL, limit=5):
print(video.title, video.source_name, video.published_at)
# Drill down: take one competition video and fetch its full detail.
hit = client.videos.list(purpose=Purpose.COMPETITION, limit=1).first()
if hit is not None:
try:
detail = client.videos.get(video_id=hit.id)
print(detail.title, detail.transcript, detail.analysis)
except VideoNotFound:
print("Video was removed from tracking")
# Catch-up briefing for the last 3 hours.
briefing = client.catch_ups.get(window=CatchUpWindow.H3)
print(briefing.label, briefing.start, briefing.end)
print("new:", briefing.counts.new_videos, "competition:", briefing.counts.competition_uploads)
for v in briefing.videos[:3]:
print(" ", v.title)
# Live coverage desk.
live = client.live_coverage.get()
print("live:", live.live_count, "upcoming:", live.upcoming_count, "ended:", live.ended_count)
# Monitored sources.
for source in client.sources.list(limit=5):
print(source.name, source.category, source.purpose, source.video_count)
print("exercised: videos.list / videos.get / catch_ups.get / live_coverage.get / sources.list")
Lists videos ingested from monitored channels, newest first by default, one row per video. Filter by purpose (editorial desk vs competition tracking), by category label (one of the labels returned in `categories`, e.g. C-SPAN; an unknown label returns an empty list), and by free-text title/channel search. Paginates with `limit` (1-250, larger values are clamped to 250) and `offset`; `total` is the site's count of matching videos and `has_more` tells whether a further offset page exists. Engagement metrics (view_count, views_per_hour, acceleration) are null whenever the site has not captured public metrics for a video, so the views/velocity/rising sorts only reorder rows that carry metrics.
| Param | Type | Description |
|---|---|---|
| sort | string | Ordering of the result stream. |
| limit | integer | Rows per page, 1-250; values above 250 are clamped. |
| query | string | Free-text search over video titles and channel names. Omitted = no text filter. |
| offset | integer | Zero-based row offset into the sorted result stream. |
| purpose | string | Which desk to read: editorial (monitored government, C-SPAN and wire channels) or competition (rival outlets). |
| category | string | Category label exactly as listed in the response's `categories` array (e.g. C-SPAN). All = no category filter. |
{
"type": "object",
"fields": {
"limit": "integer effective page size after clamping",
"total": "integer count of videos matching the filters on the site",
"offset": "integer offset echoed for this page",
"videos": "array of video records: id (YouTube video id, usable with get_video), title, url, thumbnail_url, published_at (ISO 8601 UTC), source_id/source_name/category/channel_url of the monitored channel, purpose, live_status, scheduled_start_at/actual_start_at/actual_end_at (ISO 8601 or null), was_live, view_count/like_count/comment_count/metrics_updated_at/views_gained/views_per_hour/acceleration (null when the site holds no metrics)",
"has_more": "boolean, true when offset + rows returned < total",
"categories": "array of category labels the site currently uses (valid values for the category filter)"
},
"sample": {
"data": {
"limit": 5,
"total": 16,
"offset": 0,
"videos": [
{
"id": "M2Ym4IigB6o",
"url": "https://www.youtube.com/watch?v=M2Ym4IigB6o",
"title": "Vance casts doubt on livestreamed execution",
"purpose": "editorial",
"category": "C-SPAN",
"was_live": false,
"source_id": 1,
"like_count": null,
"view_count": null,
"channel_url": "https://www.youtube.com/channel/UCb--64Gl51jIEVE-GLDAVTg",
"live_status": "none",
"source_name": "C-SPAN",
"acceleration": null,
"published_at": "2026-10-09T19:34:25+00:00",
"views_gained": null,
"actual_end_at": null,
"comment_count": null,
"thumbnail_url": "https://i2.ytimg.com/vi/M2Ym4IigB6o/hqdefault.jpg",
"views_per_hour": null,
"actual_start_at": null,
"metrics_updated_at": null,
"scheduled_start_at": null
}
],
"has_more": true,
"categories": [
"Congress",
"Republicans",
"Democrats",
"White House",
"Administration",
"C-SPAN",
"Wires",
"International"
]
},
"status": "success"
}
}About the Onrender API
Video Listings and Filtering
The list_videos endpoint returns video records newest-first with fields including id (YouTube video id), title, url, thumbnail_url, published_at, and source_id. Results can be filtered by purpose (either editorial for government and wire channels or competition for rival outlets), by category (using labels returned in the categories array of the same response — an unrecognized label returns an empty list), and by free-text query over titles and channel names. Pagination is controlled by limit (clamped to 250) and offset; the response includes has_more and total for cursor management.
Per-Video Detail and Live Desk
The get_video endpoint takes a single video_id (as emitted by list_videos) and returns the full record plus two site-generated fields: transcript (text or null) and analysis (object or null), both null in the common case where the site has not produced them. Additional fields include was_live, live_status, view_count, and category. Requesting a video id not tracked by the site returns a stale_input / input_not_found error. The get_live_coverage endpoint requires no parameters and returns four arrays — live, upcoming, ended, and official_upcoming — each containing video records with timing fields such as scheduled_start_at, actual_start_at, and actual_end_at.
Catch-Up Briefings and Source Registry
get_catch_up accepts an optional window parameter (trailing time window ending at call time) and returns a structured briefing: window bounds (from, to), a label, and a counts object with keys new_videos, priority_uploads, live_upcoming, competition_uploads, and fast_moving_competition. The videos array contains all records published in that window across both desks. list_sources requires no inputs and returns all monitored channels in a single response with fields per source: id, name, channel_id, channel_url, category, purpose, enabled, and video count. Source id values correspond to source_id in video records.
The Onrender API is a managed, monitored endpoint for newsroomradar.onrender.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when newsroomradar.onrender.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official newsroomradar.onrender.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor live and upcoming Congressional or White House streams using
get_live_coveragewithout manually checking YouTube - Build a newsroom catch-up dashboard that surfaces new government video uploads in a trailing time window via
get_catch_up - Track competitor outlet publishing velocity by filtering
list_videoswithpurpose=competition - Index transcripts and analyses for archived news videos retrieved via
get_video - Audit which YouTube channels are being monitored, their desk assignment, and ingestion health via
list_sources - Feed a search interface over news video titles and channel names using the
queryparameter inlist_videos - Alert on fast-moving competition activity by polling the
fast_moving_competitioncount inget_catch_upresponses
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Newsroom Radar have an official developer API?+
What does `get_video` return for transcripts and analysis?+
transcript and analysis fields are null in the common case — the site only populates them for a subset of videos it has processed. The endpoint always returns the core record fields (title, url, category, was_live, live_status, view_count, source_id) regardless of whether transcript or analysis data is available.How do I know which category labels are valid for filtering `list_videos`?+
list_videos response includes a categories array listing the labels currently in use by the site. Pass one of those exact strings as the category parameter. An unrecognized label returns an empty video list rather than an error, so always read categories from a live response rather than hardcoding values.Does the API expose video engagement metrics like likes, comments, or subscriber counts?+
view_count on individual video records via get_video, and even that is null when the site holds no metrics. Channel-level metrics and engagement data (likes, comments, subscribers) are not covered. You can fork this API on Parse and revise it to add an endpoint pulling those fields.Is there a way to retrieve the full history of videos beyond what the current monitored window covers?+
list_videos supports offset-based pagination up to the total count the site holds, but historical depth depends on the site's own ingestion retention. There is no dedicated endpoint for historical archives beyond paginating the existing list_videos result set. You can fork this API on Parse and revise it to add a date-range filter endpoint if deeper historical querying is needed.