REST APIPOST

Bulk Schedule

Schedule up to 100 social media posts at once with platform-specific settings using the AdaptlyPost bulk API endpoint.

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

Schedule up to 100 posts at once. Each post can have its own content, media, and scheduled time while sharing the same platform connections.

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

posts.schedule when every item has a future scheduledAt. If any item is dated now or in the past it publishes at once, and the key also needs posts.publish. Contributor and Viewer keys cannot bulk schedule.

Body Parameters

ParameterTypeDescription
platformsREQUIREDPlatformType[]Target platforms for all posts
timezoneREQUIREDstringIANA timezone for scheduling
postsREQUIREDPostItem[]Array of posts to schedule (1-100)
twitterConnectionIdsstring[]Twitter account connection IDs
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[]Batch-level Pinterest settings applied to all posts. See Platform Configs for schema
tiktokConfigsTikTokConfig[]Batch-level TikTok settings applied to all posts. See Platform Configs for schema
instagramConfigsInstagramConfig[]Batch-level Instagram settings applied to all posts. See Platform Configs for schema
facebookConfigsFacebookConfig[]Batch-level Facebook settings applied to all posts. See Platform Configs for schema
youtubeConfigsYouTubeConfig[]Batch-level YouTube settings applied to all posts. See Platform Configs for schema

Post Item Fields

Each post in the array can have its own content, media, and schedule time.

Post Item Parameters

ParameterTypeDescription
contentTypeREQUIREDContentTypeContent type: TEXT, IMAGE, VIDEO, or CAROUSEL (required)
textstringPost text content
platformTextsPlatformText[]Per-platform text overrides
mediaUrlsstring[]Media file URLs
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
scheduledAtREQUIREDstringSchedule date (required, ISO 8601)
pinterestConfigsPinterestConfig[]Per-post override. When set, takes priority over the batch-level config for this post
tiktokConfigsTikTokConfig[]Per-post override. When set, takes priority over the batch-level config for this post
instagramConfigsInstagramConfig[]Per-post override. When set, takes priority over the batch-level config for this post
facebookConfigsFacebookConfig[]Per-post override. When set, takes priority over the batch-level config for this post
youtubeConfigsYouTubeConfig[]Per-post override. When set, takes priority over the batch-level config for this post

Per-Post Platform Config Overrides

Platform configs can be set at two levels: batch-level (applied to all posts as default) and per-post (overrides the batch-level for that specific post). If a post includes its own platform config, it completely replaces the batch-level config for that platform.

Rate Limit

Maximum 100 posts per request. Each post is processed independently, if one fails validation, others will still be scheduled.

One Account per Platform

Only one account per platform is allowed. All posts in the batch share the same connections, so you cannot include multiple connection IDs for the same platform. This restriction is enforced to comply with platform Terms of Service.
Bulk Schedule Posts
curl --request POST \
  --url https://post.adaptlypost.com/post/api/v1/social-posts/bulk \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
    "platforms": ["YOUTUBE", "PINTEREST"],
    "timezone": "America/New_York",
    "youtubeConnectionIds": ["conn_yt123"],
    "pinterestConnectionIds": ["conn_pin456"],
    "youtubeConfigs": [{
      "connectionId": "conn_yt123",
      "postType": "SHORTS",
      "privacyStatus": "public"
    }],
    "pinterestConfigs": [{
      "connectionId": "conn_pin456",
      "boardId": "board_abc",
      "title": "Default pin title"
    }],
    "posts": [
      {
        "contentType": "VIDEO",
        "text": "First video!",
        "mediaUrls": ["https://cdn.adaptlypost.com/uploads/video1.mp4"],
        "scheduledAt": "2026-03-15T10:00:00Z"
      },
      {
        "contentType": "VIDEO",
        "text": "Second video with custom config",
        "mediaUrls": ["https://cdn.adaptlypost.com/uploads/video2.mp4"],
        "scheduledAt": "2026-03-15T14:00:00Z",
        "youtubeConfigs": [{
          "connectionId": "conn_yt123",
          "postType": "VIDEO",
          "videoTitle": "Full tutorial",
          "privacyStatus": "unlisted"
        }]
      }
    ]
  }'
201
{
  "totalScheduled": 2,
  "totalFailed": 0,
  "results": [
    {
      "postId": "post_abc001",
      "success": true,
      "isScheduled": true,
      "scheduledAt": "2026-03-15T10:00:00Z",
      "errorMessage": null
    },
    {
      "postId": "post_abc002",
      "success": true,
      "isScheduled": true,
      "scheduledAt": "2026-03-15T14:00:00Z",
      "errorMessage": null
    }
  ]
}