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

A post created for several accounts on different platforms carries one 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.

FieldTypeDefaultNotes
long_formbooleanfalseRaise 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.
usernamestringaccount handleOnly used to build the platform_post_url; does not affect publishing.

A first comment or thread is expressed with extra containers, not config.

LinkedIn

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.

FieldTypeDefaultNotes
visibilitystringPUBLICOne of PUBLIC, CONNECTIONS, LOGGED_IN.
organizationIdstringPublish as an allowed organization page; combined into urn:li:organization:{id}. Omit to post as the authenticated member.
organizationUrnstringFull organization author URN. Must match an organization stored on the connected account and takes precedence over organizationId.
articleUrlstringShare an article link. When set, the post becomes an article share; an image in the main container is uploaded as the thumbnail.
articleTitlestringTitle shown on the article card (with articleUrl).
articleDescriptionstringDescription shown on the article card (with articleUrl).
documentTitlestringTitle for a document (PDF) attachment when the main container carries a document.

Instagram

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.

FieldTypeDefaultNotes
publishAsStorybooleanfalsePublish the media as a Story (STORIES). Stories never carousel and ignore the caption.
thumb_offsetnumbermedia thumbnailReels cover frame offset (ms). Overrides the default cover, which is the video’s media thumbnail. Alias: thumbOffset.

Carousels & reels are automatic

2–10 media items in the main container publish as a carousel; a single video publishes as a reel and is shared to the feed (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.

FieldTypeDefaultNotes
privacy_levelstringSELF_ONLYTikTok privacy level, e.g. PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY.
post_modestringDIRECT_POSTOne of DIRECT_POST (publish straight to the feed) or INBOX (deliver an editable draft to the creator’s TikTok inbox). Alias: postMode.
disable_commentbooleanfalseDisable comments on the video.
disable_duetbooleanfalseDisable Duet.
disable_stitchbooleanfalseDisable Stitch.
auto_add_musicbooleantruePhoto carousels only: overlay a TikTok soundtrack on the carousel. Alias: autoAddMusic.
video_cover_timestamp_msnumbermedia thumbnail frameTimestamp (ms) of the frame to use as the cover image. Defaults to the frame the video’s media thumbnail was generated from.
video_duration_secnumberHint of the clip’s duration in seconds, used in the creator-info pre-flight check.
disclosebooleanfalseMaster 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_togglebooleanfalsePaid partnership / branded-content disclosure. Cannot be combined with SELF_ONLY privacy.
brand_organic_togglebooleanfalseYour-own-brand promotion disclosure. Alias: commercial.

TikTok defaults to a private post

When 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.

Facebook

Key config.facebook. Posts publish to the connected Page; the one field below is optional.

FieldTypeDefaultNotes
linkstringLink 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.

FieldTypeDefaultNotes
reply_controlstringeveryoneAudience allowed to reply: everyone, accounts_you_follow, or mentioned_only.
link_attachmentstringOutbound link for a text-only post. Ignored when the post carries media.
topic_tagstringTopic 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.

FieldTypeDefaultNotes
titlestringcontainer contentVideo title, capped at 100 characters.
isShortbooleanfalsePublish as a Short; appends #Shorts to the title and description.
categoryIdstring"22"YouTube category id (22 = People & Blogs).
privacyStatusstringpublicOne of public, private, unlisted.
madeForKidsbooleanfalseSelf-declared "made for kids" flag (selfDeclaredMadeForKids).
tagsstring[][]Video tags.
thumbnailUrlstringmedia thumbnailCustom video thumbnail (public HTTPS URL); set via thumbnails.set after upload. Needs a verified channel. Alias: thumbnail_url.

YouTube requires a video

A YouTube target needs exactly one video in the main container with a known byte size — there are no text-only YouTube posts. First comments and threads are not supported and extra containers are ignored.

Pinterest

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.

FieldTypeDefaultNotes
board_idstringrequiredThe board the pin is created on. Alias: boardId.
titlestringcontainer contentPin title, capped at 100 characters.
linkstringDestination link rendered on the pin.
alt_textstringmedia alt textAccessibility text, capped at 500 characters. Alias: altText.
video_media_idstringFor video pins only: the media_id from the pre-registered video upload. Aliases: media_id, videoMediaId.
cover_image_urlstringmedia thumbnailCover 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).

FieldTypeDefaultNotes
topicTypestringSTANDARDOne of STANDARD, EVENT, OFFER.
languageCodestringen-USBCP-47 language code for the post.
callToActionobject{ actionType, url }. actionType is one of BOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP, CALL (CALL takes no url).
eventobjectRequired for EVENT and OFFER. { title, startDate, endDate, startTime, endTime }; title is required. Dates are { year, month, day }, times are { hours, minutes }.
offerobjectFor OFFER posts: { couponCode, redeemOnlineUrl, termsConditions }.
locationNamestringFully-qualified post parent accounts/{a}/locations/{l}. Built from accountId plus the account's location when omitted.
accountIdstringAccount 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 and OFFER posts fail before publishing if event.title is missing. Because Google deprecated post-level insights, analytics returns no metrics for Google Business targets.

Reddit

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.

FieldTypeDefaultNotes
subredditstringrequiredTarget subreddit, without the r/ prefix (e.g. webdev).
titlestringcontainer contentPost title, capped at 300 characters.
kindstringautoOne of self, link, image. Auto-detected from the content/media when omitted.
urlstringfirst linkDestination URL for a link post. Defaults to the first link in the content. Required for kind: link.
flair_idstringPost flair id for subreddits that require/allow flair. Alias: flairId.
nsfwbooleanfalseMark the post NSFW.
spoilerbooleanfalseMark the post as a spoiler.
send_repliesbooleantrueWhether 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
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
      }
    }
  }'
201 Created
{
  "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.