← BulkPublishCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to BulkPublish
Snapshot Sep 30, 2026 · 23:08 UTC · version 2.0.5
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"name": "platform-reference",
"description": "Complete reference for all 15 BulkPublish platforms — post types, media requirements, required fields, character limits, and platformSpecific options. ALWAYS consult before creating posts.",
"included_files": [],
"skill_md_contents": "---\nname: platform-reference\ndescription: Complete reference for all 15 BulkPublish platforms — post types, media requirements, required fields, character limits, and platformSpecific options. ALWAYS consult before creating posts.\n---\n\n# BulkPublish — Platform Reference\n\n## Quick Rules\n\n- **YouTube & TikTok** require video — NEVER include them for image-only posts\n- **Pinterest** requires a title — set `platformSpecific.pinterest.title`\n- **YouTube** requires a title — set `platformSpecific.youtube.title`\n- **Instagram** defaults to `feed_photo` — set `postTypeOverrides.instagram` for video content\n- Use `platformContent` for shorter text on platforms with low char limits (Bluesky 300, Pinterest/Threads/Mastodon 500)\n\n---\n\n## Facebook\n\n| Field | Value |\n|---|---|\n| Platform key | `facebook` |\n| Char limit | 63,206 |\n| Title required | No |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `post` (default) | 0-10 images OR 0-1 video | Text-only OK. No mixing images+video |\n| `reel` | 1 video required | Vertical short-form video |\n| `story` | 1 image OR 1 video required | Disappears after 24h |\n\n**Media specs:** Image max 10MB (jpg/png/gif/webp). Video max 2GB (mp4/mov).\n\n**platformSpecific options:** `linkPreview.url`\n\n---\n\n## Instagram\n\n| Field | Value |\n|---|---|\n| Platform key | `instagram` |\n| Char limit | 2,200 |\n| Title required | No |\n| Account type | Business or Creator (personal rejected) |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `feed_photo` (default) | 1 image required | Single photo post |\n| `feed_video` | 1 video required | Single video post |\n| `reel` | 1 video required | Short-form video, 9:16 recommended |\n| `story` | 1 image OR 1 video required | Disappears after 24h |\n| `carousel` | 2-10 images/videos required | Mixed media OK |\n\n**Media specs:** Image max 8MB (jpg/jpeg only). Video max 1GB (mp4/mov).\n\n**platformSpecific options:**\n- `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`\n- `trialReel` — boolean, trial reel (graduates based on performance)\n- `thumbnailTimestamp` — number (seconds), video thumbnail offset\n\n**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.\n\n---\n\n## X / Twitter\n\n| Field | Value |\n|---|---|\n| Platform key | `x` |\n| Char limit | 280 (25,000 for long posts) |\n| Title required | No |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `tweet` (default) | 0-4 images OR 0-1 video | Text-only OK. No mixing images+video |\n| `thread` | Per-part media | Use `postFormat: \"thread\"` + `threadParts` |\n| `repost` | None | Reposts (retweets) an existing post; `platformSpecific.repostId` = status URL or ID; own text/media ignored |\n\n**Media specs:** Image max 5MB (jpg/png/gif/webp), max 4. Video max 512MB (mp4/mov), max 1, max 140s.\n\n---\n\n## YouTube\n\n| Field | Value |\n|---|---|\n| Platform key | `youtube` |\n| Char limit | 5,000 (description) |\n| Title required | **YES** — `platformSpecific.youtube.title` (1-100 chars) |\n| Video required | **YES** — always |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `video` (default) | 1 video required | Standard upload |\n| `short` | 1 video required | Vertical, under 3 minutes |\n\n**Media specs:** Video max 128GB (mp4/mov/avi/wmv/flv/webm), max 1.\n\n**platformSpecific options:**\n- `title` — **REQUIRED**, 1-100 chars (falls back to first line of content)\n- `privacyStatus` — `public` (default), `private`, `unlisted`\n- `categoryId` — YouTube category ID (default 22)\n- `madeForKids` — boolean (default false)\n- `tags` — string array\n- `playlistId` — add to playlist after upload\n- `thumbnailUrl` — custom thumbnail URL\n\n**IMPORTANT:** YouTube ONLY accepts video. Never include YouTube channel for image-only posts.\n\n---\n\n## TikTok\n\n| Field | Value |\n|---|---|\n| Platform key | `tiktok` |\n| Char limit | 2,200 |\n| Title required | No (uses content) |\n| Video required | **YES** (or images for slideshow) |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `video` (default) | 1 video required | Standard video upload |\n| `photo_slideshow` | 1-35 images required | Auto-creates slideshow with music |\n\n**Media specs:** Video max 4GB (mp4/mov), max 1. Image max 20MB (jpg/jpeg/webp), max 35 for slideshow.\n\n**platformSpecific options:**\n- `privacyLevel` — `SELF_ONLY` (default), `PUBLIC`, `FRIENDS`\n- `disableDuet` — boolean\n- `disableStitch` — boolean\n- `disableComment` — boolean\n- `isAigc` — boolean (AI-generated content disclosure)\n- `thumbnailTimestamp` — number (seconds)\n\n**IMPORTANT:** TikTok ONLY accepts video (or images for slideshow). Default privacy is `SELF_ONLY` — set to `PUBLIC` for visibility.\n\n---\n\n## LinkedIn\n\n| Field | Value |\n|---|---|\n| Platform key | `linkedin` |\n| Char limit | 3,000 |\n| Title required | No (optional for articles/videos) |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `post` (default) | 0-1 image OR 0-1 video | Text-only OK |\n| `multi_image` | 2-20 images required | Image gallery |\n| `pdf_carousel` | 2-20 images required | Converted to PDF carousel |\n| `article` | 0-1 image (thumbnail) | Link share, requires `platformSpecific.url` |\n\n**Media specs:** Image max 10MB (jpg/png/gif), max 20. Video max 500MB (mp4 only), max 1, 3s-30min.\n\n**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`.\n\nThe 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**. Company pages and personal profiles carry separate availability. 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.\n\n**platformSpecific options:**\n- `title` — article/video title\n- `description` — article description\n- `url` — **REQUIRED for article type**, link URL\n- `carouselTitle` — PDF carousel title\n\n**Mentions:** write `@[Acme Corp](urn:li:organization:1337)` (Page) or `@[Jane Doe](urn:li:person:ID)` in `content`. Ask the user for the Page or person URN if they want a real mention token; this connector cannot look one up. Other channels on the same post get plain `@Acme Corp`.\n\n---\n\n## Pinterest\n\n| Field | Value |\n|---|---|\n| Platform key | `pinterest` |\n| Char limit | 500 |\n| Title required | **YES** — `platformSpecific.pinterest.title` (1-100 chars) |\n| Board required | **YES** — `platformSpecific.pinterest.boardId` (auto-creates \"BulkPublish\" board if missing) |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `pin` (default) | 1 image required | Standard pin, 2:3 ratio recommended |\n| `video_pin` | 1 video required | Video pin |\n| `carousel` | 2-5 images required | Multi-image pin |\n\n**Media specs:** Image max 20MB (jpg/png/webp), max 5. 1000x1500 recommended. Video max 2GB (mp4/mov), max 1.\n\n**platformSpecific options:**\n- `title` — **REQUIRED**, 1-100 chars (falls back to first 100 chars of content)\n- `description` — pin description, max 500 chars\n- `link` — destination URL\n- `boardId` — target board ID (ask the user which board; the ID is in the board's URL)\n- `dominantColor` — hex color\n- `coverImageUrl` — video pin cover image. Optional: when omitted the server uses an attached image, then the video's auto-extracted poster frame\n\n---\n\n## Threads\n\n| Field | Value |\n|---|---|\n| Platform key | `threads` |\n| Char limit | 500 |\n| Title required | No |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `text` (default) | None | Text-only post |\n| `image` | 1 image required | Photo post |\n| `video` | 1 video required | Video post |\n| `carousel` | 2-20 images/videos | Mixed media OK |\n| `thread` | Per-part | Use `postFormat: \"thread\"` + `threadParts` |\n| `repost` | None | Reposts an existing post; `platformSpecific.repostId` = numeric post ID; own text/media ignored |\n\n**Media specs:** Image max 8MB (jpg/png), max 20. Video max 500MB (mp4/mov), max 20.\n\n**platformSpecific options:** `quotePostId` — quote another Threads post; `topicTag` — one topic, no leading `#`, no periods/ampersands; `locationId` — numeric place ID, supplied by the user (only once the channel has granted location tagging)\n\n---\n\n## Bluesky\n\n| Field | Value |\n|---|---|\n| Platform key | `bluesky` |\n| Char limit | 300 |\n| Title required | No |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `post` (default) | 0-4 images OR 0-1 video | Text-only OK. No mixing. |\n| `thread` | Per-part | Use `postFormat: \"thread\"` + `threadParts` |\n| `repost` | None | Reposts an existing post; `platformSpecific.repostId` = post URL or ID; own text/media ignored |\n\n**Media specs:** Image max 10MB auto-resized to <976KB (jpg/png/webp), max 4. Video max 100MB (mp4 only), max 1, max 60s.\n\n---\n\n## Google Business Profile\n\n| Field | Value |\n|---|---|\n| Platform key | `gmb` |\n| Char limit | 1,500 |\n| Title required | Only for events (`eventTitle`) |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `standard` (default) | 0-1 image | Business update |\n| `event` | 0-1 image | Requires dates/times |\n| `offer` | 0-1 image | Promotional offer |\n\n**Media specs:** Image max 5MB (jpg/png), max 1. No video support.\n\n**platformSpecific options:**\n- `ctaType` — `BOOK`, `ORDER`, `SHOP`, `LEARN_MORE`, `SIGN_UP`, `CALL`\n- `ctaUrl` — CTA destination URL (not needed for CALL)\n- `eventTitle` — event title (required for event type)\n- `startDate` / `endDate` — `YYYY-MM-DD` format\n- `startTime` / `endTime` — `HH:MM` format\n- `couponCode` — offer coupon code\n- `redeemOnlineUrl` — offer redemption URL\n- `termsConditions` — offer terms text\n\n---\n\n## Mastodon\n\n| Field | Value |\n|---|---|\n| Platform key | `mastodon` |\n| Char limit | 500 |\n| Title required | No |\n\n**Post types:**\n\n| Type | Media | Notes |\n|---|---|---|\n| `post` (default) | 0-4 images OR 0-1 video | Text-only OK. No mixing. |\n| `thread` | Per-part | Use `postFormat: \"thread\"` + `threadParts` |\n| `repost` | None | Reposts an existing post; `platformSpecific.repostId` = post URL or ID; own text/media ignored |\n\n**Media specs:** Image max 16MB (jpg/png/webp/avif/gif), max 4. Video max 99MB (mp4 only), max 1, max 300s.\n\n**platformSpecific options:**\n- `visibility` — `public` (default), `unlisted`, `private`, `direct`\n- `spoilerText` — content warning text\n- `language` — ISO 639-1 language code\n\n---\n\n## Discord\n\n| Field | Value |\n|---|---|\n| Platform key | `discord` |\n| Char limit | 2,000 |\n| Title required | No |\n| Target channel required | **YES** — `channelId` |\n\n**Post types:** message with optional attachments (images/video), sent to a text channel of the connected server.\n\n**Media specs:** up to **10 attachments**, 25MB each (Discord's limit for a non-boosted server). Images and video may be mixed.\n\n**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:\n\n```json\n{\"platformSpecific\": {\"discord\": {\"12\": {\"channelId\": \"1090123456789012345\"}}}}\n```\n\n| Option | Notes |\n|---|---|\n| `channelId` | **REQUIRED.** 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`. |\n\n**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.\n\n---\n\n## Telegram\n\n| Field | Value |\n|---|---|\n| Platform key | `telegram` |\n| Char limit | 4,096 (text) / 1,024 (media caption) |\n| Title required | No |\n\n**Post types:** text message, photo, video, or media group (up to 10 items), sent to the chat fixed when the channel was connected.\n\n**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.\n\n**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).\n\n**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.\n\n---\n\n## Tumblr\n\n| Field | Value |\n|---|---|\n| Platform key | `tumblr` |\n| Char limit | 32,768 |\n| Title required | No |\n\n**Post types:** `post` — text, photo, or video post to a Tumblr blog.\n\n**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.\n\n**platformSpecific** — keyed by **channel ID**, because one Tumblr account can own several blogs:\n\n```json\n{\"platformSpecific\": {\"tumblr\": {\"12\": {\"blogName\": \"myblog\", \"title\": \"Heading\", \"tags\": [\"art\"], \"link\": \"https://example.com\"}}}}\n```\n\n| Option | Notes |\n|---|---|\n| `blogName` | Target blog. Defaults to the blog the channel was connected as. List options via `GET /api/channels/{id}/options`. |\n| `title` | Rendered as a heading above the body. |\n| `tags` | Array of strings, no leading `#`. Tags drive discovery on Tumblr more than on other networks. |\n| `link` | Appended as a link block. |\n| `sourceUrl` | Attribution URL stored as the post's source. |\n\n---\n\n## Snapchat\n\n| Field | Value |\n|---|---|\n| Platform key | `snapchat` |\n| Char limit | 160 (Spotlight description / Saved Story title fallback only) |\n| Title required | No |\n\n**Post types** (set via `postTypeOverrides.snapchat`):\n\n| Type | Media | Notes |\n|---|---|---|\n| `story` (default) | exactly 1 image or video | The caption is NOT sent to Snapchat — plain stories carry no text. |\n| `saved_story` | exactly 1 image or video | Title max 45 chars; defaults to the first line of the caption, truncated. |\n| `spotlight` | 1 video only, 6–60s | Caption becomes the description (max 160 chars, truncated); hashtags are clickable. |\n\n**Media specs:** exactly ONE file per post. Images jpg/png; videos mp4/mov, vertical, 5–60s (Spotlight 6–60s), max 1GB.\n\n**platformSpecific** — keyed by **channel ID** (a flat object applies to every Snapchat channel):\n\n```json\n{\"platformSpecific\": {\"snapchat\": {\"12\": {\"title\": \"Behind the scenes\", \"locale\": \"en_US\", \"saveToProfile\": true}}}}\n```\n\n| Option | Notes |\n|---|---|\n| `title` | Saved Story title, max 45 chars. Defaults to the caption's first line, truncated. |\n| `locale` | Spotlight locale. Default `en_US`. |\n| `saveToProfile` | Spotlight only. Default `true`; `false` sends `skip_save_to_profile`. |\n\n**Gotchas:** `_firstComment` is NOT supported. Engagement (individual comments/reactions) is not readable. Metrics ARE reported: impressions, reach, likes, comments, shares, clicks, video views.\n"
}SHA-256: 838d73d46df0b8786dbb402835c72106757f1a2701b1355c28b96df4529b177d