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. Current thumbnail behavior:
  • YouTube regular videos: supported. Mallary accepts jpg, jpeg, or png thumbnail images up to 2 MB. When the dimensions are known, Mallary requires at least 640px width. Mallary skips images that are not close to 16:9. Recommended: 1280x720 16:9. Mallary skips YouTube Shorts thumbnails.
  • Facebook videos: supported for video uploads. 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.
  • 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.
  • 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.

LinkedIn

  • LinkedIn supports text-only posts or one image attachment.
  • Mallary rejects LinkedIn video attachments before queueing.
  • 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.

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 MEDIA_UPLOAD, which sends the upload to the creator inbox for final review and publishing inside TikTok.
  • Use DIRECT_POST only when you want Mallary to publish directly to TikTok without that inbox review step.
  • 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.

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.

Snapchat

  • Snapchat posting requires Snapchat Public Profile or Marketing API access plus Mallary server credentials before any post can succeed.
  • The validation target is: story or saved_story = one image or one mp4 video, spotlight = one mp4 video.
  • Snapchat supports only one media item per post.
  • Snapchat video must be 5 to 60 seconds.
  • The current publisher implementation fails fast until you enable Snapchat partner access and credentials.
  • platform_options.snapchat.message sets a Snapchat-specific message. Omit it to use the top-level message.

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 supports up to 140 seconds and up to 512 MB.
  • 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,
snapchat
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[]
Last modified on August 11, 2026