Skip to main content
POST
Create or schedule a post across platforms

Connection Profiles

Use profile_id to publish from a non-default connection profile. Omit it to use the default profile. Connection profiles let one Mallary user connect multiple accounts on the same platform. Plan caps per platform are: Free 1, Starter 4, Pro 10, Business 50.

Scheduling

  • If you already know the exact UTC or offset time, use scheduled_at with an absolute timestamp like 2026-04-06T18:30:00Z.
  • To resolve the post in a specific timezone, use a local scheduled_at like 2026-04-06T14:30 plus scheduled_timezone with an IANA timezone like America/New_York.
  • Mallary stores the resolved publish time in UTC and returns the original scheduled_timezone on grouped post reads.

Publish Results

Post creation is asynchronous. The create response returns one Mallary job ID per platform immediately, with platform_post_id and platform_post_url set to null until that platform finishes publishing. After completion, use GET /api/v1/jobs/{id} or GET /api/v1/posts. These return the platform post ID and the public post URL that the platform exposes.

Video Thumbnails

Attach a custom thumbnail or cover to a video media item with thumbnail_url.
thumbnail_url must be a Mallary-hosted image URL, usually created with POST /api/v1/upload. Mallary skips a thumbnail that is unsupported for the platform, wrong for the post type, or rejected by the provider. It then continues to publish the post where possible. To use a different cover for each platform, put thumbnail_url inside that platform’s options. For example, use platform_options.youtube.thumbnail_url for YouTube and platform_options.instagram.thumbnail_url for Instagram. Mallary adds each cover only to that platform’s video. Current thumbnail behavior:
  • YouTube regular videos: supported. Use a jpg, jpeg, or png image up to 50 MB. Use 16:9 and at least 640px wide.
  • YouTube Shorts: YouTube may accept and store the image but show a video frame instead. Mallary warns you because the YouTube API cannot confirm the cover viewers will see. Use YouTube Studio to add a custom image, or use the YouTube app to choose a frame.
  • Facebook feed videos: supported. Mallary accepts jpg, jpeg, or png thumbnail images up to 10 MB and retries without the thumbnail if Meta rejects it.
  • Instagram videos/Reels: supported with a Mallary-hosted cover_url. Use a cover image that matches the video placement, such as 9:16 for Reels/stories. If Meta rejects a cover variant, Mallary falls back to video creation without the cover.
  • TikTok video posts: TikTok currently exposes frame-based cover selection through video_cover_timestamp_ms, not arbitrary image thumbnails. If thumbnail_url is supplied, Mallary does not send video_cover_timestamp_ms and lets TikTok use its default cover behavior.
  • TikTok photo posts: thumbnail_url can choose the photo cover only when it exactly matches one of the image URLs in media[]. Mallary then uses that image index as photo_cover_index. Mallary does not upload it as an extra photo.

Platform-Specific Media Rules

Mallary validates media before it queues a platform job. The public API and the current publishers enforce these media rules. For a simple guide to each setting, see Platform Posting Options.

Facebook

  • Feed posts can be text-only, link-only, up to 10 images, or 1 video.
  • Facebook does not allow mixing images and video in the same post.
  • Feed images accept jpg, jpeg, png, gif, and webp. Feed video accepts mp4 and mov.
  • Facebook stories support 1 image or 1 video.
  • Facebook Reels use 1 MP4 or MOV video. The video must be 9:16, at least 540 by 960 pixels, and 3 to 90 seconds long.
  • Choose feed, story, or reel with platform_options.facebook.post_type.
  • platform_options.facebook.message sets a Facebook-specific message. Omit it to use the top-level message.

