---
title: "Connect an RSS feed"
method: POST
path: "/rss-feeds"
tags: ["RSS feeds"]
---

# Connect an RSS feed

`POST /rss-feeds`

## Request

- Base URL: `https://post.adaptlypost.com/post/api/v1`
- URL: `https://post.adaptlypost.com/post/api/v1/rss-feeds`
- Auth: HTTP bearer

Fetches the feed and records every item already in it, so only items that appear later are posted. Set `postLatestItem` to also post the newest item on the first check. The feed is checked every `checkIntervalMinutes`, and each new item becomes a post on `targets` according to `postMode`. Requires the `posts.draft` permission.

## Headers

- `X-Workspace-Id` string

## Request body

- CreateRssFeedRequest
  - `name` string: Defaults to the feed's title
  - `targets` RssFeedTarget[], required
    - `platform` 'FACEBOOK' | 'INSTAGRAM' | 'THREADS' | 'TWITTER' | 'BLUESKY' | 'LINKEDIN' | 'MASTODON' | 'TELEGRAM' | 'GOOGLE_BUSINESS', required
    - `connectionId` string, required: Account ID from `GET /social-accounts`
    - `pageId` string: Facebook page ID. Required for FACEBOOK
    - `displayName` string
  - `postMode` 'DRAFT' | 'SCHEDULE' | 'PUBLISH', required: DRAFT creates a draft and needs `posts.draft`; SCHEDULE schedules the post `publishDelayMinutes` after the item is found and needs `posts.schedule`; PUBLISH publishes it right away and needs `posts.publish`
  - `publishDelayMinutes` integer: Required when `postMode` is SCHEDULE
  - `contentMode` 'TEMPLATE' | 'AI', required: TEMPLATE fills `template`; AI writes one caption per platform from the article, appends the link, spends 1 AI credit per platform per item and needs `ai.generate`
  - `template` string: Post text with `{title}`, `{link}`, `{description}`, `{author}` and `{feed}`. The description, then the title, is shortened to fit each platform; the link is never cut
  - `aiInstructions` string: Extra instructions for AI captions
  - `includeImage` boolean: Attach the item's image, or the article's preview image
  - `twitterKeepLinks` boolean: Keep links in X posts clickable. Lifetime-deal plans only; each X post with a link then costs more credits. Without it, links on X go out as plain text
  - `includeKeywords` string[]: Post only items whose title or summary contains one of these
  - `excludeKeywords` string[]: Skip items whose title or summary contains one of these
  - `maxPostsPerCheck` integer: New items are posted oldest first; the rest wait for the next check
  - `checkIntervalMinutes` 15 | 30 | 60 | 180 | 360 | 720 | 1440
  - `url` string, uri, required: Public http(s) URL of an RSS or Atom feed
  - `postLatestItem` boolean: Also post the newest item on the first check

## Response `201`

The new RSS feed

- RssFeed
  - `id` string
  - `userId` string: Member the feed posts as: whoever last saved it
  - `accountGroupId` string
  - `name` string
  - `url` string
  - `siteUrl` string
  - `status` 'ACTIVE' | 'PAUSED'
  - `pauseReason` 'USER' | 'FETCH_FAILURES' | 'CONSECUTIVE_FAILURES' | 'ACCESS_LOST' | 'SUBSCRIPTION_INACTIVE' | 'CONNECTION_REMOVED': Why the feed stopped: USER (paused by hand), FETCH_FAILURES (5 failed fetches in a row), CONSECUTIVE_FAILURES (3 items in a row failed to post), ACCESS_LOST (its owner lost the permission its post mode needs), SUBSCRIPTION_INACTIVE (the plan no longer covers publishing) or CONNECTION_REMOVED (every target account was disconnected)
  - `lastError` string
  - `postMode` 'DRAFT' | 'SCHEDULE' | 'PUBLISH': DRAFT creates a draft and needs `posts.draft`; SCHEDULE schedules the post `publishDelayMinutes` after the item is found and needs `posts.schedule`; PUBLISH publishes it right away and needs `posts.publish`
  - `publishDelayMinutes` integer
  - `contentMode` 'TEMPLATE' | 'AI': TEMPLATE fills `template`; AI writes one caption per platform from the article, appends the link, spends 1 AI credit per platform per item and needs `ai.generate`
  - `template` string
  - `aiInstructions` string
  - `includeImage` boolean
  - `twitterKeepLinks` boolean
  - `includeKeywords` string[]
  - `excludeKeywords` string[]
  - `maxPostsPerCheck` integer
  - `checkIntervalMinutes` integer
  - `targets` RssFeedTarget[]
    - `platform` 'FACEBOOK' | 'INSTAGRAM' | 'THREADS' | 'TWITTER' | 'BLUESKY' | 'LINKEDIN' | 'MASTODON' | 'TELEGRAM' | 'GOOGLE_BUSINESS', required
    - `connectionId` string, required: Account ID from `GET /social-accounts`
    - `pageId` string: Facebook page ID. Required for FACEBOOK
    - `displayName` string
  - `nextCheckAt` string, date-time
  - `lastCheckedAt` string, date-time
  - `lastPostedAt` string, date-time
  - `createdAt` string, date-time
  - `updatedAt` string, date-time

## Other responses

- `400`: Invalid settings, a URL that is not an RSS or Atom feed, a feed already connected, or the workspace limit reached
- `401`: Invalid or missing API key
- `403`: The key's role does not hold `posts.draft`
- `429`: Rate limit exceeded
- `503`: The feed could not be reached

---

[API](https://skmtc.dev/adaptlypost/apis/adaptlypost-public-api.md) · [All operations](https://skmtc.dev/adaptlypost/apis/adaptlypost-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adaptlypost/apis/adaptlypost-public-api/revisions/8390a5fa9a0d?raw)
