Guides
Platform support
The call is identical everywhere, but each network has its own rules. Here's the current picture. And how to read the live limits programmatically.
| Network | Caption | Rate | Publishing extras | Managing |
| Bluesky |
300 |
— |
threads, first comment, delete |
read, engage (10), reply, DMs, profile |
| Facebook |
63,206 |
25/day |
first comment, delete |
read, engage (2), reply built, waiting on review |
| Instagram |
2,200 |
100/day |
first comment, delete |
read, engage (2), reply, DMs |
| LinkedIn |
3,000 |
— |
first comment, delete |
engage (2), reply built, waiting on review |
| Pinterest |
500 |
— |
delete |
read, engage (3) |
| Threads |
500 |
250/day |
first comment, delete |
read, reply |
| TikTok |
2,200 / 4,000 |
25/day |
not yet |
not yet |
| X |
280 |
— |
threads, first comment, delete |
read, reply, DMs |
| YouTube |
5,000 |
100/day |
first comment, delete |
read, engage (4), reply |
Caption shows video / photo where a network caps them differently. Engage counts the actions available. Every figure is read from the same table the API validates against, so it cannot disagree with what a call will actually do. Read it programmatically with GET /v1/platforms.
Network by network
Bluesky
- Caption 300 characters
- Media text on its own is fine, up to 4 images, 1 video, video up to 60s (image 1MB, video 50MB)
- Formats image/jpeg, image/png, image/webp, image/gif, video/mp4
- Threads Yes First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile Yes
- Engagement
like unlike repost unrepost follow unfollow block unblock mute unmute
- Hide a reply on your post No Direct messages Yes
- Search the network search posts, look someone up, read their posts
| Option | Type | Values | Notes |
|---|
whoCanReply | enum | everybody nobody mentioned following | Who can reply |
whoCanQuote | enum | everybody nobody | Bluesky calls this a postgate. 'nobody' stops anyone quote-posting it. |
quoteOf | string | — | An at:// uri or a bsky.app post url to quote. The quoted post appears embedded beneath yours. |
contentLabel | enum | none sexual nudity graphic-media | Content warning |
language | string | — | BCP-47 code(s), e.g. en |
Facebook
- Caption 63,206 characters
- Media text on its own is fine, up to 10 images, 1 video, video up to 14400s (image 10MB, video 1024MB)
- Formats image/jpeg, image/png, image/gif, image/webp, video/mp4, video/quicktime
- Threads No First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile No
- Engagement
like unlike
- Hide a reply on your post Yes Direct messages No
Built, waiting on permission. These work in the code and are switched off until Facebook grants access:
messages: pages_messaging (Meta App Review, separate track from the Pages permissions)discovers.creators: facebook_creator_marketplace_discovery is granted and the adapter is written, but Meta has not published a creator_marketplace_creators edge on the Page node, so the call names that rather than pretending a search worked. Instagram's equivalent edge is documented and does work.
- The follower number comes from the Page itself. Facebook does not expose who the followers are, so there is a count and no list.
- Branded content partners come from Meta's partnership-ads API rather than the Graph API, and permission to tag is separate from permission to advertise.
- Creator marketplace search is requested, but Meta has not published a creator_marketplace_creators edge on the Page node yet. The call names that rather than pretending a search worked.
| Option | Type | Values | Notes |
|---|
link | string | — | URL shown as a link preview on text posts. Ignored for photo albums and videos. |
locationId | string | — | A Facebook Page / place id to tag on the post. |
mentionPageIds | string | — | Comma-separated Facebook Page ids to mention. Facebook takes mentions inline in the message, so we place them for you at the end of the post. |
Instagram
- Caption 2,200 characters
- Media media required, up to 10 images, 1 video, video up to 900s (image 8MB, video 300MB)
- Formats image/jpeg, video/mp4, video/quicktime
- Threads No First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile No
- Engagement
like unlike
- Hide a reply on your post Yes Direct messages Yes
- Search the network search posts, look someone up, read their posts, find creators
- Publishing is asynchronous the post enters
processing and settles once the network confirms
- discovers.creators is a statement about the NETWORK, not about your account. Two more things gate it, and neither is visible from here: the connection must have been made through Facebook (check connectVariant on the account), and the brand must have accepted the Creator Marketplace terms in Meta Business Suite. GET /v1/social-accounts/{id} answers the first per account; the second surfaces as creator_marketplace_not_onboarded with the click path in `fix`.
- Hashtag search is the only search Instagram has. There is no keyword search, and a hashtag cannot contain a space, so a multi-word query matches nothing by construction rather than by absence.
- Hashtag results CANNOT be used to contact anyone, and no follow-up call changes that. Meta's own documentation says responses will not include personally identifiable information, and refuses the username field on the returned media. Every item carries authorHidden: true. To find people, use creator search or look up a handle you already have; post search is not a creator finder on this network.
- Meta caps hashtag search at 30 UNIQUE hashtags per 7 day window, counted per Instagram account, not per query. Searching the same tag repeatedly is free; the 31st distinct tag in a week fails. Plan a scouting run around that budget rather than discovering it partway through.
- Sorting by recent uses Meta's recent_media edge, which only returns media published in the last 24 HOURS. An empty result there means nothing was posted today, not that the tag is unused. Sort by top to see beyond the day.
- Hashtag search does not name the author. Instagram refuses the username field on hashtag results, so those posts come back without one and each carries authorHidden: true. Looking an account up by handle works fine.
- Looking someone up only works for professional (business or creator) accounts. A personal handle comes back as not found.
- Tagging products needs an approved Instagram Shop and a catalogue on the same business. Without one the products call returns nothing, which is the account not being set up rather than an error.
- Reading direct messages also needs a switch inside the Instagram app, separate from the permission: Settings, then Messages and story replies, then Connected tools, then Allow access to messages. Without it every message call is refused, and Meta's wording makes it sound like a missing permission rather than a setting.
- Creator marketplace search returns SIMULATED creators until Meta grants Advanced Access. Every result says whether it is a sample, so nobody pitches a partnership to a creator who does not exist.
- Reading direct messages needs Advanced Access from Meta. Until that is granted, only people with a role on your Meta app appear: your own accounts show up in testing while a real customer's message returns an empty list with no error, which reads exactly like a quiet inbox.
- A conversation in Instagram's Requests folder with no activity for 30 days stops being returned by the API. The API cannot filter by folder at all: Meta does not expose Primary, Requests and General to it.
- Direct messages can only be answered within 24 hours of the person's last message. Meta enforces that window, so a reply to an older thread is refused even though the thread reads fine.
- A reply a PERSON wrote can use the Human Agent tag, which extends that window to 7 days. Send humanAgent: true only when a human actually composed it. An automated reply claiming otherwise is what the tag exists to prevent, and the penalty lands on the account.
- Reading direct messages needs a connection made through Facebook or through Instagram with messaging granted. On the Facebook door the inbox belongs to the Page, and Messenger threads are filtered out.
Two ways to connect
What a connection can do depends on how it was made, not only on which network it is. Pass variant when you create a connect link.
- Connect with Instagram Post, read and answer comments, see insights, and get mentions.
Needs: A professional Instagram account (business or creator)
- Connect with Facebook Everything the Instagram option does, plus deleting posts, liking, hiding comments, hashtag search, shopping tags and scheduled events.
Needs: A professional Instagram account (business or creator), That account linked to a Facebook Page
Only this way: deletePost, engages, hideComments, discovers.posts, discovers.profiles, discovers.profilePosts, products, upcomingEvents
| Option | Type | Values | Notes |
|---|
shareToFeed | boolean | — | Also show in feed (Reels) (video only) |
locationId | string | — | A Facebook Page place id to tag as the post's location. |
collaborators | string | — | Comma-separated Instagram usernames to invite as collaborators. |
thumbOffset | number | — | Milliseconds into a Reel to use as the cover thumbnail. (video only) |
upcomingEventId | string | — | The id of a scheduled event on the account, from the events call. Puts a reminder button on the post. Events are created in the Instagram app. |
productIds | string | — | Comma-separated product ids from your Instagram catalogue. Find them with the products call on the account. Photos only: Instagram does not take shopping tags on video. (image only) |
LinkedIn
- Caption 3,000 characters
- Media text on its own is fine, up to 20 images, video up to 1800s (image 8MB, video 500MB)
- Formats image/jpeg, image/png, image/gif, video/mp4
- Threads No First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile No
- Engagement
like unlike
- Hide a reply on your post No Direct messages No
Built, waiting on permission. These work in the code and are switched off until LinkedIn grants access:
reads.comments: r_member_social (LinkedIn grants it to selected partners only, not self-serve)
| Option | Type | Values | Notes |
|---|
visibility | enum | PUBLIC CONNECTIONS | Who can see it |
allowReshare | boolean | — | Allow resharing |
Pinterest
- Caption 500 characters
- Media media required, up to 5 images, 1 video, video up to 900s (image 20MB, video 2048MB)
- Formats image/jpeg, image/png, video/mp4
- Threads No First comment No Delete a live post Yes
- Reply to a comment No Edit your profile No
- Engagement
repost follow unfollow
- Hide a reply on your post No Direct messages No
| Option | Type | Values | Notes |
|---|
boardId | string | — | Overrides the board chosen at connect time. List them with the account's targets. |
boardSectionId | string | — | Pins into a section of the board. Section ids come back from the account's targets, named as 'Board / Section'. |
link | string | — | Destination link |
title | string | max 100 chars | Shown in the Pinterest grid. Falls back to the post text when unset. |
altText | string | max 500 chars | Alt text |
thumbnail | string | — | A JPEG or PNG media id. If omitted, Pinterest uses frame 0 of the video. |
Threads
- Caption 500 characters
- Media text on its own is fine, up to 20 images, 1 video, video up to 300s (image 8MB, video 1024MB)
- Formats image/jpeg, image/png, video/mp4, video/quicktime
- Threads No First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile No
- Engagement not yet
- Hide a reply on your post Yes Direct messages No
- Search the network search posts, look someone up, read their posts, find a place to tag
- Keyword search answers with an EMPTY LIST rather than an error until threads_keyword_search is approved, unlike profile lookup which says the access tier is insufficient. So an empty search result is not proof that nothing matched: check the permission before concluding a topic is quiet.
- Notifications on Threads are mentions only. Threads exposes no way to read likes, follows or reposts, so a quiet notifications page does not mean a quiet week.
- Profile lookup only returns public profiles with at least 100 followers.
- Searching is capped at 2,200 queries a day. Searches that find nothing do not count.
- Deleting is capped at 100 posts a day.
- A poll can only go on a text-only post.
- Alt text is supported, per image, including each slide of a carousel.
- Until threads_location_tagging is approved, every place search answers as if you had searched for Menlo Park. That is Meta's sandbox, not a bug, and it resolves on approval.
- Sharing a thread on to a linked Instagram account works, and is separate from the Threads app setting that crossposts everything. Verified live 2026-08-17 with the app setting off.
- A delete is sometimes reported as unverified. Threads' read layer lags its own delete by a few seconds, so the post is gone even when we could not confirm it inside the request.
| Option | Type | Values | Notes |
|---|
replyControl | enum | everyone accounts_you_follow mentioned_only parent_post_author_only followers_only | Who can reply |
topicTag | string | max 50 chars | Topic tag |
locationId | string | — | A place id from GET /v1/discover/places. Ids from other networks will not work. |
shareToInstagram | boolean | — | Crossposts the published thread to the linked Instagram account. Ignored when no Instagram account is linked. |
link | string | — | URL shown as a link preview on a text post. |
quotePostId | string | — | The id of a Threads post to quote. |
pollOptions | string | — | Two to four options, comma separated, 25 characters each. Text-only posts. |
allowlistedCountries | string | — | ISO country codes, comma separated. Only these countries see the post. |
spoiler | boolean | — | Hide media behind a spoiler |
replyApprovals | boolean | — | Approve replies before they show |
TikTok
- Caption 2,200 on video, 4,000 on photo characters
- Media media required, up to 35 images, 1 video, video up to 600s (image 20MB, video 4096MB, image at most 1080x1920, at least 540x960)
- Title up to 90 characters (image posts)
- Formats image/jpeg, image/webp, video/mp4, video/quicktime, video/webm
- Threads No First comment No Delete a live post No
- Reply to a comment No Edit your profile No
- Engagement not yet
- Hide a reply on your post No Direct messages No
- Publishing is asynchronous the post enters
processing and settles once the network confirms
- Publishing is asynchronous. Once TikTok confirms publication the target is published; if public moderation has not exposed the post id yet, permalinkPending stays true until the exact URL is resolved.
- Privacy options come live from TikTok creator_info and are passed through unchanged.
- Media is pulled from a verified URL (PULL_FROM_URL); PostLake's media domain is verified.
| Option | Type | Values | Notes |
|---|
mode | enum | direct inbox | direct = publish immediately; inbox = send to the creator's TikTok inbox as a draft they finish inside the TikTok app (max 5 pending per 24h, needs the video.upload scope). |
privacyLevel | enum | PUBLIC_TO_EVERYONE MUTUAL_FOLLOW_FRIENDS FOLLOWER_OF_CREATOR SELF_ONLY | Must be one of the creator's available options (see publish-info). Defaults to PUBLIC_TO_EVERYONE for API calls. |
title | string | max 90 chars | Photo post title (image only) |
allowComment | boolean | — | Defaults to on when omitted (API/MCP). Pass false to disable. Compose UI still starts unchecked per TikTok guidelines. |
allowDuet | boolean | — | Allow Duet (video only) |
allowStitch | boolean | — | Allow Stitch (video only) |
coverTimestampMs | number | — | Video cover frame (ms) (video only) |
photoCoverIndex | number | — | Cover image index (image only) |
autoAddMusic | boolean | — | Auto-add music (photo posts) (image only) |
brandContent | boolean | — | Paid partnership (branded content) |
brandOrganic | boolean | — | Promoting my own business |
isAigc | boolean | — | AI-generated content disclosure |
X
- Caption 280 characters
- Media text on its own is fine, up to 4 images, 1 video, video up to 140s (image 5MB, video 512MB)
- Formats image/jpeg, image/png, image/webp, image/gif, video/mp4
- Threads Yes First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile No
- Engagement not yet
- Hide a reply on your post No Direct messages Yes
| Option | Type | Values | Notes |
|---|
replySettings | enum | everyone following mentionedUsers subscribers | Who can reply |
superFollowersOnly | boolean | — | Super Followers only |
YouTube
- Caption 5,000 characters
- Media video required, 1 video (video 2048MB)
- Title up to 100 characters (video posts)
- Formats video/mp4, video/quicktime, video/webm
- Threads No First comment Yes Delete a live post Yes
- Reply to a comment Yes Edit your profile No
- Engagement
like unlike follow unfollow
- Hide a reply on your post No Direct messages No
| Option | Type | Values | Notes |
|---|
privacyStatus | enum | public unlisted private | Privacy |
categoryId | string | — | Category id |
tags | string | — | Tags (comma-separated) |
title | string | max 100 chars | Video title |
madeForKids | boolean | — | Made for kids |
license | enum | youtube creativeCommon | License |
Read the live capabilities
Don't hard-code limits. GET /v1/platforms (all) and GET /v1/platforms/{platform} (one) return the authoritative, current capability set for each network. Max characters, media rules, posts/day, async-publish behaviour, and the valid platformOptions. Agents use this to validate a post before sending it.
{
"platform": "bluesky", "displayName": "Bluesky",
"maxChars": 300, "asyncPublish": false,
"media": { "images": 4, "video": true }
}
Quirks worth knowing
- X uses dedicated credit rates: 6 credits for text and 75 for a post with a link. X publishing requires a paid plan or credit pack.
- TikTok & YouTube are video-only; a text/image post to them fails that target.
- Pinterest needs a
boardId in platformOptions.
- Instagram, TikTok, Facebook, YouTube require business/creator accounts and each platform's app review before going Live.