Multi-Source News
35 APIs and 183 operations your agent can buy one call at a time. $0.01–$0.05 per call in USDC on base via x402. No API key, no account, no subscription.
The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.
Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
The payTo wallet does not resolve to a registered ERC-8004 agent. That is not a verdict on the service — most of the catalog is unregistered.
Live 402 challenge
Captured by the enrichment pass, not read just now. Prices can change — always read the 402 the endpoint answers with.
{
"error": "payment required",
"accepts": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x54ebFCF3870439B9db62381848c5DabC05c70d5B",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
],
"resource": {
"url": "https://x402.professorsausages.com/news/crypto",
"tags": [
"news",
"headlines",
"search",
"sentiment",
"gdelt"
],
"mimeType": "application/json",
"description": "Top Crypto/NFT News — HIGH-SIGNAL only: hacks/exploits, launches & mainnets, NFT drops/mints, regulation/ETF/legislation, the majors, funding/partnerships; price-prediction/TA chatter and shilling filtered out. Newest first, `since` to poll, `limit` to page; no search.",
"serviceName": "Multi-Source News"
},
"extensions": {
"help": {
"docs": "https://x402.professorsausages.com/news",
"sample": "https://x402.professorsausages.com/news/sample",
"example": "https://x402.professorsausages.com/news/crypto",
"openapi": "https://x402.professorsausages.com/news/openapi.json"
},
"bazaar": {
"info": {
"input": {
"type": "http",
"method": "GET",
"queryParams": {
"limit": "How many articles to return.",
"since": "Only articles ingested (seen_at) after this point: an ISO date-time, or the next_cursor from your previous answer."
}
},
"output": {
"type": "object",
"required": [
"topic",
"brand",
"curated",
"updated_at",
"window_hours",
"total",
"count",
"articles",
"freshness",
"new_count",
"next_cursor",
"polled_at",
"poll"
],
"properties": {
"note": {
"type": "string"
},
"poll": {
"type": "object",
"required": [
"next_cursor",
"suggested_interval_seconds",
"updated_at"
],
"properties": {
"note": {
"type": "string",
"description": "How this page relates to your `since` (ingest-order walk, whether more remain)."
},
"updated_at": {
"type": "string",
"description": "The corpus refresh this answer was served from."
},
"next_cursor": {
"type": [
"string",
"null"
],
"description": "Opaque cursor (prefix `nc1.`) marking the newest article this answer could see — pass as `since` next time. Null only on an empty corpus."
},
"suggested_interval_seconds": {
"type": "integer",
"description": "How often to poll (900: the corpus refreshes every 15 minutes)."
}
}
},
"brand": {
"type": "string",
"description": "Human feed name, e.g. \"AI News\"."
},
"count": {
"type": "integer",
"description": "Articles returned (≤ limit)."
},
"since": {
"type": [
"string",
"null"
],
"description": "The `since` bound echoed back (ISO instant or cursor), or null when omitted."
},
"topic": {
"type": "string",
"description": "The fixed category this feed serves, e.g. ai or crypto."
},
"total": {
"type": "integer",
"description": "Articles available after curation, before `limit` (with `since`: the new ones)."
},
"filter": {
"type": "object",
"properties": {
"kept": {
"type": "integer",
"description": "High-signal articles after filtering + dedup, before `limit` (equals `total`)."
},
"profile": {
"type": "string"
},
"in_category": {
"type": "integer",
"description": "Articles in the raw category (after `since`) before signal filtering."
}
},
"description": "Present only on curated feeds: the profile applied and how many of the category's articles survived."
},
"curated": {
"type": "boolean",
"description": "True when a high-signal relevance filter was applied (AI News)."
},
"articles": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url",
"domain",
"source",
"feed",
"published",
"categories",
"seen_at"
],
"properties": {
"id": {
"type": "string",
"description": "sha1(normalized url) hex, first 16 chars — the dedupe key."
},
"url": {
"type": "string"
},
"feed": {
"type": "string",
"description": "Human feed label, e.g. \"BBC World\", \"Hacker News\", \"GDELT 15-min files\"."
},
"lang": {
"type": [
"string",
"null"
],
"description": "ISO-639-1 language, best-effort."
},
"tier": {
"enum": [
"official",
"major",
"trade",
"social",
"enrichment",
null
],
"type": [
"string",
"null"
],
"description": "Reputability tier of the feed: official (primary sources — government/central-bank/agency press and first-party lab/vendor newsrooms), major (wires + major outlets), trade (quality trade press), social (Hacker News), enrichment (GDELT-discovered, reputation-gated). Absent on records archived before the tiered portfolio."
},
"tone": {
"type": [
"number",
"null"
],
"description": "Sentiment on GDELT's scale (negative = adverse, roughly −10..+10). READ tone_method: gdelt = whole-document tone attached by URL match; lexicon = our local headline+summary lexicon. null when neither could score it."
},
"image": {
"type": [
"string",
"null"
],
"description": "Lead image URL from the feed (media:content/thumbnail/enclosure/news image). null when absent."
},
"title": {
"type": "string"
},
"author": {
"type": [
"string",
"null"
],
"description": "Byline as the feed states it (dc:creator/author; `hn:<user>` for Hacker News). null when absent."
},
"domain": {
"type": "string"
},
"source": {
"enum": [
"gdelt",
"hn",
"rss",
"gnews",
"sitemap"
],
"type": "string"
},
"cluster": {
"type": [
"string",
"null"
],
"description": "Story-cluster id — articles sharing one are the SAME story from different outlets. The served window already keeps only one article per cluster, so this is provenance, not a filter you must apply. null when the headline was too short to cluster safely."
},
"country": {
"type": [
"string",
"null"
]
},
"seen_at": {
"type": "string"
},
"snippet": {
"type": [
"string",
"null"
],
"description": "Short plain-text description from the feed (≤240 chars); absent when the feed carries none. `summary` is the longer form."
},
"summary": {
"type": [
"string",
"null"
],
"description": "The feed's own description, plain text, ≤400 chars. null when the feed carries none."
},
"published": {
"type": "string",
"description": "ISO-8601 publish time (best-effort)."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "Categories from the feed's section, the publisher's URL path, and title/summary anchors — assigned at ingest (an article can carry several)."
},
"word_count": {
"type": [
"integer",
"null"
],
"description": "Article body word count: GDELT's GKG count when it saw the document, else a full-text feed body's count. null when only a teaser was available — never estimated."
},
"tone_method": {
"enum": [
"gdelt",
"lexicon",
null
],
"type": [
"string",
"null"
],
"description": "How `tone` was produced. gdelt: GDELT document tone (GKG V1.5TONE / events AvgTone) matched by canonical URL — whole-article, the strongest. lexicon: our local lexicon over title + summary — coarse, headline-scale; replaced by a GDELT tone the moment one arrives. null: no tone could be computed. Absent on records archived before 2026-09 (their tone, if any, is GDELT's)."
}
}
}
},
"freshness": {
"type": "object",
"required": [
"as_of",
"window_hours",
"source_count",
"coverage"
],
"properties": {
"as_of": {
"type": "string",
"description": "updated_at of the corpus this response was served from."
},
"coverage": {
"type": "object",
"required": [
"oldest_published",
"newest_published",
"hours",
"articles"
],
"properties": {
"why": {
"type": [
"string",
"null"
],
"description": "Present when thin: which filter was applied, how many articles matched, which portfolio feeds carry that category."
},
"thin": {
"type": "boolean",
"description": "Hot-window routes only: true when fewer than 5 articles matched your filter in the served window. The answer is still complete and paid — `why` says what was checked and where more lives (/news/search reaches the multi-day archive)."
},
"hours": {
"type": "number",
"description": "newest − oldest in hours — the searchable depth, usually below window_hours."
},
"articles": {
"type": "integer",
"description": "Articles covering that span."
},
"newest_published": {
"type": [
"string",
"null"
],
"description": "Newest publish time held."
},
"oldest_published": {
"type": [
"string",
"null"
],
"description": "Oldest publish time held; the real floor of any date filter."
}
}
},
"source_count": {
"type": "integer",
"description": "Number of ingestion sources (rss/sitemap/hn/gdelt/gnews) with ≥1 article in the current pile."
},
"window_hours": {
"type": "integer",
"description": "Retention POLICY in hours (72). NOT the searchable depth — see coverage.hours."
}
}
},
"new_count": {
"type": "integer",
"description": "Articles ingested after your `since` (all matches when `since` is absent), before `limit`."
},
"polled_at": {
"type": "string",
"description": "When this answer was computed (ISO-8601)."
},
"updated_at": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
],
"description": "Same value as poll.next_cursor — where the next poll resumes. Unchanged when new_count is 0."
},
"window_hours": {
"type": "integer"
}
}
}
},
"schema": {
"type": "object",
"required": [
"input"
],
"properties": {
"input": {
"type": "object"
},
"output": {
"type": "object"
}
}
},
"category": "news",
"routeTemplate": "https://x402.professorsausages.com/news/crypto"
},
"sample": {
"url": "https://x402.professorsausages.com/news/sample",
"hint": "A real cached response from this API (with its capture timestamp), free — judge the data quality before paying."
},
"catalog": {
"message": "This endpoint is 1 of 35 pay-per-call APIs for agents — all same x402 payment + auth. Browse the full menu free (no payment) at the catalog URL; every API serves a free real sample record at /<api>/sample.",
"strategy": "minimal",
"catalogUrl": "https://x402.professorsausages.com/?ref=402&v=minimal&from=news"
},
"suggest": {
"url": "https://x402.professorsausages.com/suggest",
"hint": "Missing data you'd pay for? POST {want, would_pay_usd} — free. The most-requested datasets get built first."
},
"discount": {
"off": "50%",
"hint": "Send X-Intent: <40+ chars describing what you're building and what data you need> for 50% off this call.",
"header": "X-Intent"
}
},
"x402Version": 2
}Accepts
The payment requirements as published to the catalog. Read the live 402 before paying — a price here is a claim, not a quote.
Pay 0.02 USDC on Base to 0x54eb…70d5B. The signed payment is good for 1 minute.
- Paid to
- 0x54eb…70d5B
- USD Coin contract
- 0x8335…02913
- Payment window
- 1 minute
- As published
- 20000 smallest units
The catalog’s raw entry
[
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x54ebFCF3870439B9db62381848c5DabC05c70d5B",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
]Extensions
{
"help": {
"docs": "https://x402.professorsausages.com/news",
"sample": "https://x402.professorsausages.com/news/sample",
"example": "https://x402.professorsausages.com/news/crypto",
"openapi": "https://x402.professorsausages.com/news/openapi.json"
},
"bazaar": {
"info": {
"input": {
"type": "http",
"method": "GET",
"queryParams": {
"limit": "How many articles to return.",
"since": "Only articles ingested (seen_at) after this point: an ISO date-time, or the next_cursor from your previous answer."
}
},
"output": {
"type": "object",
"required": [
"topic",
"brand",
"curated",
"updated_at",
"window_hours",
"total",
"count",
"articles",
"freshness",
"new_count",
"next_cursor",
"polled_at",
"poll"
],
"properties": {
"note": {
"type": "string"
},
"poll": {
"type": "object",
"required": [
"next_cursor",
"suggested_interval_seconds",
"updated_at"
],
"properties": {
"note": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
},
"suggested_interval_seconds": {
"type": "integer"
}
}
},
"brand": {
"type": "string"
},
"count": {
"type": "integer"
},
"since": {
"type": [
"string",
"null"
]
},
"topic": {
"type": "string"
},
"total": {
"type": "integer"
},
"filter": {
"type": "object",
"properties": {
"kept": {
"type": "integer"
},
"profile": {
"type": "string"
},
"in_category": {
"type": "integer"
}
}
},
"curated": {
"type": "boolean"
},
"articles": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url",
"domain",
"source",
"feed",
"published",
"categories",
"seen_at"
],
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"via": {
"type": [
"string",
"null"
]
},
"also": {
"type": "array",
"items": {
"type": "object",
"required": [
"domain",
"url"
],
"properties": {
"url": {
"type": "string"
},
"domain": {
"type": "string"
}
}
},
"maxItems": 3
},
"feed": {
"type": "string"
},
"lang": {
"type": [
"string",
"null"
]
},
"tier": {
"enum": [
"official",
"major",
"trade",
"social",
"enrichment",
null
],
"type": [
"string",
"null"
]
},
"tone": {
"type": [
"number",
"null"
]
},
"image": {
"type": [
"string",
"null"
]
},
"author": {
"type": [
"string",
"null"
]
},
"domain": {
"type": "string"
},
"source": {
"enum": [
"gdelt",
"hn",
"rss",
"gnews",
"sitemap"
],
"type": "string"
},
"cluster": {
"type": [
"string",
"null"
]
},
"country": {
"type": [
"string",
"null"
]
},
"seen_at": {
"type": "string"
},
"snippet": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
},
"published": {
"type": "string"
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
},
"cluster_id": {
"type": "string"
},
"word_count": {
"type": [
"integer",
"null"
]
},
"tone_method": {
"enum": [
"gdelt",
"lexicon",
null
],
"type": [
"string",
"null"
]
},
"cluster_size": {
"type": "integer",
"minimum": 1
},
"source_score": {
"type": "number",
"maximum": 1,
"minimum": 0
},
"tone_confidence": {
"enum": [
"high",
"medium",
"low",
null
],
"type": [
"string",
"null"
]
}
}
}
},
"freshness": {
"type": "object",
"required": [
"as_of",
"window_hours",
"source_count",
"coverage"
],
"properties": {
"as_of": {
"type": "string"
},
"coverage": {
"type": "object",
"required": [
"oldest_published",
"newest_published",
"hours",
"articles"
],
"properties": {
"why": {
"type": [
"string",
"null"
]
},
"thin": {
"type": "boolean"
},
"hours": {
"type": "number"
},
"articles": {
"type": "integer"
},
"newest_published": {
"type": [
"string",
"null"
]
},
"oldest_published": {
"type": [
"string",
"null"
]
}
}
},
"source_count": {
"type": "integer"
},
"window_hours": {
"type": "integer"
}
}
},
"new_count": {
"type": "integer"
},
"polled_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
},
"window_hours": {
"type": "integer"
}
}
}
},
"schema": {
"type": "object",
"required": [
"input"
],
"properties": {
"input": {
"type": "object"
},
"output": {
"type": "object"
}
}
},
"category": "news",
"routeTemplate": "https://x402.professorsausages.com/news/crypto"
}
}Provenance
- Seen in the source catalog
- 2026-09-24 00:01Z
- Last indexed by Roundhouse
- 2026-09-24 08:20Z
- Last enriched (probe, favicon, geo)
- 2026-09-20 02:45Z
- x402 version
- 2
- Max timeout
- 60s
- Liveness probe
- HTTP 402
Hand this page to an agent
Copy the prompt and paste it into Claude, an MCP client or your own agent — it will vet this service and call it over the free read API. No key, no account.
GET api.roundhouseai.io/v0/endpoints
This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 5 snapshots so far. Verified volume counts only settlements with an on-chain EIP-3009 marker.
Show the promptHide the prompt
Using Roundhouse, look up the x402 service Multi-Source News and tell me whether it is worth paying: what a call costs, whether the endpoint answered when last probed, and what its payment record actually shows. curl -s 'https://api.roundhouseai.io/v0/endpoints?q=Multi-Source%20News' curl -s 'https://api.roundhouseai.io/v0/merchants/<the payTo wallet returned above>' Then call it: read the price from the live 402 at https://x402.professorsausages.com/news/crypto, never from a cached figure, and pay with an x402 client. The /v0 API needs an API key (`authorization: Bearer rh_live_…`) on everything except /v0/unified* and /v0/endpoints. Mint a personal key for $0.01 at GET https://api.roundhouseai.io/v0/test/x402, or use an organization key from https://roundhouseai.io/dashboard/team. If you do not have Roundhouse tools or skills installed, read https://roundhouseai.io/skill.md first — it is the whole procedure.