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.
https://post.adaptlypost.com/post/api/v1/social-postsCreate a new social media post. Posts can be published immediately, scheduled for later, or saved as drafts.
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
| Parameter | Type | Description |
|---|---|---|
platformsREQUIRED | PlatformType[] | Target platforms (e.g. TWITTER, LINKEDIN, INSTAGRAM) |
contentTypeREQUIRED | ContentType | TEXT, 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 |
text | string | Post text content |
platformTexts | PlatformText[] | Per-platform text overrides |
mediaUrls | string[] | URLs of uploaded media files |
mediaAltTexts | string[] | 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. |
thumbnailUrl | string | Thumbnail URL for video posts |
thumbnailTimestampMs | number | Video frame to use as the thumbnail, in milliseconds from the start |
platformThumbnails | PlatformThumbnail[] | 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 |
firstComments | PlatformFirstComment[] | 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 |
scheduledAt | string | ISO 8601 date for scheduling. Omit to publish immediately. |
timezoneREQUIRED | string | IANA timezone (e.g. America/New_York) |
saveAsDraft | boolean | Save as draft instead of publishing |
recurrence | Recurrence | Repeats the post on a schedule. Needs a future scheduledAt. See Recurring Posts below |
twitterConnectionIds | string[] | Twitter account connection IDs |
twitterKeepLinks | boolean | Keep 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 |
linkedinConnectionIds | string[] | LinkedIn account connection IDs |
instagramConnectionIds | string[] | Instagram account connection IDs |
tiktokConnectionIds | string[] | TikTok account connection IDs |
youtubeConnectionIds | string[] | YouTube channel connection IDs |
pinterestConnectionIds | string[] | Pinterest account connection IDs |
blueskyConnectionIds | string[] | Bluesky account connection IDs |
mastodonConnectionIds | string[] | Mastodon account connection IDs |
threadsConnectionIds | string[] | Threads account connection IDs |
pageIds | string[] | Facebook pages to post to. Accepts either the account id or the pageId from /social-accounts |
pinterestConfigs | PinterestConfig[] | Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs |
tiktokConfigs | TikTokConfig[] | Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs |
instagramConfigs | InstagramConfig[] | Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs |
facebookConfigs | FacebookConfig[] | Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs |
youtubeConfigs | YouTubeConfig[] | Settings for this platform, one object per account, each naming the connectionId it applies to (pageId for Facebook). See Platform Configs |
linkedinConfigs | LinkedInConfig[] | 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.
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
| Parameter | Type | Description |
|---|---|---|
frequencyREQUIRED | RecurrenceFrequency | DAILY, WEEKLY, MONTHLY or YEARLY |
interval | number | Repeat every N days, weeks or months (1-30, default: 1) |
weekdays | Weekday[] | WEEKLY only. The days to post on, MONDAY to SUNDAY. The weekday of scheduledAt is always included |
endsOn | string | Last 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 |
maxOccurrences | number | Total number of posts the series publishes (2-365). Cannot be combined with endsOn. Send neither to repeat until you pause 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.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"]
}'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
}
}'{
"postId": "post_xyz789",
"queuedPlatforms": ["TWITTER", "LINKEDIN"],
"skippedPlatforms": [],
"isScheduled": false,
"scheduledAt": null
}