BulkPublish: Platform Reference

Complete reference for the 15 BulkPublish platforms — post types, media requirements, required fields, character limits, and platformSpecific options. ALWAYS consult before creatin…

Muhammad Azeem

@azeemkafridi

Install

$ openclaw skills install @azeemkafridi/bulkpublish-platform-reference

BulkPublish — Platform Reference

Quick Rules

  • YouTube & TikTok require video — NEVER include them for image-only posts
  • Pinterest requires a title — set platformSpecific.pinterest.title
  • YouTube requires a title — set platformSpecific.youtube.title
  • Instagram defaults to feed_photo — set postTypeOverrides.instagram for video content
  • Use platformContent for shorter text on platforms with low char limits (Bluesky 300, Pinterest/Threads/Mastodon 500)

Facebook

FieldValue
Platform keyfacebook
Char limit63,206
Title requiredNo

Post types:

TypeMediaNotes
post (default)0-10 images OR 0-1 videoText-only OK. No mixing images+video
reel1 video requiredVertical short-form video
story1 image OR 1 video requiredDisappears after 24h

Media specs: Image max 10MB (jpg/png/gif/webp). Video max 2GB (mp4/mov). Reel video 3–90s, Story video 3–60s; a plain video post has no length limit.

platformSpecific options:

  • linkPreview.url
  • shareToStory — boolean, also post it as a story
  • thumbnailUrl — string, cover image URL for a video or Reel. Facebook only accepts a cover once the video exists, so it is applied after the video publishes and lands a moment after the post; a cover that cannot be fetched or that Facebook rejects leaves the video published with Facebook's own chosen frame rather than failing the post. Omit to let Facebook choose

Instagram

FieldValue
Platform keyinstagram
Char limit2,200
Title requiredNo
Account typeBusiness or Creator (personal rejected)

Post types:

TypeMediaNotes
feed_photo (default)1 image requiredSingle photo post
feed_video1 video requiredSingle video post
reel1 video requiredShort-form video, 9:16 recommended
story1 image OR 1 video requiredDisappears after 24h
carousel2-10 images/videos requiredMixed media OK

Media specs: Image max 8MB (jpg/jpeg only). Video max 1GB (mp4/mov). Reel and feed video 3s–15min, Story video 3–60s; carousel videos are not length-checked.

platformSpecific options:

  • collaborators — string (comma-separated) or array of usernames, without a leading @. Tagged as co-authors. Post types feed_photo, feed_video, reel and carousel; ignored on story
  • trialReel — boolean, trial reel shown to non-followers first. Only takes effect with postTypeOverrides.instagram: "reel"; ignored on feed_video
  • graduationStrategy — "manual" (default) or "auto"; ignored unless trialReel is true
  • shareToStory — boolean, also post it as a story
  • thumbnailTimestamp — number (seconds into the video) for the cover frame. Applies to reel AND feed_video. Ignored when coverUrl is also set
  • coverUrl — string, cover image URL for a video or Reel. Instagram accepts a cover image or a cover moment, never both, so this wins over thumbnailTimestamp

IMPORTANT: If you have video and don't set postTypeOverrides.instagram, it defaults to feed_photo and FAILS. Always set to reel or feed_video for video.


X / Twitter

FieldValue
Platform keyx
Char limit280 (25,000 for long posts)
Title requiredNo

Post types:

TypeMediaNotes
tweet (default)0-4 images OR 0-1 videoText-only OK. No mixing images+video
threadPer-part mediaUse postFormat: "thread" + threadParts

Media specs: Image max 5MB (jpg/png/gif/webp), max 4. Video max 512MB (mp4/mov), max 1, up to 140s (up to 4 hours with X Premium; X checks this, BulkPublish does not).


YouTube

FieldValue
Platform keyyoutube
Char limit5,000 (description)
Title requiredYES — platformSpecific.youtube.title (1-100 chars)
Video requiredYES — always

Post types:

TypeMediaNotes
video (default)1 video requiredStandard upload
short1 video requiredVertical, under 3 minutes

Media specs: Video max 128GB (mp4/mov/avi/wmv/flv/webm), max 1.

platformSpecific options:

  • title — REQUIRED, 1-100 chars (falls back to first line of content)
  • privacyStatus — public (default), private, unlisted
  • categoryId — YouTube category ID (default 22)
  • madeForKids — boolean (default false)
  • tags — string array
  • playlistId — add to playlist after upload
  • thumbnailUrl — custom thumbnail URL

IMPORTANT: YouTube ONLY accepts video. Never include YouTube channel for image-only posts.


TikTok

FieldValue
Platform keytiktok
Char limit2,200
Title requiredNo (uses content)
Video requiredYES (or images for slideshow)

Post types:

TypeMediaNotes
video (default)1 video requiredStandard video upload
photo_slideshow1-35 images requiredAuto-creates slideshow with music

Media specs: Video max 4GB (mp4/mov), max 1. Image max 20MB (jpg/jpeg/webp), max 35 for slideshow.

