Skip to main content

Documentation Index

Fetch the complete documentation index at: https://info.bundle.social/llms.txt

Use this file to discover all available pages before exploring further.

When you create or update a post, data is keyed by platform — data.TWITTER, data.TIKTOK, etc. Each platform accepts its own set of fields. This page is the field reference for all of them. (For connecting accounts and platform quirks, see the per-platform pages under Platforms in the sidebar.)
  • uploadIds are ids returned by upload-content.
  • thumbnail (where present) is a public URL of an image already uploaded to bundle.social — use it as a video cover when an offset isn’t enough.
  • Bold = required for that platform.
The CLI builds data for you: --contenttext, -muploadIds, --platform-settings '{"<P>":{...}}' → merged into data.<P>. The same fields apply to the SDK and the MCP server. Snippets below that say integrations:trigger … are the CLI form of the same trigger_integration_tool MCP tool / misc.* SDK helper.

X / Twitter — data.TWITTER

FieldTypeNotes
textstringPost text. ~280 chars (longer if the connected account is X Premium).
uploadIdsstring[]Up to 4 images or 1 video/GIF.
replySettingsEVERYONE | FOLLOWING | MENTIONED_USERS | SUBSCRIBERS | VERIFIEDWho can reply.
Threads: post the first tweet, then add the rest as replies with comments:create --post-id <id> -c "..." -c "..." (X threads go through the comments API, not data). No analytics surface for X.
{ "TWITTER": { "text": "Shipping day 🚀", "replySettings": "EVERYONE" } }

Bluesky — data.BLUESKY

