Configurations
The optional config object on a post holds per-platform settings keyed by platform identifier. When a post fans out, each target receives only the config slice for its own platform — so config.youtube reaches a YouTube target, config.tiktok reaches a TikTok target, and a platform with no slice simply uses its defaults. This is how you set a YouTube title, choose a Pinterest board, lock a TikTok video to a private audience, or control LinkedIn visibility, all from a single request.
The platform keys are the canonical identifiers: x, linkedin, instagram, tiktok, facebook, threads, bluesky, youtube, pinterest, reddit, and the underscore form google_business. The stored object is echoed back as default_config on the post, and the per-platform slice is copied onto each target. Every field below is optional unless explicitly marked required; unknown fields are ignored.
One config map, keyed by platform
config object with one key per platform. Adding an account for a platform that is not present in config publishes that platform with its defaults.X (Twitter)
Key config.x. The only publishing switch is the long-form toggle for X Premium accounts; otherwise the adapter reads an optional username used purely to render the permalink. Reply settings and polls are not supported.
| Field | Type | Default | Notes |
|---|---|---|---|
long_form | boolean | false | Raise the character ceiling to 25,000 for an X Premium account. Aliases: longForm, premium. Without it the limit is 280 and longer content is rejected. |
username | string | account handle | Only used to build the platform_post_url; does not affect publishing. |
A first comment or thread is expressed with extra containers, not config.
Key config.linkedin. Controls post visibility, whether the post is authored by the member or one of their organization pages, and an optional article/document attachment.
| Field | Type | Default | Notes |
|---|---|---|---|
visibility | string | PUBLIC | One of PUBLIC, CONNECTIONS, LOGGED_IN. |
organizationId | string | — | Publish as an allowed organization page; combined into urn:li:organization:{id}. Omit to post as the authenticated member. |
organizationUrn | string | — | Full organization author URN. Must match an organization stored on the connected account and takes precedence over organizationId. |
articleUrl | string | — | Share an article link. When set, the post becomes an article share; an image in the main container is uploaded as the thumbnail. |
articleTitle | string | — | Title shown on the article card (with articleUrl). |
articleDescription | string | — | Description shown on the article card (with articleUrl). |
documentTitle | string | — | Title for a document (PDF) attachment when the main container carries a document. |
Key config.instagram. Instagram is a Business/Creator-only, URL-ingest platform. Carousels are inferred automatically from the number of media items in the main container (2–10 items), and reels share to the main feed by default — neither needs a config field. The one switch is publishing as a Story.
| Field | Type | Default | Notes |
|---|---|---|---|
publishAsStory | boolean | false | Publish the media as a Story (STORIES). Stories never carousel and ignore the caption. |
thumb_offset | number | media thumbnail | Reels cover frame offset (ms). Overrides the default cover, which is the video’s media thumbnail. Alias: thumbOffset. |
Carousels & reels are automatic
share_to_feed) automatically. Optional collaborators (an array of usernames, feed posts only) and location_id (a Facebook place id) are passed through to the post. First comments require the instagram_manage_comments scope and are sent as native comments after publish.TikTok
Key config.tiktok. Sets the post's privacy and interaction permissions and the commercial-content disclosure flags. Field names are snake_case, matching TikTok's Content Posting API.
| Field | Type | Default | Notes |
|---|---|---|---|
privacy_level | string | SELF_ONLY | TikTok privacy level, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY. |
post_mode | string | DIRECT_POST | One of DIRECT_POST (publish straight to the feed) or INBOX (deliver an editable draft to the creator’s TikTok inbox). Alias: postMode. |
disable_comment | boolean | false | Disable comments on the video. |
disable_duet | boolean | false | Disable Duet. |
disable_stitch | boolean | false | Disable Stitch. |
auto_add_music | boolean | true | Photo carousels only: overlay a TikTok soundtrack on the carousel. Alias: autoAddMusic. |
video_cover_timestamp_ms | number | media thumbnail frame | Timestamp (ms) of the frame to use as the cover image. Defaults to the frame the video’s media thumbnail was generated from. |
video_duration_sec | number | — | Hint of the clip’s duration in seconds, used in the creator-info pre-flight check. |
disclose | boolean | false | Master switch: the post discloses commercial content. When true, set one of brand_content_toggle or brand_organic_toggle (else the post is rejected). |
brand_content_toggle | boolean | false | Paid partnership / branded-content disclosure. Cannot be combined with SELF_ONLY privacy. |
brand_organic_toggle | boolean | false | Your-own-brand promotion disclosure. Alias: commercial. |
TikTok defaults to a private post
privacy_level is omitted the video is created as SELF_ONLY (visible only to the creator). Set it explicitly to publish publicly. TikTok requires exactly one video in the main container.Key config.facebook. Posts publish to the connected Page; the one field below is optional.
| Field | Type | Default | Notes |
|---|---|---|---|
link | string | — | Link to attach to a text post; Facebook renders a link preview. Ignored when the post carries a photo or video. |
Threads
Key config.threads. Controls who can reply, an optional outbound link on text-only posts, and a topic tag.
| Field | Type | Default | Notes |
|---|---|---|---|
reply_control | string | everyone | Audience allowed to reply: everyone, accounts_you_follow, or mentioned_only. |
link_attachment | string | — | Outbound link for a text-only post. Ignored when the post carries media. |
topic_tag | string | — | Topic tag applied to the post. |
Bluesky
Key config.bluesky. Bluesky has no per-post configuration fields — pass nothing. Links and @handlementions in the text are detected and rendered as rich text automatically. For a self-hosted account, the Personal Data Server (PDS) host is resolved automatically from the account’s handle when you connect it, so it never needs to be set on a post.
The PDS host is not a config field
service / pds / serviceUrl are notaccepted on a post. The PDS host is fixed server-side from the account’s connect-time identity (DID document) — accepting it per-post would let a request redirect the credential-bearing session call to an arbitrary host. Connect a custom-PDS account by its handle and it resolves on its own.YouTube
Key config.youtube. The container's content becomes the video description; title sets the video title. For compatibility these fields are also accepted nested under config.youtube.youtubeConfiguration.
| Field | Type | Default | Notes |
|---|---|---|---|
title | string | container content | Video title, capped at 100 characters. |
isShort | boolean | false | Publish as a Short; appends #Shorts to the title and description. |
categoryId | string | "22" | YouTube category id (22 = People & Blogs). |
privacyStatus | string | public | One of public, private, unlisted. |
madeForKids | boolean | false | Self-declared "made for kids" flag (selfDeclaredMadeForKids). |
tags | string[] | [] | Video tags. |
thumbnailUrl | string | media thumbnail | Custom video thumbnail (public HTTPS URL); set via thumbnails.set after upload. Needs a verified channel. Alias: thumbnail_url. |
YouTube requires a video
Key config.pinterest. A pin always lands on a board, so board_id is required. The container's content becomes the pin description; title falls back to it when omitted, and alt_textfalls back to the media's alt text.
| Field | Type | Default | Notes |
|---|---|---|---|
board_id | string | required | The board the pin is created on. Alias: boardId. |
title | string | container content | Pin title, capped at 100 characters. |
link | string | — | Destination link rendered on the pin. |
alt_text | string | media alt text | Accessibility text, capped at 500 characters. Alias: altText. |
video_media_id | string | — | For video pins only: the media_id from the pre-registered video upload. Aliases: media_id, videoMediaId. |
cover_image_url | string | media thumbnail | Cover image (public HTTPS URL) for a video pin. Defaults to the video’s media thumbnail, then a sibling image. Alias: coverImageUrl. |
Pinterest requires a board and at least one image
board_idis mandatory and a pin must carry at least one image — there are no text-only pins. 2–5 images publish as a multi-image pin. Video pins additionally require video_media_id and a cover_image_url. Pinterest has no comments API, so first comments and threads are ignored.Google Business
Key config.google_business(underscore form). Selects the post topic and, for events and offers, the structured event/offer detail. The container's content becomes the post summary (capped at 1,500 characters).
| Field | Type | Default | Notes |
|---|---|---|---|
topicType | string | STANDARD | One of STANDARD, EVENT, OFFER. |
languageCode | string | en-US | BCP-47 language code for the post. |
callToAction | object | — | { actionType, url }. actionType is one of BOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP, CALL (CALL takes no url). |
event | object | — | Required for EVENT and OFFER. { title, startDate, endDate, startTime, endTime }; title is required. Dates are { year, month, day }, times are { hours, minutes }. |
offer | object | — | For OFFER posts: { couponCode, redeemOnlineUrl, termsConditions }. |
locationName | string | — | Fully-qualified post parent accounts/{a}/locations/{l}. Built from accountId plus the account's location when omitted. |
accountId | string | — | Account id (or accounts/{id}), combined with the location id to form the post parent when locationName is absent. |
EVENT and OFFER require an event title
event.title is missing. Because Google deprecated post-level insights, analytics returns no metrics for Google Business targets.Key config.reddit. A submission always targets a subreddit, so subredditis required. The post kind is auto-detected from the content/media when omitted; the container's content becomes a self-post body or supplies the link.
| Field | Type | Default | Notes |
|---|---|---|---|
subreddit | string | required | Target subreddit, without the r/ prefix (e.g. webdev). |
title | string | container content | Post title, capped at 300 characters. |
kind | string | auto | One of self, link, image. Auto-detected from the content/media when omitted. |
url | string | first link | Destination URL for a link post. Defaults to the first link in the content. Required for kind: link. |
flair_id | string | — | Post flair id for subreddits that require/allow flair. Alias: flairId. |
nsfw | boolean | false | Mark the post NSFW. |
spoiler | boolean | false | Mark the post as a spoiler. |
send_replies | boolean | true | Whether reply notifications are enabled. |
Example: one post, three platforms
A single post fanned out to YouTube, Pinterest and TikTok, each with its own config slice. Platforms not present in config (here, none) would simply use their defaults.
curl https://api.postfuze.com/api/v1/posts \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{
"content": "Behind the scenes of our launch week 🎬",
"media": [{ "id": "media_launch_clip" }],
"accounts": ["acct_yt_01", "acct_pin_01", "acct_tt_01"],
"config": {
"youtube": {
"title": "Launch Week — Behind the Scenes",
"isShort": true,
"privacyStatus": "unlisted",
"tags": ["launch", "behindthescenes"]
},
"pinterest": {
"board_id": "987654321",
"title": "Launch Week BTS",
"link": "https://postfuze.com/blog/launch-week"
},
"tiktok": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"disable_duet": true,
"disable_stitch": true
}
}
}'{
"id": "p7c8d9e0-0000-4a9f-9b1c-2e7d6f0a9876",
"status": "queued",
"is_draft": false,
"default_config": {
"youtube": { "title": "Launch Week — Behind the Scenes", "isShort": true, "privacyStatus": "unlisted", "tags": ["launch", "behindthescenes"] },
"pinterest": { "board_id": "987654321", "title": "Launch Week BTS", "link": "https://postfuze.com/blog/launch-week" },
"tiktok": { "privacy_level": "PUBLIC_TO_EVERYONE", "disable_duet": true, "disable_stitch": true }
},
"containers": [
{ "id": "c_0001", "position": 0, "role": "main", "content": "Behind the scenes of our launch week 🎬" }
],
"targets": [
{ "id": "t_0001", "social_account_id": "acct_yt_01", "platform": "youtube", "status": "queued", "platform_post_id": null },
{ "id": "t_0002", "social_account_id": "acct_pin_01", "platform": "pinterest", "status": "queued", "platform_post_id": null },
{ "id": "t_0003", "social_account_id": "acct_tt_01", "platform": "tiktok", "status": "queued", "platform_post_id": null }
]
}The stored config is returned as default_config, and each target receives only its platform's slice. See Posts for the full post lifecycle and the individual platform guides for per-platform media constraints and OAuth scopes.