# Feedsearch

> Find the RSS, Atom and JSON feeds a website publishes, with Feedsearch. Point it at a domain and get every feed the site has, each with its title, format, how often it posts and when it last did, so a workflow can subscribe to a blog, watch a release feed for new posts, or notice when one goes quiet. Duplicate addresses for the same feed are collapsed into one entry, and the feeds that belong to the site you asked about are not buried under the ones it merely links to. Export any set of sites as an OPML file to import into a feed reader. No account or API key required.

App · Feeds & Read-Later · 3 actions. Web page: https://docs.lodol.com/docs/integrations/feedsearch

## Actions

### Check a feed

Check that a feed address still works and see when it last published. This is the step for watching a blog, a release feed or a podcast: 'days since last post' is there to branch on, so a workflow can raise an alert when a feed goes quiet, and 'well formed' catches a feed that has just broken. An address that turns out to be a web page rather than a feed is not a failure: the step says so and lists the feeds that page links to, which is usually the address you meant. No account or API key required.

**Inputs**

- Feed address (`url`, text, required): The address of the feed to check, e.g. 'https://arstechnica.com/feed/'. If it turns out to be a web page rather than a feed, the step says so and lists the feeds it found there instead of failing.

**Outputs**

- `checked` (text): The address that was checked, with the scheme filled in if you left it off.
- `days_since_last_post` (number): How many days ago the newest item was published. This is the value to branch on to catch a blog that has gone quiet. Empty when the feed carries no dates.
- `description` (text): The feed's own one-line description. Empty when the feed does not carry one.
- `favicon` (text): The address of the site's icon. Empty when it has none.
- `feed_type` (text): The format as a plain value to branch on: 'rss', 'atom' or 'json'. This is the same set the Feed type field offers.
- `format` (text): The feed format, written out: 'RSS 2.0', 'Atom 1.0', 'JSON Feed 1.1'. Every reader handles all of them; this is for display.
- `found` (true/false): True when the address is a feed. False when it is a web page, or nothing Feedsearch recognises. Look at other_feeds for what it found instead.
- `is_podcast` (true/false): True when the feed carries podcast episodes rather than articles.
- `item_count` (number): How many items the feed held when it was last read.
- `last_post_at` (text): When the newest item in the feed was published, as a UTC timestamp. Empty when the feed carries no dates.
- `last_post_date` (text): The same day as YYYY-MM-DD, ready to drop into a date field or into this integration's 'Posted since' field. Empty when the feed carries no dates.
- `other_addresses` (list): Other addresses that serve this same feed. Feedsearch reports one feed several times over: with and without a secure scheme, with and without 'www', at its own address and at a syndication mirror. Those are collapsed into one entry, with the rest listed here.
- `other_feeds` (list): The other feeds found at that address. When the address turned out to be a web page rather than a feed, this is what it links to, so a wrong address answers with the right ones.
- `posts_per_day` (number): How often the feed publishes, as a mean number of posts a day. 0.14 is about one a week.
- `push_hubs` (list): The addresses a WebSub subscription would be sent to.
- `site_name` (text): The name of the website the feed belongs to, e.g. 'Ars Technica'.
- `site_url` (text): The address of the website the feed belongs to. For a feed published through a syndication service this is the site itself, not the service.
- `supports_push_updates` (true/false): True when the feed can push new items to a subscriber instead of waiting to be polled (WebSub).
- `title` (text): The feed's own title, e.g. 'Inside Rust Blog'.
- `url` (text): The feed's address. This is the one to subscribe to, paste into a reader, or fetch in a later step.
- `well_formed` (true/false): False when the feed is malformed. Most readers still cope, but a feed that has just broken usually shows up here first.

**Example output**

