Feed Reader
Feed reading for monitoring agents. RSS and Atom remain the web's most reliable change-notification layer — blogs, news sites, release pages, status pages, podcasts and forums all publish them — but real-world feeds are a mess of formats, encodings and broken dates. This tool fetches a feed URL (SSRF-guarded), parses RSS 2.0, RSS 1.0/RDF and Atom including Dublin Core extensions, and returns uniform JSON items: whitespace-normalized title, resolved link, publication date converted to ISO-8601, summary stripped to plain text and capped at 1000 characters, author and categories. Given an HTML page instead of a feed, it reads the page's advertised alternate links and follows the first RSS/Atom one automatically — so agents can monitor 'that blog' without knowing its feed URL. Up to 50 items per call. Pair with structured-extract to find all of a site's feeds, and call on a schedule to turn any site into an event source.
Call with x402
1. Send the request. 2. Receive 402 with accepts[]. 3. Sign the payment and retry with the X-PAYMENT header.
curl -X POST https://agentbit.app/v1/web/feed \
-H 'Content-Type: application/json' \
-d '{"url":"https://blog.cloudflare.com/rss/","limit":5}'
Input schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Feed URL, or an HTML page URL to auto-discover the feed from"
},
"limit": {
"type": "integer",
"description": "Max items to return (1-50, default 20)"
}
},
"required": [
"url"
]
}Output schema
{
"type": "object",
"properties": {
"feed_url": {
"type": "string"
},
"discovered_from": {
"type": [
"string",
"null"
]
},
"feed_title": {
"type": [
"string",
"null"
]
},
"format": {
"type": "string",
"enum": [
"rss",
"atom"
]
},
"item_count": {
"type": "integer"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"link": {
"type": [
"string",
"null"
]
},
"published": {
"type": [
"string",
"null"
]
},
"summary": {
"type": [
"string",
"null"
]
},
"author": {
"type": [
"string",
"null"
]
},
"categories": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}Code examples
// JavaScript (x402-fetch)
import { wrapFetchWithPayment } from "x402-fetch";
const fetchWithPay = wrapFetchWithPayment(fetch, wallet);
const r = await fetchWithPay("https://agentbit.app/v1/web/feed", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({"url":"https://blog.cloudflare.com/rss/","limit":5})
});
console.log(await r.json());
# Python (x402 client)
from x402.clients.requests import x402_requests
s = x402_requests(account)
r = s.post("https://agentbit.app/v1/web/feed",
json={"url":"https://blog.cloudflare.com/rss/","limit":5})
print(r.json())
// PHP
$r = Http::withHeaders(['X-PAYMENT' => $signedPayment])
->post('https://agentbit.app/v1/web/feed',
array (
'url' => 'https://blog.cloudflare.com/rss/',
'limit' => 5,
));
$data = $r->json();