Instagram

  • Instagram requires media.
  • The validator currently defines: feed = 1 image or 1 video, story = 1 image or 1 video, reel = 1 video, carousel = 2 to 10 mixed image/video items.
  • The publisher uses the matching Instagram container flow for feed, story, reel, and carousel when selected through platform_options.instagram.post_type.
  • platform_options.instagram.message sets an Instagram-specific caption. Omit it to use the top-level message.
  • For a Reel, platform_options.instagram.shareToFeed defaults to true. Set it to false to keep the Reel in the Reels tab and off the profile feed.
  • To publish a Trial Reel, add platform_options.instagram.trialParams.graduationStrategy. Use MANUAL to choose later in Instagram, or SS_PERFORMANCE to let Instagram share it with followers if it performs well. Do not add shareToFeed to a Trial Reel request.
  • Set platform_options.instagram.isPaidPartnership to true to show the Paid partnership label on a feed post, Reel, or carousel.
  • Add up to two sponsor usernames or numeric user IDs with platform_options.instagram.brandedContentSponsors. Sponsors turn on the Paid partnership label too.
  • Paid partnership options do not work with Stories. They require an Instagram account connected through Facebook Login.
  • Instagram’s publishing API does not support story captions or follow-up comments. Include story text in the media itself.
  • Instagram image uploads use jpg, jpeg, or png. Video uploads use mp4 or mov.
  • Instagram Reels and single feed videos must be 3 seconds to 15 minutes long and no larger than 300 MB. Single feed videos publish as Reels shared to the feed.

LinkedIn

  • LinkedIn supports text-only posts, one image or GIF, or one MP4 video.
  • Videos can be up to 1 GB (1,073,741,824 bytes) and 3 seconds to 30 minutes long. Do not mix images and video.
  • Upload media to Mallary first. Use the returned files.mallary.ai URL or storageKey.
  • Mallary uploads the video to LinkedIn and waits for processing before it publishes the post.
  • LinkedIn image attachments accept jpg, jpeg, png, or gif.
  • platform_options.linkedin.message sets a LinkedIn-specific message. Omit it to use the top-level message.

Threads

  • Threads supports four posting shapes: text, image, video, and carousel.
  • Text posts are text-only and cannot include media.
  • Image posts support exactly 1 image in jpg, jpeg, png, or webp.
  • Video posts support exactly 1 video in mp4 or mov.
  • Carousel posts support 2 to 20 supported media items total.
  • platform_options.threads.post_type can be text, image, video, or carousel.
  • If you omit platform_options.threads.post_type, Mallary chooses from the payload: no media = text, one image = image, one video = video, multiple supported media items = carousel.
  • platform_options.threads.message sets a Threads-specific message. Omit it to use the top-level message.
  • Threads currently supports comments_under_post.

YouTube

  • YouTube requires exactly one video.
  • regular video supports one video up to 12 hours and up to 256 GB.
  • shorts supports one video up to 3 minutes. Use vertical video.
  • YouTube posting does not support images.
  • platform_options.youtube.message sets a YouTube-specific description/default-title source. Omit it to use the top-level message.
  • platform_options.youtube.title sets the YouTube title and takes precedence over the first line of the effective message.
  • platform_options.youtube.tags adds video tags. Each tag can use up to 100 characters, and YouTube allows 500 characters across the full tag list after counting separators.
  • platform_options.youtube.containsSyntheticMedia accepts true or false. Set it to true when the video contains realistic AI-generated or altered content that could look real. YouTube may show a disclosure label.
  • platform_options.youtube.playlist_id adds the new video to an existing playlist owned by the connected YouTube channel. Mallary checks the playlist before upload.

