# RSS Feeds

Turn a blog, newsletter or changelog into posts. Add its RSS or Atom feed, pick the networks and a template, and every new item becomes a post. Octopost reads the feed for you: you never have to post new articles by hand.

You can manage feeds on the [Feeds page](https://octopost.ink/dashboard/feeds), over the REST API, or from an AI agent with the MCP tools `list_feeds`, `add_feed` and `remove_feed`.

## How it works

1. You add a feed address. A site address works too when its page links a feed.
2. Octopost reads it right away and posts only the **latest** item. Older items are remembered as seen, so adding a feed never floods your accounts.
3. After that Octopost checks the feed every 30 minutes (you can pick 15 minutes to 1 day). Each new item becomes a post.
4. An item is posted once. Octopost remembers every item it has seen, even if the feed edits it later.

## Wait for approval, or queue

Each feed has a mode:

| Mode | What happens to a new item |
|------|----------------------------|
| `hold` (default) | It waits for your approval. You get an email with Approve, Reject and Edit links, and it shows on the Posts page. See [Approvals](/docs/approvals). |
| `queue` | It joins your [post queue](/docs/queue) and goes out in your next queue slot. |

## Templates

The post text comes from a template. Use these placeholders:

| Placeholder | What it becomes |
|-------------|-----------------|
| `{title}` | The item's title |
| `{url}` | The item's link |
| `{excerpt}` | A plain-text summary of the item (no HTML) |

The default is `{title} {url}`. Another common one:

```
New on the blog: {title}

{excerpt}

{url}
```

If a post would be too long for one of its networks, Octopost shortens the excerpt first, then the title. The link is always kept whole.

## Limits and guardrails

- A feed makes at most **10 posts a day**. Items over the limit are posted on a later check.
- If a check finds more than 5 new items at once (for example, a feed that changed all its item ids), only the newest is posted.
- The same text to the same network within 7 days is skipped.
- A post with one of your [blocked terms](/docs/approvals) waits for approval even in `queue` mode.
- Up to 25 feeds per account.
- When a feed can't be read, Octopost waits longer between tries (up to a day). After 20 failed checks in a row the feed is paused; turn it back on from the Feeds page.

## REST API

All endpoints need your API key (`Authorization: Bearer op_...`).

### List feeds

```bash
curl https://octopost.ink/api/feeds -H "Authorization: Bearer op_..."
```

### Add a feed

```bash
curl -X POST https://octopost.ink/api/feeds \
  -H "Authorization: Bearer op_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://yourblog.com/feed",
    "platforms": ["twitter", "bluesky"],
    "template": "{title} {url}",
    "mode": "hold",
    "checkEveryMinutes": 30
  }'
```

| Field | Required | Description |
|-------|----------|-------------|
| `url` | yes | Feed address (or a site address that links its feed) |
| `platforms` | yes | Networks to post to: `twitter`, `bluesky`, `threads`, `linkedin`, `mastodon` |
| `template` | no | Post text with `{title}`, `{url}`, `{excerpt}`. Default `{title} {url}` |
| `mode` | no | `hold` (default) or `queue` |
| `name` | no | A name for the feed. Default: the feed's own title |
| `checkEveryMinutes` | no | 15 to 1440. Default 30 |

The response (201) has the `feed` and the result of the first `check`: the post made from the latest item (`posts`) and anything skipped (`skipped`, with a reason).

### Change, check or remove a feed

```bash
# Change mode, template, networks, interval, or pause it
curl -X PATCH https://octopost.ink/api/feeds/FEED_ID \
  -H "Authorization: Bearer op_..." -H "Content-Type: application/json" \
  -d '{"mode": "queue", "active": true}'

# Check it now (once a minute at most)
curl -X POST https://octopost.ink/api/feeds/FEED_ID/check -H "Authorization: Bearer op_..."

# See it with its 20 most recent items
curl https://octopost.ink/api/feeds/FEED_ID -H "Authorization: Bearer op_..."

# Remove it (posts it already made are kept)
curl -X DELETE https://octopost.ink/api/feeds/FEED_ID -H "Authorization: Bearer op_..."
```

## MCP tools

- **list_feeds**: your feeds with their networks, template, mode and last check
- **add_feed**: `url`, `platforms`, and optionally `template`, `mode`, `name`, `check_every_minutes`
- **remove_feed**: `feed_id`