```json
{
  "checked": "https://arstechnica.com/feed/",
  "days_since_last_post": 3,
  "description": "All Ars Technica stories",
  "favicon": "https://cdn.arstechnica.net/favicon.ico",
  "feed_type": "rss",
  "format": "RSS 2.0",
  "found": true,
  "is_podcast": false,
  "item_count": 20,
  "last_post_at": "2026-09-10T22:16:05+00:00",
  "last_post_date": "2026-09-10",
  "other_addresses": [
    "http://feeds.arstechnica.com/arstechnica/index"
  ],
  "other_feeds": [],
  "posts_per_day": 15.69,
  "push_hubs": [],
  "site_name": "Ars Technica",
  "site_url": "https://arstechnica.com",
  "supports_push_updates": false,
  "title": "Ars Technica - All content",
  "url": "https://arstechnica.com/feed/",
  "well_formed": true
}
```

### Export feeds as OPML

Turn a list of websites into an OPML file, the format every feed reader imports. Give the sites you read and get one file with their feeds in it, filed under a folder per site, ready to hand to Feedly, Inoreader, NetNewsWire or anything else. Duplicate addresses for the same feed are collapsed, and two feeds from one site that share a title are labelled with their format so they can still be told apart in a reader's sidebar. A site that cannot be reached is reported on its own and the rest are still exported. No account or API key required.

**Inputs**

- Websites (`sites`, list, required): The websites to collect feeds from, one on each line. Use a list from an earlier step, such as a column of a spreadsheet, or paste the addresses in. Up to 10 at a time: a site Feedsearch has not seen recently is crawled live, which takes a few seconds each.
- Feed type (`feed_type`, text): Which kind of feed to keep. Leave it on 'Any feed' unless you need one in particular. One of: `any` (Any feed), `rss`, `atom`, `json` (JSON Feed), `podcast` (Podcasts). Default: `any`.
- Posted since (`updated_since`, date): Keep only feeds that have published something on or after this day. This is how you drop the abandoned ones: a big site often has category feeds that stopped years ago. Leave it empty to keep every feed, alive or not.
- Maximum feeds per site (`limit`, number): How many feeds to take from each site, most relevant first. Leave it empty for all of them; set it to 1 to put one feed per site in the file. From 1 to 200.

**Outputs**

- `failed_count` (number): How many could not be reached. Branch on this to catch a misspelled address before the file goes out.
- `feed_count` (number): How many feeds are in the file.
- `feeds` (list): Every feed that went into the file, so a later step can list them without reading the XML.
- `file_name` (text): A file name to save it under: feeds.opml. The extension is what makes a reader offer to import it.
- `opml` (text): The OPML file's contents. Write it to a file, attach it to an email, or upload it to a feed reader's import page.
- `site_count` (number): How many of the sites were read.
- `sites` (list): One entry per site you gave, in the same order.

**Example output**

```json
{
  "failed_count": 0,
  "feed_count": 2,
  "feeds": [
    {
      "days_since_last_post": 3,
      "description": "All Ars Technica stories",
      "favicon": "https://cdn.arstechnica.net/favicon.ico",
      "feed_type": "rss",
      "format": "RSS 2.0",
      "is_podcast": false,
      "item_count": 20,
      "last_post_at": "2026-09-10T22:16:05+00:00",
      "last_post_date": "2026-09-10",
      "other_addresses": [
        "http://feeds.arstechnica.com/arstechnica/index",
        "https://feeds.arstechnica.com/arstechnica/index"
      ],
      "posts_per_day": 15.69,
      "push_hubs": [],
      "same_site": true,
      "site_name": "Ars Technica",
      "site_url": "https://arstechnica.com",
      "supports_push_updates": false,
      "title": "Ars Technica - All content",
      "url": "https://arstechnica.com/feed/",
      "well_formed": true
    },
    {
      "days_since_last_post": 33,
      "description": "Long digressions on Apple, technology, design and more.",
      "favicon": "https://daringfireball.net/graphics/apple-touch-icon.png",
      "feed_type": "rss",
      "format": "RSS 2.0",
      "is_podcast": true,
      "item_count": 374,
      "last_post_at": "2026-08-11T19:04:00+00:00",
      "last_post_date": "2026-08-11",
      "other_addresses": [],
      "posts_per_day": 0.08,
      "push_hubs": [],
      "same_site": true,
      "site_name": "Daring Fireball",
      "site_url": "https://daringfireball.net",
      "supports_push_updates": false,
      "title": "The Talk Show With John Gruber",
      "url": "https://daringfireball.net/thetalkshow/rss",
      "well_formed": true
    }
  ],
  "file_name": "feeds.opml",
  "opml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<opml version=\"2.0\">\n  <head>\n    <title>Feeds from arstechnica.com</title>\n    <dateCreated>Thu, 10 Sep 2026 09:00:00 +0000</dateCreated>\n  </head>\n  <body>\n    <outline type=\"rss\" text=\"Ars Technica - All content\" title=\"Ars Technica - All content\" xmlUrl=\"https://arstechnica.com/feed/\" htmlUrl=\"https://arstechnica.com\" description=\"All Ars Technica stories\" version=\"RSS 2.0\"/>\n  </body>\n</opml>\n",
  "site_count": 2,
  "sites": [
    {
      "error": "",
      "feed_count": 1,
      "site": "https://arstechnica.com"
    },
    {
      "error": "",
      "feed_count": 1,
      "site": "https://daringfireball.net"
    }
  ]
}
```