TikTok

  • TikTok video posts support one video file in mp4, mov, or webm.
  • TikTok photo posts support up to 35 images in jpg, jpeg, or webp.
  • platform_options.tiktok.post_type can be video or photo.
  • platform_options.tiktok.post_mode can be DIRECT_POST or MEDIA_UPLOAD.
  • TikTok defaults to DIRECT_POST, which publishes the post through Mallary.
  • Use MEDIA_UPLOAD only when you want Mallary to send the upload to the TikTok inbox. The job stays action_required until you finish the post in TikTok and attach its final TikTok URL.
  • For TikTok video posts, platform_options.tiktok.source can be FILE_UPLOAD or PULL_FROM_URL.
  • For TikTok photo posts, TikTok only allows PULL_FROM_URL.
  • For TikTok PULL_FROM_URL, Mallary only accepts media already hosted on the Mallary CDN (https://files.mallary.ai/...).
  • platform_options.tiktok.message sets a TikTok-specific caption/title fallback. Omit it to use the top-level message.
  • platform_options.tiktok.title sets the TikTok title and takes precedence over the effective message where TikTok accepts a title.
  • platform_options.tiktok.description sets the TikTok photo description.
  • Direct-post TikTok options include privacy_level, disable_comment, disable_duet, disable_stitch, video_cover_timestamp_ms, auto_add_music, brand_content_toggle, brand_organic_toggle, is_aigc, and photo_cover_index where applicable.
  • TikTok posts do not currently support comments_under_post.

Pinterest

  • Pinterest requires exactly one image or GIF, or exactly one video.
  • Pinterest does not allow mixing image and video in the same Pin.
  • Image Pins accept one jpg, jpeg, png, webp, or gif file up to 32 MB.
  • Video Pins accept one mp4 or mov file, 4 seconds to 15 minutes, up to 2 GB.
  • A Pinterest board is required. Send boardId, or use the board saved with the Pinterest connection.
  • platform_options.pinterest.message sets a Pinterest-specific description/default title source. Omit it to use the top-level message. Pinterest allows 800 characters in a description. Mallary shortens longer descriptions to fit.

Reddit

  • text and link posts do not upload media through the Mallary API.
  • image posts require one image or GIF up to 20 MB.
  • The current public API path does not support Reddit video upload. To point at externally hosted video, use a link post.
  • subreddit or subredditName is required in platform options.
  • platform_options.reddit.message sets a Reddit-specific title/text source. Omit it to use the top-level message.

Bluesky

  • Bluesky supports a text-only post, up to four images, or one video.
  • Images can be jpg, jpeg, png, or webp, up to 2 MB each.
  • Video must be one mp4 file, up to 300 MB. Bluesky may apply a daily video limit to an account.
  • A Bluesky post can have up to 300 characters.
  • platform_options.bluesky.message sets a Bluesky-specific message. Omit it to use the top-level message.
  • platform_options.bluesky.languages adds up to three language codes. langs is also accepted.
  • Add alt_text to a media item to describe an image or video for people who use screen readers.
  • Bluesky supports up to three comments_under_post replies.

X

  • X allows up to 4 images, or 1 video, or 1 GIF.
  • X does not allow mixing images and video in the same post.
  • GIFs cannot be combined with other attachments.
  • X images accept jpg, jpeg, png, webp, and gif. Video accepts mp4 or mov.
  • X video limits depend on the connected X account. Standard accounts can use videos up to 20 minutes and 8 GB. Eligible Premium or verified accounts can use videos up to 125 minutes and 16 GB. Mallary checks the connected account before accepting a video above the standard limits.
  • Mallary’s current upload endpoint accepts files up to 5 GB. This upload limit still applies even when X allows a larger file for the connected account.
  • platform_options.x.message or platform_options.twitter.message sets an X-specific message. Omit it to use the top-level message.

Authorizations

Authorization
string
header
required

Use Authorization: Bearer {api_key}

Headers

Idempotency-Key
string

Optional idempotency key to prevent duplicate submissions.

Body

application/json
message
string
required
Minimum string length: 1
platforms
enum<string>[]
required
Minimum array length: 1

Supported publishing platform identifier.

Available options:
twitter,
x,
facebook,
instagram,
linkedin,
youtube,
tiktok,
pinterest,
reddit,
threads,
bluesky
profile_id
string

Connection profile to publish from. Omit to use the default profile.

Pattern: ^[A-Za-z0-9]{6,32}$
Example:

"AbC123xYz90"

media
object[]

Media URLs obtained from using the /api/v1/upload endpoint.

comments_under_post
string[]

Up to 3 follow-up comments/replies under the main post when supported by the target platform/format.

Maximum array length: 3
scheduled_at
string

Optional scheduled publish timestamp. Send an absolute timestamp like 2026-04-06T18:30:00Z, or send a local datetime like 2026-04-06T14:30 together with scheduled_timezone.

scheduled_timezone
string

Optional IANA timezone such as America/New_York. When provided with a local scheduled_at that omits an offset, Mallary resolves the wall-clock time in this timezone and stores the resulting UTC publish time.

auto_reply_enabled
boolean

Optional per-post override for AI auto-replies.

platform_options
object

Optional per-platform overrides.

webhook_url
string<uri>

Optional callback URL for completion notifications.

Response

Jobs enqueued

status
enum<string>
Available options:
queued
batch_id
string
profile_id
string | null
Pattern: ^[A-Za-z0-9]{6,32}$
jobs
object[]
warnings
object[]

Non-blocking warnings about provider behavior. A queued post may still publish.

Last modified on September 21, 2026