platformSpecific options:

  • privacyLevel — PUBLIC_TO_EVERYONE (default when omitted), MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY; any other value is rejected with 400, and TikTok accepts only the levels the connected account offers
  • disableDuet — boolean
  • disableStitch — boolean
  • disableComment — boolean
  • isAigc — boolean (AI-generated content disclosure)
  • thumbnailTimestamp — number (seconds into the video) for the cover frame

IMPORTANT: TikTok ONLY accepts video (or images for slideshow). Omitted privacy publishes as PUBLIC_TO_EVERYONE — ask the user and set privacyLevel explicitly.


LinkedIn

FieldValue
Platform keylinkedin
Char limit3,000
Title requiredNo (optional for articles/videos)

Post types:

TypeMediaNotes
post (default)0-1 image OR 0-1 videoText-only OK
multi_image2-20 images requiredImage gallery
pdf_carousel2-20 images requiredConverted to PDF carousel
article0-1 image (thumbnail)Link share, requires platformSpecific.url

Media specs: Image max 10MB (jpg/png/gif), max 20. Video max 500MB (mp4 only), max 1, 3s-30min.

Account types: personal (member profile) or organization (company page). Both are connected in the dashboard and then used like any other channel — list_channels reports which via accountType.

The two run on separate LinkedIn apps (company pages use the Community Management API, which LinkedIn requires to be the only product on its application), so they are gated separately. list_platforms reports company pages under variants.organization; the platform-level state covers personal profiles. Pages can be paused — no new page connections — while personal-profile posting is fully live. When a variant is what blocks a write, the 403 PLATFORM_DISABLED error carries an accountType field naming it.

platformSpecific options:

  • title — article/video title
  • description — article description
  • url — REQUIRED for article type, link URL
  • carouselTitle — PDF carousel title

Pinterest

FieldValue
Platform keypinterest
Char limit500
Title requiredYES — platformSpecific.pinterest.title (1-100 chars)
Board requiredYES — platformSpecific.pinterest.boardId (auto-creates "BulkPublish" board if missing)

Post types:

TypeMediaNotes
pin (default)1 image requiredStandard pin, 2:3 ratio recommended
video_pin1 video requiredVideo pin
carousel2-5 images requiredMulti-image pin

Media specs: Image max 20MB (jpg/png/webp), max 5. 1000x1500 recommended. Video mp4/mov, max 1, 4s to 5 min; Pinterest publishes no file size for ordinary video pins (2GB is its video-ads figure).

platformSpecific options:

  • title — REQUIRED, 1-100 chars (falls back to first 100 chars of content)
  • description — pin description, max 500 chars
  • link — destination URL
  • boardId — target board ID (get from get_channel_options)
  • dominantColor — hex color
  • coverImageUrl — video pin cover image. Optional: when omitted the server uses an attached image, then the video's auto-extracted poster frame

Threads

FieldValue
Platform keythreads
Char limit500
Title requiredNo

Post types:

TypeMediaNotes
text (default)NoneText-only post
image1 image requiredPhoto post
video1 video requiredVideo post
carousel2-20 images/videosMixed media OK
threadPer-partUse postFormat: "thread" + threadParts

Media specs: Image max 8MB (jpg/png), max 20. Video max 500MB (mp4/mov), max 20, each up to 5 min.

platformSpecific options: quotePostId — quote another Threads post


Bluesky

FieldValue
Platform keybluesky
Char limit300
Title requiredNo

Post types:

TypeMediaNotes
post (default)0-4 images OR 0-1 videoText-only OK. No mixing.
threadPer-partUse postFormat: "thread" + threadParts

Media specs: Image max 10MB auto-resized to <976KB (jpg/png/webp), max 4. Video mp4 only, max 1; no size limit is published for this upload path (~19MB is proven).


Google Business Profile

FieldValue
Platform keygmb
Char limit1,500
Title requiredOnly for events (eventTitle)

Post types:

TypeMediaNotes
standard (default)0-1 imageBusiness update
event0-1 imageRequires dates/times
offer0-1 imagePromotional offer

Media specs: Image max 5MB (jpg/png), max 1. No video support.

platformSpecific options:

  • ctaType — BOOK, ORDER, SHOP, LEARN_MORE, SIGN_UP, CALL
  • ctaUrl — CTA destination URL (not needed for CALL)
  • eventTitle — event title (required for event type)
  • startDate / endDate — YYYY-MM-DD format
  • startTime / endTime — HH:MM format
  • couponCode — offer coupon code
  • redeemOnlineUrl — offer redemption URL
  • termsConditions — offer terms text

Mastodon

FieldValue
Platform keymastodon
Char limit500
Title requiredNo

Post types:

TypeMediaNotes
post (default)0-4 images OR 0-1 videoText-only OK. No mixing.
threadPer-partUse postFormat: "thread" + threadParts

Media specs: Image max 16MB (jpg/png/webp/avif/gif), max 4. Video max 99MB (mp4 only), max 1 (Mastodon sets no length limit).

