REST APIPOST

Key insights - Create posts from API

Publish or schedule a post across multiple social platforms in a single API call, with per-platform content and media.

POSThttps://post.adaptlypost.com/post/api/v1/social-posts

Create a new social media post. Posts can be published immediately, scheduled for later, or saved as drafts.

API Key (Bearer token)
Permission:posts.draftRoles and permissions

posts.draft is enough when saveAsDraft is true. A future scheduledAt needs posts.schedule. No scheduledAt, or a time already past, publishes now and needs posts.publish. A Contributor key can therefore only save drafts.

Body Parameters

ParameterTypeDescription
platformsREQUIREDPlatformType[]Target platforms (e.g. TWITTER, LINKEDIN, INSTAGRAM)
contentTypeREQUIREDContentTypeTEXT, IMAGE, VIDEO, CAROUSEL, or DOCUMENT. DOCUMENT is LinkedIn only: exactly one PDF, PPT, PPTX, DOC or DOCX file in mediaUrls, shown as a swipeable document
textstringPost text content
platformTextsPlatformText[]Per-platform text overrides
mediaUrlsstring[]URLs of uploaded media files
mediaAltTextsstring[]Alt text for each image, in the same order as mediaUrls. Max 1000 characters each; use an empty string to skip an image. Sent to X, Bluesky, Mastodon, LinkedIn, Facebook, Instagram and Threads. Pinterest uses the first one, cut to 500 characters. TikTok, YouTube and videos ignore it.
thumbnailUrlstringThumbnail URL for video posts
thumbnailTimestampMsnumberVideo frame to use as the thumbnail, in milliseconds from the start
platformThumbnailsPlatformThumbnail[]A different thumbnail for one platform of a video post, as { platform, thumbnailUrl?, thumbnailTimestampMs? }. YOUTUBE, FACEBOOK and LINKEDIN take an image, INSTAGRAM and PINTEREST an image or a frame, TIKTOK only a frame. Platforms without an entry use thumbnailUrl and thumbnailTimestampMs
firstCommentsPlatformFirstComment[]A comment posted under the published post from the same account, as { platform, text }. One entry per platform. LINKEDIN takes up to 1250 characters, TWITTER 280, THREADS 500, BLUESKY 300, MASTODON 500 and YOUTUBE 10000 (not on private or made-for-kids videos). Other platforms return a 400
scheduledAtstringISO 8601 date for scheduling. Omit to publish immediately.
timezoneREQUIREDstringIANA timezone (e.g. America/New_York)
saveAsDraftbooleanSave as draft instead of publishing
recurrenceRecurrenceRepeats the post on a schedule. Needs a future scheduledAt. See Recurring Posts below
twitterConnectionIdsstring[]Twitter account connection IDs
twitterKeepLinksbooleanKeep links in the X text clickable. By default every link in X text is broken up (example.com becomes example. com), because X charges over 10 times more for a post with a link. Only AppSumo lifetime deal accounts can turn this on: a kept link costs 20 credits instead of 2, also for an X first comment, and without enough credits the X post fails. true on any other plan returns a 400. Ignored when the X text has no link
linkedinConnectionIdsstring[]LinkedIn account connection IDs
instagramConnectionIdsstring[]Instagram account connection IDs
tiktokConnectionIdsstring[]TikTok account connection IDs
youtubeConnectionIdsstring[]YouTube channel connection IDs
pinterestConnectionIdsstring[]Pinterest account connection IDs
blueskyConnectionIdsstring[]Bluesky account connection IDs
mastodonConnectionIdsstring[]Mastodon account connection IDs
threadsConnectionIdsstring[]Threads account connection IDs
pageIdsstring[]Facebook pages to post to. Accepts either the account id or the pageId from /social-accounts
pinterestConfigsPinterestConfig[]Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs
tiktokConfigsTikTokConfig[]Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs
instagramConfigsInstagramConfig[]Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs
facebookConfigsFacebookConfig[]Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs
youtubeConfigsYouTubeConfig[]Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs
linkedinConfigsLinkedInConfig[]Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs

Platform-Specific Text

Use platformTexts to customize content per platform while sharing the same post.

When a platform has no entry in platformTexts, the default text field is used.

One Account per Platform

Only one account per platform is allowed per post. For example, you cannot include two Twitter connection IDs in the same request. This restriction is enforced to comply with platform Terms of Service. Violating this rule will return a 400 error.

Recurring Posts

Add a recurrence object to repeat the post. The post at scheduledAt is the first one of the series and sets the time of day, in the timezone you send. Only the next post of the series exists at any time. AdaptlyPost creates it about 24 hours before it goes out.

Recurrence Object

ParameterTypeDescription
frequencyREQUIREDRecurrenceFrequencyDAILY, WEEKLY, MONTHLY or YEARLY
intervalnumberRepeat every N days, weeks or months (1-30, default: 1)
weekdaysWeekday[]WEEKLY only. The days to post on, MONDAY to SUNDAY. The weekday of scheduledAt is always included
endsOnstringLast day a post may go out on, as YYYY-MM-DD. Must be on or after the day of the first post. Cannot be combined with maxOccurrences
maxOccurrencesnumberTotal number of posts the series publishes (2-365). Cannot be combined with endsOn. Send neither to repeat until you pause or delete the series
The response adds recurringPostId, and postId is the first post of the series. Pass recurringPostId to the Recurring Posts endpoints to pause, resume or delete the series.

Recurring Post Rules

A recurring post cannot use saveAsDraft: true or include a TikTok account. Each of these returns 400. Dates missed while the series is paused are skipped, never published late. X and LinkedIn reject text that matches an earlier post, so add spintax like {Hi|Hello} to make each post different.
Create a Social Post
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/social-posts \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
    "platforms": ["TWITTER", "LINKEDIN"],
    "contentType": "TEXT",
    "text": "Exciting product update!",
    "timezone": "America/New_York",
    "twitterConnectionIds": ["conn_abc123"],
    "linkedinConnectionIds": ["conn_def456"]
  }'
Create a Recurring Post
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/social-posts \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
    "platforms": ["LINKEDIN"],
    "contentType": "TEXT",
    "text": "{Hi|Hello} everyone, the weekly product tip is live!",
    "scheduledAt": "2026-10-05T13:00:00Z",
    "timezone": "America/New_York",
    "linkedinConnectionIds": ["conn_def456"],
    "recurrence": {
      "frequency": "WEEKLY",
      "weekdays": ["MONDAY", "THURSDAY"],
      "maxOccurrences": 12
    }
  }'
201
{
  "postId": "post_xyz789",
  "queuedPlatforms": ["TWITTER", "LINKEDIN"],
  "skippedPlatforms": [],
  "isScheduled": false,
  "scheduledAt": null
}