### Find a website's feeds

Give a website and get the RSS, Atom and JSON feeds it publishes, best match first, with each feed's title, format, how often it posts and when it last did. Feedsearch reports the same feed several times over: with and without a secure scheme, with and without 'www', at the site's own address and at a syndication mirror. Those are collapsed into one entry per feed, with the other addresses listed beside it. Narrow the results to one format or to podcasts, drop the feeds that stopped publishing before a date you choose, or take just the top one. No account or API key required.

**Inputs**

- Website (`url`, text, required): The website to search. A domain on its own ('arstechnica.com') finds every feed the site is known to publish. A full address to one section ('arstechnica.com/science/') finds the feeds on that page. https:// is added for you if you leave it off.
- Feed type (`feed_type`, text): Which kind of feed to keep. Leave it on 'Any feed' unless you need one in particular. One of: `any` (Any feed), `rss`, `atom`, `json` (JSON Feed), `podcast` (Podcasts). Default: `any`.
- Posted since (`updated_since`, date): Keep only feeds that have published something on or after this day. This is how you drop the abandoned ones: a big site often has category feeds that stopped years ago. Leave it empty to keep every feed, alive or not.
- Maximum feeds (`limit`, number): How many feeds to keep, most relevant first. Leave it empty for all of them; set it to 1 when you just want the site's main feed. From 1 to 200.
- Use saved results only (`skip_crawl`, true/false): Answer instantly from what Feedsearch has already found, instead of visiting the site to look for anything new. Normally the site is crawled if it has not been looked at in the past week, which takes several seconds. Turn this on when the step runs over a long list and speed matters more than catching a feed added last Tuesday. Default: `false`.

**Outputs**

- `count` (number): How many feeds are in the list. Branch on this to catch a site that publishes none.
- `feeds` (list): The feeds that were found, most relevant first. Read feeds[0].url for the site's main feed.
- `site` (text): The address that was searched, with the scheme filled in if you left it off.
- `total_found` (number): How many distinct feeds were found before the feed type, date and maximum on this step narrowed them down.

**Example output**

```json
{
  "count": 1,
  "feeds": [
    {
      "days_since_last_post": 3,
      "description": "All Ars Technica stories",
      "favicon": "https://cdn.arstechnica.net/favicon.ico",
      "feed_type": "rss",
      "format": "RSS 2.0",
      "is_podcast": false,
      "item_count": 20,
      "last_post_at": "2026-09-10T22:16:05+00:00",
      "last_post_date": "2026-09-10",
      "other_addresses": [
        "http://feeds.arstechnica.com/arstechnica/index",
        "https://feeds.arstechnica.com/arstechnica/index"
      ],
      "posts_per_day": 15.69,
      "push_hubs": [],
      "same_site": true,
      "site_name": "Ars Technica",
      "site_url": "https://arstechnica.com",
      "supports_push_updates": false,
      "title": "Ars Technica - All content",
      "url": "https://arstechnica.com/feed/",
      "well_formed": true
    }
  ],
  "site": "https://arstechnica.com",
  "total_found": 27
}
```