FieldTypeNotes
textstring~300 chars.
uploadIdsstring[]Up to 4 images, or 1 video (set videoAlt).
tagsstring[]Extra hashtags (without #), up to 8.
labels(!no-unauthenticated | porn | sexual | nudity | graphic-media)[]Self-labels / content warnings.
quoteUristringAT-URI of a post to quote (at://…/app.bsky.feed.post/<rkey>).
externalUrl / externalTitle / externalDescriptionstringExternal link card.
videoAltstringAlt text for a video embed.
{ "BLUESKY": { "text": "New post", "tags": ["launch", "indie"], "externalUrl": "https://bundle.social" } }

Mastodon — data.MASTODON

FieldTypeNotes
textstringLength depends on the connected instance (commonly ~500).
uploadIdsstring[]Up to 4 images or 1 video.
privacyPUBLIC | UNLISTED | PRIVATE | DIRECTVisibility.
spoilerstringContent-warning text (collapses the post behind it).
thumbnailstring (URL)Cover image for a video.
{ "MASTODON": { "text": "Hello fediverse", "privacy": "PUBLIC", "spoiler": "long read" } }

Threads — data.THREADS

FieldTypeNotes
textstring~500 chars.
uploadIdsstring[]Up to ~10 images, or 1 video.
mediaItems{ uploadId, altText? }[]Per-image alt text (alternative to uploadIds).
{ "THREADS": { "text": "Quick thought", "mediaItems": [{ "uploadId": "<id>", "altText": "chart" }] } }

LinkedIn — data.LINKEDIN

FieldTypeNotes
textstringRequired. ~3000 chars. Works for a personal profile or a company page depending on which account the user connected.
uploadIdsstring[]Images, a single video, or a document/PDF.
linkstring (URL)For an article-preview post.
mediaTitlestringTitle for a video or document post (LinkedIn otherwise shows the post date under videos).
privacyCONNECTIONS | PUBLIC | LOGGED_IN | CONTAINERVisibility.
hideFromFeedbooleanDon’t show in the main feed.
disableResharebooleanDisallow resharing.
Mentions: discover URNs with integrations:trigger linkedin:mentions --data '{"q":"...","scope":"organizations"}' and put them in text.
{ "LINKEDIN": { "text": "We just shipped X.", "privacy": "PUBLIC", "mediaTitle": "Demo" } }

Facebook (Page) — data.FACEBOOK

FieldTypeNotes
typePOST | REEL | STORYDefault POST.
textstringCaption / message.
uploadIdsstring[]Images, or a single video.
mediaItems{ uploadId, altText? }[]Per-image alt text.
linkstring (URL)Link attachment — type: POST only.
mediaTitlestringVideo title — type: POST with a video only (not REEL/STORY).
thumbnailstring (URL)Video cover image.
nativeScheduleTimestring (ISO 8601, local)Schedule directly in Meta’s scheduler instead of publishing now; max 30 days ahead.
{ "FACEBOOK": { "type": "POST", "text": "Look at this", "link": "https://bundle.social" } }

Instagram — data.INSTAGRAM

FieldTypeNotes
typePOST | REEL | STORYPOST = single image, carousel (carouselItems), or feed video; REEL = single video; STORY = image or short video.
textstringCaption.
uploadIdsstring[]Single image/video for POST/REEL/STORY. Square ≥1080×1080 or portrait 4:5; Reels 9:16, up to 90s.
altTextstringAlt text for a single-image post.
carouselItems{ uploadId, altText?, tagged?: { username, x, y }[] }[]Carousel slides (for type: POST).
thumbnailOffsetnumber (ms)Frame to use as the published video’s cover.
thumbnailstring (URL)Cover image (alternative to offset).
shareToFeedbooleanReels only — also show in the Feed tab.
collaboratorsstring[]Usernames to invite as collaborators.
tagged{ username, x?, y? }[]People tags for a single-image post.
locationIdstringA location id — discover with integrations:trigger instagram:locations --data '{"q":"..."}'.
autoFitImage / autoCropImagebooleanLet bundle.social fit/crop the image to a valid aspect ratio.
trialParams{ graduationStrategy: "MANUAL" | "SS_PERFORMANCE" }Reels only — trial reels are shown to non-followers first.
Account types are connected via Facebook or directly via Instagram (instagramConnectionMethod on the integration).
{ "INSTAGRAM": { "type": "REEL", "text": "BTS", "shareToFeed": true, "thumbnailOffset": 1500 } }
{ "INSTAGRAM": { "type": "POST", "text": "Carousel", "carouselItems": [
  { "uploadId": "<id1>", "altText": "slide 1" },
  { "uploadId": "<id2>", "altText": "slide 2" }
] } }

TikTok — data.TIKTOK

FieldTypeNotes
typeVIDEO | IMAGEVIDEO = 1 video; IMAGE = photo carousel.
privacyPUBLIC_TO_EVERYONE | MUTUAL_FOLLOW_FRIENDS | FOLLOWER_OF_CREATOR | SELF_ONLYEffectively required by TikTok.
textstringCaption.
uploadIdsstring[]The video, or the photos for type: IMAGE. Video: MP4/MOV/WEBM, ≥540p, portrait 9:16 recommended, up to ~10 min.
photoCoverIndexnumberWhich photo is the cover (for type: IMAGE).
thumbnailOffsetnumber (ms)Frame to use as the video cover.
thumbnailstring (URL)Cover image (alternative to offset).
isBrandContent / isOrganicBrandContentbooleanDisclosure: paid third-party partnership / promoting your own business.
disableComments / disableDuet / disableStitchbooleanInteraction restrictions.
isAiGeneratedbooleanMark the video as AI-generated.
autoAddMusicbooleanLet TikTok add music to photos.
autoScalebooleanAuto-scale the video.
uploadToDraftbooleanUpload as a TikTok draft instead of publishing.
musicSoundInfo{ musicSoundId, musicSoundVolume?, musicSoundStart?, musicSoundEnd?, videoOriginalSoundVolume? }Commercial music — get a song_clip_id from integrations:trigger tiktok:trending-music. Volumes 0–100; start/end in ms.
{ "TIKTOK": { "type": "VIDEO", "text": "Launch BTS", "privacy": "PUBLIC_TO_EVERYONE", "disableStitch": true } }

YouTube — data.YOUTUBE

FieldTypeNotes
typeVIDEO | SHORTSHORT = vertical ≤60s; VIDEO = full upload.
uploadIdsstring[]One video.
textstringThe video title (the post --title flag also maps here).
descriptionstringVideo description.
thumbnailstring (URL)Custom thumbnail (type: VIDEO).
privacyPUBLIC | UNLISTED | PRIVATEVisibility.
madeForKidsbooleanRequired-ish — YouTube needs you to declare this.
containsSyntheticMediabooleanMark AI-generated content.
hasPaidProductPlacementbooleanDeclare paid placements.
(There’s no categoryId in the post data itself — fetch categories with integrations:trigger youtube:categories --data '{"regionCode":"US"}'; playlist management is via the SDK’s misc.youtube* methods / integrations:trigger youtube:playlists.)
{ "YOUTUBE": { "type": "SHORT", "text": "Launch BTS", "description": "Behind the scenes…", "privacy": "PUBLIC", "madeForKids": false } }

Reddit — data.REDDIT

FieldTypeNotes
srstringSubreddit (r/subredditName) or u/username.
textstringThe post title for link/text posts (Reddit’s “title”).
descriptionstringThe body for a self post.
uploadIdsstring[]An image or video.
linkstring (URL)Link post target.
nsfwbooleanMark NSFW.
flairIdstringRequired if the subreddit requires a flair — get options with integrations:trigger reddit:flairs --data '{"subreddit":"r/<sub>"}'.
Before posting, run integrations:trigger reddit:requirements --data '{"subreddit":"r/<sub>"}' to learn title length limits, allowed post types, and whether a flair is required.
{ "REDDIT": { "sr": "r/dataisbeautiful", "text": "Our 2026 growth, visualized", "uploadIds": ["<id>"], "flairId": "<flair-id>" } }

Discord — data.DISCORD

FieldTypeNotes
channelIdstringThe connected server channel (an integration “channel” id — see integrations:list).
textstringMessage content. ≤2000 chars.
uploadIdsstring[]Attachments.
usernamestringOverride the author name shown (webhook).
avatarUrlstring (URL)Override the author avatar (webhook).
{ "DISCORD": { "channelId": "<channel-id>", "text": "New release 🎉" } }

Slack — data.SLACK

FieldTypeNotes
channelIdstringThe connected workspace channel (an integration “channel” id — see integrations:list).
textstringMessage text.
uploadIdsstring[]Attachments.
usernamestringOverride the author name shown.
avatarUrlstring (URL)Override the author avatar.
{ "SLACK": { "channelId": "<channel-id>", "text": "Standup notes…" } }

Google Business Profile — data.GOOGLE_BUSINESS

FieldTypeNotes
textstringThe update body.
uploadIdsstring[]Images/videos.
topicTypeSTANDARD | EVENT | OFFER | ALERTPost kind.
languageCodestringLanguage tag like en / en-US.
callToActionTypeBOOK | ORDER | SHOP | LEARN_MORE | SIGN_UP | CALLCTA button.
callToActionUrlstring (URL)CTA target.
eventTitle / eventStartDate / eventEndDatestringFor topicType: EVENT.
offerCouponCode / offerRedeemOnlineUrl / offerTermsConditionsstringFor topicType: OFFER.
alertTypeCOVID_19For topicType: ALERT.
Set the location up in the dashboard first; details/categories/hours are managed via the SDK’s misc.googleBusiness* methods (integrations:trigger gbp:location, gbp:categories).
{ "GOOGLE_BUSINESS": { "text": "Now open Saturdays!", "topicType": "STANDARD", "callToActionType": "LEARN_MORE", "callToActionUrl": "https://example.com" } }

Pinterest — data.PINTEREST

FieldTypeNotes
boardNamestringThe board to pin to.
uploadIdsstring[]One image (or video).
textstringThe Pin title.
descriptionstringPin description.
linkstring (URL)Where the Pin links to.
altTextstringImage alt text.
notestringPrivate note (not public).
thumbnailstring (URL)Cover image.
dominantColorstringHex color used as a placeholder before the image loads.
{ "PINTEREST": { "boardName": "Inspiration", "text": "New idea", "uploadIds": ["<id>"], "link": "https://bundle.social" } }

Media notes

Images: JPG / PNG / WEBP / GIF. Video: MP4 / MOV / WEBM. Upload media first (or let the CLI’s -m do it), then put ids in uploadIds (and carouselItems[].uploadId / mediaItems[].uploadId). Large videos can take a while to process server-side after upload — a newly created post may sit in PROCESSING before going POSTED; check with posts:get <id>, and posts:retry <id> for a transient platform failure.