RSS Watch is an RSS feed aggregation and history-tracking system that lets you view multiple RSS feeds in one place and track how content changes over time.
Main Features:
Base URL: https://tools.tornevall.net
All API endpoints are available at https://tools.tornevall.net/api/rss/
Get a list of all available RSS feeds.
Endpoint:
GET /api/rss/feed
Query Parameters:
protected (optional): Filter by access level
0 = public feeds only1 = protected feeds only2 = all feedsExample Request:
curl "https://tools.tornevall.net/api/rss/feed"
Example Response:
{
"urls": [
{
"urlid": 5,
"title": "Example Blog",
"utf8": 0,
"interval": 600,
"lastupdate": "2026-02-08 21:30:07",
"explicit": 0,
"entryCount": 1234
}
]
}
Retrieve feed entries in Atom XML format.
Endpoint:
GET /api/rss/feed/{feedId}
Path Parameters:
feedId - The feed ID from the feed listQuery Parameters:
limit (default: 30) - Number of entries to return (max 100)match (optional) - Comma-separated keywords to filter entriesas=json (optional) - Return JSON instead of Atom XMLhistory=1 (optional) - Include version historyExamples:
Get latest 50 entries:
curl "https://tools.tornevall.net/api/rss/feed/5?limit=50"
Filter by keywords:
curl "https://tools.tornevall.net/api/rss/feed/5?match=technology,innovation"
Get JSON instead of XML:
curl "https://tools.tornevall.net/api/rss/feed/5?as=json&limit=20"
Include history:
curl "https://tools.tornevall.net/api/rss/feed/5?history=1"
Response Format (Atom):
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Example Blog</title>
<updated>2026-02-08T21:30:07+00:00</updated>
<link rel="alternate" href="https://example.com"/>
<entry>
<title>Post Title</title>
<summary>Post description...</summary>
<published>2026-02-08T12:00:00+00:00</published>
<link href="https://example.com/post"/>
</entry>
</feed>
Response Format (JSON with as=json):
[
{
"title": "Post Title",
"description": "Post description...",
"link": "https://example.com/post",
"pubdate": 1739013600,
"inserted": "2026-02-08 14:30:29",
"content_hash": "abc123..."
}
]
Access the web-based feed viewer at https://tools.tornevall.net/feed
URL: /feed
Shows a list of all available feeds with:
Example:
https://tools.tornevall.net/feed
URL: /feed/{feedId}
View entries from a specific feed.
Query Parameters:
per_page (default: 10) - Entries per page (1-100)history (default: 1) - Enable/disable history tracking
0 = Off (show only latest version)1 = On (show all versions with diffs)history_limit (default: 10) - Max versions to show per entrypage - Page number for paginationExamples:
View feed with 25 entries per page:
https://tools.tornevall.net/feed/5?per_page=25
Disable history mode:
https://tools.tornevall.net/feed/5?history=0
Show up to 20 versions per entry:
https://tools.tornevall.net/feed/5?history=1&history_limit=20
URL: /feed/entry/{contentId}
View a single feed entry with full history.
Example:
https://tools.tornevall.net/feed/entry/881323
This shows:
URL: /feed/{feedId}/edited
Find posts that have been edited multiple times.
Query Parameters:
min_changes (default: 3) - Minimum number of editsper_page (default: 25) - Results per pageExample:
Find all posts edited 5 or more times:
https://tools.tornevall.net/feed/5/edited?min_changes=5
URL: /out/{contentId}
Redirects to the original post URL without revealing the referrer.
Example:
https://tools.tornevall.net/out/881323
This protects your privacy by not sending a referrer header to the external site.
RSS Watch tracks changes to feed entries over time. When a post is edited, the system saves a new version.
In the web viewer, history mode shows:
Enable history mode:
https://tools.tornevall.net/feed/5?history=1
Disable history mode:
https://tools.tornevall.net/feed/5?history=0
Filter feed entries by searching for specific keywords.
API Usage:
curl "https://tools.tornevall.net/api/rss/feed/5?match=technology,innovation"
This returns only entries containing at least one of the keywords.
How it works:
Some feeds may be restricted to specific domains. If you try to access a protected feed from an unauthorized domain, you'll receive a 403 error.
Error message:
{
"error": {
"code": 403,
"message": "Feed is protected by its hostname..."
}
}
Protected feeds are only accessible when requested from allowed domains.
The API has high rate limits:
For optimal performance:
limit values (don't request 1000 entries if you only need 10)match parameter to filter data server-side instead of client-sideFor large feeds, use pagination:
/feed/5?per_page=25&page=1 # First page
/feed/5?per_page=25&page=2 # Second page
// Fetch available feeds
fetch('https://tools.tornevall.net/api/rss/feed')
.then(r => r.json())
.then(data => {
data.urls.forEach(feed => {
console.log(feed.title, feed.entryCount);
});
});
// Get feed content
fetch('https://tools.tornevall.net/api/rss/feed/5?as=json&limit=20')
.then(r => r.json())
.then(entries => {
entries.forEach(entry => {
console.log(entry.title, entry.link);
});
});
Use history tracking to monitor when posts are edited:
# Find posts that have been edited 5+ times
curl "https://tools.tornevall.net/feed/5/edited?min_changes=5"
Get only entries about specific topics:
# Get technology-related posts
curl "https://tools.tornevall.net/api/rss/feed/5?match=tech,software,ai&limit=50"
<div id="feed"></div>
<script>
fetch('https://tools.tornevall.net/api/rss/feed/5?as=json&limit=10')
.then(r => r.json())
.then(entries => {
const html = entries.map(e => `
<article>
<h3><a href="${e.link}">${e.title}</a></h3>
<p>${e.description}</p>
<small>${new Date(e.pubdate * 1000).toLocaleDateString()}</small>
</article>
`).join('');
document.getElementById('feed').innerHTML = html;
});
</script>
Problem: Trying to access a feed that doesn't exist.
Solution: Check the feed list at /api/rss/feed for valid feed IDs.
Problem: Feed is protected and you're accessing from wrong domain.
Solution: Protected feeds can only be accessed from authorized domains. Contact the administrator if you need access.
Problem: Feed returns no entries.
Solution:
/api/rss/feed shows entryCountmatch parameter)Problem: Special characters appear garbled.
Solution: The API handles UTF-8 automatically. If you still see issues, ensure your client is interpreting responses as UTF-8.
For issues or questions:
https://tools.tornevall.net/feedLast Updated: 2026-02-09
API Version: 1.0