Create an RSS feed
Some sites simply never published a feed — a static portfolio, a government notices page, a small news outlet running on a hand-built CMS — and no amount of discovery will find what was never made.
Run it online
Run this on our servers with your account. Free tools run in your browser; this one bills your KIT balance per the price above.
This endpoint goes the other direction: point it at a single page and tell it which repeating element marks each entry, and it builds a real, valid RSS feed out of that page's own items.
When there's nothing to discover
A feed reader, a monitoring tool or an automation pipeline built around RSS assumes every source has one, but plenty of legitimate publishers never adopted the format: a municipal announcements page, a university department's news section, a small e-commerce blog on a platform that never bothered to add feed support. For those sites the answer isn't finding a hidden feed, because there isn't one — it's constructing one from the pages that already exist.
What the endpoint needs and what it builds
POST a single page URL to /web/make-rss along with a CSS selector for the element that repeats for each entry, and a task_id comes back while the page is loaded, up to fifty matching items are read, and for each one a title, a link and a short description are pulled and assembled into a single valid RSS document with proper item entries. Optional selectors let you point at the exact title and description inside each item. The finished feed follows the RSS spec closely enough that standard readers and parsers, including our own RSS to JSON endpoint, consume it without special-casing. It arrives by webhook or a signed link valid for 24 hours.
A feed is just a contract, and this fulfills it
RSS succeeded originally because it's a small, unambitious format: a channel with a title and description, and a list of items each with a title, a link and a short description. That simplicity is exactly why it's possible to synthesize one from an ordinary page's markup — there's no proprietary metadata to reverse-engineer, just the handful of fields every reader expects. The generated feed behaves like any other feed to the tools that consume it, because structurally it is one.
Fitting a made feed into automation
Once a feed exists for a site that never had one, it plugs into anything built around feeds: monitoring tools that poll for changes, aggregators that need a consistent format across dozens of sources, or a personal reading setup that just wants everything in one reader. Pricing is a base fee per request plus a per-URL charge, and each run reads a single page, so the cost is the same predictable amount every time rather than a flat rate priced for the largest job. If a page can't be read the run isn't charged, so a request that comes back empty never inflates the bill.
What you can do with it
Feed for a site with no RSS support
Build a working feed from a municipal or university announcements page so it can be monitored the same way as any modern blog.
Reviving an abandoned or platform-limited blog
Generate a feed for a small business blog running on a platform that never added native RSS output.
Consistent aggregation across mixed sources
Create feeds for the handful of sources in a news aggregator that lack native RSS, so every source can be polled the same way.
Personal reading list automation
Turn a feed-less site's listing page into a feed, then follow its updates from a single reader app alongside everything else.
FAQ
How do I create an RSS feed from a website with the API?
POST a single page URL to /web/make-rss with a CSS selector for the element that repeats for each entry, keep the returned task_id, and collect the generated RSS document by webhook or a signed link valid for 24 hours.
Is the create RSS API free?
No, there is no free tier or trial; it costs $0.040 per request plus $0.001 per URL submitted, and a failed generation is never charged.
What if the site already has a feed?
Use the RSS discovery endpoint first — it's cheaper and faster to find an existing feed than to build one that would duplicate it.
How many items can one feed have?
Up to fifty — the endpoint reads the first fifty elements that match your selector on the page. To follow more than one page, run a request for each.
Will the generated feed work in standard RSS readers?
Yes, it follows the RSS specification closely enough that standard readers and parsers consume it without any special handling.
What data does each feed item include?
A title, a link and a short description, taken from each matching element on the page and assembled into standard item entries. Optional selectors let you say exactly which part of the element becomes the title or the description.
Can I regenerate the feed later to pick up new entries?
Yes, run the same request again whenever the page changes and the feed is rebuilt from whatever it shows at that moment.
Is the source page content stored after the feed is built?
No, fetched pages and generated feeds are deleted after the retention window and are never used for training.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/web/make-rss \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","item_selector":"article"}'const res = await fetch("https://api.kit.forhosting.com/web/make-rss", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"url": "https://example.com",
"item_selector": "article"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/make-rss",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"url": "https://example.com",
"item_selector": "article"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/make-rss", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"url":"https://example.com","item_selector":"article"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"url":"https://example.com","item_selector":"article"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/make-rss", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"url": "https://example.com",
"item_selector": "article"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.make_rss",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
timeout_sec | 30 |
max_crawl_pages | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
422 | task_failed | The task failed after 3 retries. You are never charged for it. |