REST APIGET

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.

MethodPathDescription
GET/api/v1/rss-feedsList the workspace's feeds, newest first
POST/api/v1/rss-feedsConnect a feed
POST/api/v1/rss-feeds/previewFetch a feed without saving it and render its 5 newest items
GET/api/v1/rss-feeds/:idGet one feed
PATCH/api/v1/rss-feeds/:idChange the fields you send. The URL cannot change
DELETE/api/v1/rss-feeds/:idStop checking the feed. Posts it already created stay
GET/api/v1/rss-feeds/:id/itemsList the items the feed has seen
POST/api/v1/rss-feeds/:id/pausePause the feed
POST/api/v1/rss-feeds/:id/resumeClear the pause reason and check the feed within a minute
POST/api/v1/rss-feeds/:id/checkMove 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.

FieldTypeRequiredDescription
urlstringYesPublic http or https URL of an RSS or Atom feed
targetsarrayYes1 to 20 accounts, each { platform, connectionId, pageId }. connectionId is the account id from Social Accounts, and pageId is required for FACEBOOK
postModestringYesDRAFT creates a draft. SCHEDULE schedules the post publishDelayMinutes after the item is found. PUBLISH publishes it right away
contentModestringYesTEMPLATE fills template. AI writes one caption per platform from the article, adds the link, and spends 1 AI credit per platform per item
namestringNoUp to 120 characters. Defaults to the feed's title
publishDelayMinutesintegerNo5 to 10080 (7 days). Required when postMode is SCHEDULE
templatestringNoPost 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
aiInstructionsstringNoExtra instructions for AI captions, up to 1000 characters
includeImagebooleanNoAttach the item's image, or the article's preview image. Defaults to true
twitterKeepLinksbooleanNoKeep links in X posts clickable. Lifetime deal plans only, and each X post with a link then costs more credits. Defaults to false
includeKeywordsstring[]NoUp to 50. Post only items whose title or summary contains one of them
excludeKeywordsstring[]NoUp to 50. Skip items whose title or summary contains one of them
maxPostsPerCheckintegerNo1 to 10, default 3. New items are posted oldest first; the rest wait for the next check
checkIntervalMinutesintegerNo15, 30, 60, 180, 360, 720 or 1440. Defaults to 60
postLatestItembooleanNoAlso 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

FieldDescription
userIdThe member the feed posts as: whoever last saved it
statusACTIVE or PAUSED
pauseReasonWhy the feed paused, set only while it is PAUSED. See the table below
lastErrorThe error behind the pause, when a failure caused it
targets[].displayNameThe account's name, filled in by AdaptlyPost. Ignored when you send it
nextCheckAt, lastCheckedAt, lastPostedAtWhen 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 reasonMeaning
USERSomeone paused it through the API or the app
FETCH_FAILURES5 fetches in a row failed
CONSECUTIVE_FAILURES3 items in a row failed to post
ACCESS_LOSTIts owner lost the permission its post mode needs
SUBSCRIPTION_INACTIVEThe plan no longer covers publishing
CONNECTION_REMOVEDEvery 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 statusMeaning
BASELINEAlready in the feed when it was added
PROCESSINGBeing turned into a post
POSTEDBecame a post. postId links to it
FILTEREDLeft out by the keyword rules
SKIPPEDPublished more than 14 days before the feed was added
FAILEDThe 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.