RSS Feeds
Connect an RSS or Atom feed and turn each new item into a draft, a scheduled post or a published post on the accounts you pick, with a template or AI captions.
Permission: posts.read. See Roles and permissions.
Listing and reading feeds and their items need posts.read. Creating, previewing, updating, pausing, resuming, checking and deleting need posts.draft, plus the permission the feed's post mode needs: posts.schedule for SCHEDULE, posts.publish for PUBLISH, and ai.generate for AI captions. A feed another member set up also needs posts.others to update, pause, resume, check or delete.
A feed is checked on a schedule, and each item that appears after you added it becomes a post on the accounts in targets. Every post goes through the same checks as Create Post. A feed posts as the member who last saved it: creating, updating or resuming a feed makes the key's member its owner.
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/rss-feeds | List the workspace's feeds, newest first |
| POST | /api/v1/rss-feeds | Connect a feed |
| POST | /api/v1/rss-feeds/preview | Fetch a feed without saving it and render its 5 newest items |
| GET | /api/v1/rss-feeds/:id | Get one feed |
| PATCH | /api/v1/rss-feeds/:id | Change the fields you send. The URL cannot change |
| DELETE | /api/v1/rss-feeds/:id | Stop checking the feed. Posts it already created stay |
| GET | /api/v1/rss-feeds/:id/items | List the items the feed has seen |
| POST | /api/v1/rss-feeds/:id/pause | Pause the feed |
| POST | /api/v1/rss-feeds/:id/resume | Clear the pause reason and check the feed within a minute |
| POST | /api/v1/rss-feeds/:id/check | Move the next check to now; the feed is fetched within a minute |
POST /api/v1/rss-feeds
Fetches the feed and records every item already in it, so only items that appear later are posted. A workspace holds up to 20 feeds.
| Field | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Public http or https URL of an RSS or Atom feed |
| targets | array | Yes | 1 to 20 accounts, each { platform, connectionId, pageId }. connectionId is the account id from Social Accounts, and pageId is required for FACEBOOK |
| postMode | string | Yes | DRAFT creates a draft. SCHEDULE schedules the post publishDelayMinutes after the item is found. PUBLISH publishes it right away |
| contentMode | string | Yes | TEMPLATE fills template. AI writes one caption per platform from the article, adds the link, and spends 1 AI credit per platform per item |
| name | string | No | Up to 120 characters. Defaults to the feed's title |
| publishDelayMinutes | integer | No | 5 to 10080 (7 days). Required when postMode is SCHEDULE |
| template | string | No | Post text with {title}, {link}, {description}, {author} and {feed}, up to 2000 characters. Defaults to {title}\n\n{link}. The description, then the title, is shortened to fit each platform; the link is never cut |
| aiInstructions | string | No | Extra instructions for AI captions, up to 1000 characters |
| includeImage | boolean | No | Attach the item's image, or the article's preview image. Defaults to true |
| twitterKeepLinks | boolean | No | Keep links in X posts clickable. Lifetime deal plans only, and each X post with a link then costs more credits. Defaults to false |
| includeKeywords | string[] | No | Up to 50. Post only items whose title or summary contains one of them |
| excludeKeywords | string[] | No | Up to 50. Skip items whose title or summary contains one of them |
| maxPostsPerCheck | integer | No | 1 to 10, default 3. New items are posted oldest first; the rest wait for the next check |
| checkIntervalMinutes | integer | No | 15, 30, 60, 180, 360, 720 or 1440. Defaults to 60 |
| postLatestItem | boolean | No | Also post the newest item on the first check. Defaults to false |
Targets can be FACEBOOK, INSTAGRAM, THREADS, TWITTER, BLUESKY, LINKEDIN, MASTODON, TELEGRAM and GOOGLE_BUSINESS.
Example request:
{
"url": "https://blog.example.com/feed.xml",
"targets": [
{ "platform": "LINKEDIN", "connectionId": "conn_li_001" },
{ "platform": "FACEBOOK", "connectionId": "conn_fb_001", "pageId": "123456789012345" }
],
"postMode": "SCHEDULE",
"publishDelayMinutes": 30,
"contentMode": "TEMPLATE",
"template": "New on the blog: {title}\n\n{link}",
"excludeKeywords": ["sponsored"]
}Returns 201 with the feed:
{
"id": "rss_01j9x",
"userId": "user_123",
"accountGroupId": "ag_01j9x",
"name": "Example Blog",
"url": "https://blog.example.com/feed.xml",
"siteUrl": "https://blog.example.com",
"status": "ACTIVE",
"postMode": "SCHEDULE",
"publishDelayMinutes": 30,
"contentMode": "TEMPLATE",
"template": "New on the blog: {title}\n\n{link}",
"includeImage": true,
"twitterKeepLinks": false,
"includeKeywords": [],
"excludeKeywords": ["sponsored"],
"maxPostsPerCheck": 3,
"checkIntervalMinutes": 60,
"targets": [
{ "platform": "LINKEDIN", "connectionId": "conn_li_001", "displayName": "Example Inc." },
{ "platform": "FACEBOOK", "connectionId": "conn_fb_001", "pageId": "123456789012345", "displayName": "Example" }
],
"nextCheckAt": "2026-11-08T15:00:00.000Z",
"createdAt": "2026-11-08T14:00:00.000Z",
"updatedAt": "2026-11-08T14:00:00.000Z"
}A URL that is not an RSS or Atom feed, a feed already connected, an unsupported target platform, a missing publishDelayMinutes or the 20 feed limit returns 400. A feed that cannot be reached returns 503. A key without the permission the post mode or AI captions need returns 403.
Feed fields
| Field | Description |
|---|---|
| userId | The member the feed posts as: whoever last saved it |
| status | ACTIVE or PAUSED |
| pauseReason | Why the feed paused, set only while it is PAUSED. See the table below |
| lastError | The error behind the pause, when a failure caused it |
| targets[].displayName | The account's name, filled in by AdaptlyPost. Ignored when you send it |
| nextCheckAt, lastCheckedAt, lastPostedAt | When the feed is checked next, when it was last checked, and when it last created a post |
The other fields carry the settings above.
| Pause reason | Meaning |
|---|---|
| USER | Someone paused it through the API or the app |
| FETCH_FAILURES | 5 fetches in a row failed |
| 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 |
| CONNECTION_REMOVED | Every target account was disconnected |
Fix the cause, then resume the feed.
POST /api/v1/rss-feeds/preview
Takes url and an optional template, fetches the feed without saving anything, and returns url, title, siteUrl and its 5 newest items, each with title, link, summary, publishedAt, imageUrl and text, the item rendered with the template.
GET /api/v1/rss-feeds/:id/items
Lists the items the feed has seen, newest first, leaving out the ones that were already in the feed when it was added. limit takes 1 to 100 and defaults to 20. Returns { "items": [...] }, each with id, title, link, publishedAt, createdAt, status, postId and error.
| Item status | Meaning |
|---|---|
| BASELINE | Already in the feed when it was added |
| PROCESSING | Being turned into a post |
| POSTED | Became a post. postId links to it |
| FILTERED | Left out by the keyword rules |
| SKIPPED | Published more than 14 days before the feed was added |
| FAILED | The post could not be created. error says why |
Update, pause, resume, check and delete
PATCH takes the same fields as create, except url and postLatestItem, and changes only the ones you send. Pause, resume, check and delete take no body. Each of them except delete returns the feed; delete returns { "deleted": true }. An id that does not exist or belongs to another workspace returns 404.