platformSpecific options:

  • visibility — public (default), unlisted, private, direct
  • spoilerText — content warning text
  • language — ISO 639-1 language code

Discord

FieldValue
Platform keydiscord
Char limit2,000
Title requiredNo
Target channel requiredYES — channelId

Post types: message with optional attachments (images/video), sent to a text channel of the connected server.

Media specs: up to 10 attachments, 25MB each (Discord's limit for a non-boosted server). Images and video may be mixed.

platformSpecific — keyed by channel ID. A connected Discord "channel" in BulkPublish is an entire server (guild), so the message still needs a destination channel inside it:

{"platformSpecific": {"discord": {"12": {"channelId": "1090123456789012345"}}}}
OptionNotes
channelIdREQUIRED. The target Discord text channel snowflake — not the BulkPublish channel id used as the outer key. List postable channels via GET /api/channels/{id}/options.

Gotchas: publishing uses a global bot token, not the per-user OAuth token. A failure is therefore never a re-authentication problem — reconnecting will not fix it and the channel is never flagged needs_reconnect. The real causes are permissions: the bot lacks access to the channel, cannot send messages there, or the channel was deleted.


Telegram

FieldValue
Platform keytelegram
Char limit4,096 (text) / 1,024 (media caption)
Title requiredNo

Post types: text message, photo, video, or media group (up to 10 items), sent to the chat fixed when the channel was connected.

platformSpecific: none. Telegram accepts no options — there is nothing to select per post. To publish to a second channel or group, connect it as a separate BulkPublish channel.

Media specs: media is handed to Telegram as a URL rather than uploaded, and the Bot API caps download-by-URL far below its upload limits: 5MB images (jpg/png/webp) and 20MB video (mp4).

Gotchas: content is sent as plain text with no parse mode, so &, < and > are safe but Markdown you write is not rendered (URLs still auto-link). When a post has media and text longer than 1,024 characters, the media is sent captionless and the full text follows as a second message — nothing is truncated, but it arrives as two messages.


Tumblr

FieldValue
Platform keytumblr
Char limit32,768
Title requiredNo

Post types: post — text, photo, or video post to a Tumblr blog.

Media specs: up to 30 images (jpg/png/gif/webp, 20MB each), OR exactly one video (mp4/mov, 500MB). A video CANNOT be combined with images in the same post.

platformSpecific — keyed by channel ID, because one Tumblr account can own several blogs:

{"platformSpecific": {"tumblr": {"12": {"blogName": "myblog", "title": "Heading", "tags": ["art"], "link": "https://example.com"}}}}
OptionNotes
blogNameTarget blog. Defaults to the blog the channel was connected as. List options via GET /api/channels/{id}/options.
titleRendered as a heading above the body.
tagsArray of strings, no leading #. Tags drive discovery on Tumblr more than on other networks.
linkAppended as a link block.
sourceUrlAttribution URL stored as the post's source.

Snapchat

FieldValue
Platform keysnapchat
Char limit160 (Spotlight description only)
Title requiredNo

Post types: story (default), saved_story, spotlight.

Media specs: every Snapchat post requires exactly ONE media file — a jpg/png image or an mp4 video. Spotlight is video-only, 6-60 seconds.

Caption handling: plain stories carry NO text — the caption is only used as the Spotlight description (160 chars) and as a saved-story title fallback.

platformSpecific — a flat object applies to every Snapchat channel, or key options by channel ID (like Tumblr):

{"platformSpecific": {"snapchat": {"title": "My saved story", "locale": "en_US", "saveToProfile": true}}}
OptionNotes
titleSaved-story title, max 45 chars. Falls back to the caption when omitted.
localeSpotlight only. Defaults to en_US.
saveToProfileSpotlight only. Defaults to true.

Gotchas: no first comments (_firstComment is unsupported and recorded as failed; the main post still publishes) and no comment reading/engagement.

Top skills in this category

YouTube

@byungkyu

YouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a YouTube connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a YouTube action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with YouTube examples; they add no YouTube capability - YouTube is not an event source, a trigger cannot read YouTube data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).

14529k

Social Media Scheduler

@1kalin

Plan, draft, and organize social media content across platforms. Create content calendars, write platform-optimized posts, and maintain consistent posting schedules.

1414k

Playwright MCP

@spiceman161

Browser automation via Playwright MCP server. Navigate websites, click elements, fill forms, extract data, take screenshots, and perform full browser automation workflows.

16047k

Peekaboo

@steipete

Capture and automate macOS UI with the Peekaboo CLI.

8532k

Edge TTS

@i3130002

Text-to-speech conversion using node-edge-tts npm package for generating audio from text. Supports multiple voices, languages, speed adjustment, pitch control, and subtitle generation. Use when: (1) User requests audio/voice output with the "tts" trigger or keyword. (2) Content needs to be spoken rather than read (multitasking, accessibility, driving, cooking). (3) User wants a specific voice, speed, pitch, or format for TTS output.

3323k