---
name: social
description: Post the person's finished video to their own connected social accounts with their approval — connect YouTube, TikTok, Instagram, Facebook, Threads or X (through FlashBoards' apps or its partner Zernio), draft each version with the captions, hashtags and AI label from the publish pack, hand over the approval page or in-chat card, follow each network until the post is live, cancel what has not gone out, and read comments and counters where the network supports it. Only where this client offers the FlashBoards Social tools; otherwise the person uploads each version.
---
# FlashBoards Social

FlashBoards user skill, version 1.2.3 (2026-10-13).

On the board, read these guides with `list_skills` and `get_skill` when the assistant exposes them; otherwise use the hosted index through an available read-only retrieval tool. Use that runtime’s actual model discovery, current page context and guarded board actions for execution. Keep native readiness, approval and cost gates; do not claim a guide was read when retrieval is unavailable.

Read related guides with `get_skill({skillId:"<id>"})` or the [hosted index](https://pub-78da82d51ed14147ac554d38094b0c0b.r2.dev/user-skills/1.2.3/index.html). Reading a guide does not start or authorize a paid generation.

Read `viral` for the shared rules and `viral-publish` for the versions and captions. **The person's own accounts and finished video. Nothing here publishes: every post waits for the owner's own approval on its page or card.**

Slots: {video} — the finished video (`generationId`, or the `videoReceipt` of an uploaded file) · {accounts} — where it goes · {caption} — caption and hashtags per platform · {ai} — made or altered with AI · {when} — now or a time within 30 days.

## Steps

1. **Discover first.** Call `social_connect` without arguments. If it is not among this client's tools, Social is not open here: go to `viral-publish` and end with "Upload each version yourself". Never describe accounts or networks you did not list.
2. **Connect.** For a network the person wants and has not connected, call `social_connect` with `network` (with `accountId` to reconnect an account that asks for it) and give the link; never open it. When the network's `via` is `zernio`, say the consent page names Zernio, FlashBoards' publishing partner, not FlashBoards. Name the network's `requirement` (a YouTube channel, an Instagram Business or Creator account, a Facebook Page). List again afterwards to see the account.
3. **Prepare.** Make the versions, captions and hashtags with `viral-publish` steps 1–4, or take the person's own. A file the person attaches goes in by `create_upload_link` (or `show_media_upload_picker`) and its receipt.
4. **Which accounts.** A network can have several connected accounts. When the person names only the network ("post it on YouTube") and it has more than one, ask which, by handle, or whether to post to all of them; never pick one yourself. When they name a channel or handle, take that one. Each account of the same network gets its own title and caption, in its own voice: the same video with the same text on two channels reads as reused content.
5. **Draft.** One `social_publish` `action: "draft"` per video file: `generationId` or `videoReceipt`, its `accountIds`, the shared `caption`, and `perAccount` for a platform's own caption or choices. Pass only what the person said or what the pack fixed: `title`, `privacy`, `youtube.madeForKids`, `youtube.tags`, `tiktok.privacyLevel`, `tiktok.musicUsageConfirmed`, `scheduledAt`. Never choose YouTube made-for-kids, TikTok privacy, interactions or disclosure for the person: the page asks what `problems` lists. The AI label stays on for a FlashBoards generation; for an uploaded video ask once whether it was made or altered with AI and pass `aiGenerated`, or leave it for the page. Use a new `requestKey` per draft and the same one for a retry.
6. **Hand over.** Follow the result's `next`. Where the host draws the approval card under the result, say in one line that it is ready and give `approveUrl` only if the person cannot see the card; elsewhere give `approveUrl`. Say what is still open (`problems`) and what came from the account's saved choices (`fromDefaults`). A draft waits for approval until its own publish time, and at least 24 hours (`approvalExpiresAt`); approved after its time, it goes out at once. For a calendar of several posts (a week), draft each with its `scheduledAt`, then give `approveAllUrl` once instead of each `approveUrl`: the person browses and selects the displayed posts to approve, up to 20 per click; any selected post that still needs an answer says so there while the others go ahead.
7. **Follow.** `social_post_status` with `postId`: it draws no card, unlike `social_publish` `action: "status"`. A network is live only when its job `state` is `published`, with its link, and it carries no `removedOnNetwork`: that one went out but the network no longer shows it (deleted there, hidden, or missing from the network's list); say its `note` and give the link to check; `queued`, `uploading` and `processing` are still on the way; `failed` carries the network's own reason: say it as it is. A refusal about the account itself (banned from posting, limited, needs reconnecting) comes back on a new draft too, so never redraft on your own: tell the person and let them decide. `action: "cancel"` stops what has not gone out; a post already live stays up.
8. **Comments and counters.** `social_inbox` `action: "comments"` (optionally one `accountId`) reads the newest comments from the networks at that moment; an account listed under `unread` could not be read, and its `code` says why: say so plainly. `action: "stats"` gives each post's latest counters, refreshed once a day. A post with nothing yet is not an error. X is never read this way (`unread` code `PAID_READ_ON_REQUEST`): X bills every post it hands over, so read X only when the person asks, one post at a time, through their connected X account — `action: "x_post"` gives a post's replies, reposts, quotes and likes ($0.01), `action: "x_replies"` the replies under it, $0.01 a reply read (`limit` 10 to 100: X hands them over in pages of 10): `order: "top"` by default, ranked by likes, then reposts, up to 100 read; or `"newest"`, 10 unless more is asked. A request reads one provider page; a short page costs only the returned replies. When `hasMore` is true, the returned `cursor` continues with a new request and price confirmation. Ranking is within that page unless `complete` is true. Read the count first with `x_post` and set `limit` to it when it is under 100, so the person pays only for what is there. The first call answers the price and reads nothing: name it, wait for the person's yes, then call again with `confirmedPriceUsd` and the same `requestId`. To answer comments, read them with `action: "comments"`, write the replies the person wants, and propose them with `action: "draft_replies"` (`replies`: each comment's `accountId`, `externalPostId` and `id` as `commentId`, and the `text`; up to 20, 1000 characters each; a `requestKey` you reuse on a redraft). It sends nothing: give the person its `approvalUrl`, where they see each reply beside its comment, untick what they do not want and send the rest with one click. Say what was `excluded` and why: X replies are not offered (each is a post X bills), nor accounts on FlashBoards' own apps. Never claim a reply was sent; after the person sends, read the comments again to see them.
9. **Formats and extras.** All of these go in a draft's `options` (shared, or one account's in `perAccount`), are shown on the approval page and card, and are only the person's to approve:
   - **Thread** on X and Threads: `thread`, up to 9 posts after the caption; the video stays on the first. On X every post is billed by its own text ($0.03, or $0.40 with a link), so say the draft's `price.totalUsd` for `price.posts` posts.
   - **Story** on Instagram or Facebook and a **Facebook Reel**: `format`. A Story takes no collaborators, paid label, sponsors, place or trial; the draft's `problems` names any that conflict.
   - **Cover frame** on TikTok and Instagram Reels: `cover.atMs`.
   - **TikTok**: `tiktok.draft` sends it to the creator's inbox to finish in the app; `tiktok.music` (a track from `social_account` resources `tiktok_music`) and `tiktok.location` (from `tiktok_locations`).
   - **Instagram**: `instagram.trialReel`, `paidPartnership`, `sponsors`, `userTags`, `locationId`, `muteAudio` (removes the sound for good), `audioName`, `audio` (from `instagram_audio`; needs an account connected through Facebook).
   - **YouTube** playlist: `youtube.playlistId` (from `youtube_playlists`). **Facebook**: `facebook.draft`, the Reel's `title`. **Threads**: `threads.topicTag`.
   - **YouTube custom thumbnail**: the draft's `thumbnail` (not in `options`): `{ generationId, outputIndex }` of one of the person's finished image generations, a JPEG or PNG up to 2 MB (1280x720 is best; `crop_image` or `pad_image` can make one). Other networks ignore it. YouTube uses it on regular videos only, not Shorts (vertical and up to 3 minutes), and on a channel that is not verified the video still publishes without it: say so if either applies.
   - **X**: `x.replySettings`, `x.replyTo` (a post's link), `x.paidPartnership`, `x.sensitive`, `x.longVideo`; `geoCountries` on X and Facebook.
   Set a choice only when the person asked for it or the pack fixed it. Carousels, polls, text-only posts, subtitles and image covers are not offered yet.
10. **Around the post.** `social_account` is free. `action: "check_caption"` counts a caption the way each network counts it; `action: "check_post"` with the draft's `postId` runs the partner's own validation, so say its `problems` before the person approves. `action: "resources"` lists what a post can use on that account, by `kind`: a YouTube playlist (`youtube_playlists`), a Pinterest board, a Facebook Page, a LinkedIn organization, TikTok music or a place, Instagram audio, Reddit flairs and rules. A Reddit list can be unavailable while Reddit keeps third-party apps out: say so. `action: "health"` tells whether each account can post and returns retained `activity` counters, not unread counts: reads do not reset them, and they expire after 30 days without activity. `action: "platform_posts"` lists recent posts the network gives for the account (it can leave out the newest); `"find_post"` finds one the person published directly on the network, by its link, and may create a partner-side synced record without publishing anything. Neither reads X. A post made through FlashBoards is followed with `social_post_status`. Creating a playlist or a board or changing the default playlist returns an exact preview and a five-minute `approvalUrl`: give that link to the person to review and approve in their own FlashBoards session. Never open or approve it yourself; `confirmed: true` cannot apply an account change. Pinterest privacy must be exactly `PUBLIC`, `PROTECTED` or `SECRET`; unknown values are refused.

## Rules

1. Never approve, publish or schedule for the person: only their click on the approval page or card does.
2. Never say a post is live or scheduled until `status` shows it.
3. Never open a connect or approval link for the person.
4. Never default YouTube made-for-kids, TikTok privacy or TikTok interactions and disclosure.
5. Name Zernio whenever the network's consent page will show it.
6. Never choose between two accounts of one network for the person.
7. Posting is free, except to X: X bills each post, $0.03, or $0.40 when the caption carries a link (any URL or a bare domain such as flashboards.com), taken once the post is live; a thread pays that for each of its posts. Name the X price before the person approves; the draft's `jobs[].price` says which applies (`totalUsd` for a thread). Versions and captions come from `viral-publish`; this guide only posts them.

## Execute through MCP or on the board

Use the person's FlashBoards account; never ask for a personal provider key or run the source's local scripts. Discover `get_account`, `list_generation_models` and the tools of this client first: a published guide does not prove a feature is deployed.

**Headless, no open board.** Quote with `estimate_generation_cost` (skill models: `estimate_skill_model`), then run `generate_image`, `generate_video`, `generate_audio` or `run_skill_model` with one stable `generationAttemptId` per logical attempt. Pass `maxCostUsd` only when the current operation and selected model support it; otherwise use the quoted cost and the person's explicit approval with the supported controls. Never silently ignore an unsupported spending cap; make one `get_generation` check after `retryAfterSeconds`. Pass the person's own results by `generationId`: images in `referenceGenerationIds`, `firstFrameUrl` and `endFrameUrl`, audio in `referenceAudioUrls` or `targetAudioUrl`, videos in `referenceVideoGenerationIds`. They are read on the server; signed result links do not work as public URLs. Every `generationId` a tool returns stays valid: a later read of the same result gives a different string, and both work. Film frames and gallery pictures go in by `previewHandle`: `referencePreviewHandles` of the generation tools, a `{previewHandle}` source of `arrange_images`, `crop_image` and `pad_image`, and `describe_media`. New files come from `show_media_upload_picker` as receipts. The person's character comes in as its sheet, by `generationId` or as an upload; there is no search by name. If the person names a character without the sheet, ask for it or make one with `character-sheet`; do not scan recent results for it. Free server steps: `trim_video`, `concat_videos`, `conform_video`, `replace_video_audio`, `extract_video_frame`, `extract_video_audio`, `detect_video_cuts`, `crop_image`, `pad_image`, `arrange_images`, `cut_audio_span`, `concat_audio_tracks`, `mix_audio_tracks`, `fit_audio_duration`, `add_audio_reverb`. Check every result with `describe_media` (a question about an image; `model`, `mode` and `sourceRange` only for a video) and `transcribe_media` for speech. Both checks are paid: `describe_media` costs a fraction of a cent for an image and about 2–4 ¢ for a short video (more for a long one), `transcribe_media` under 1 ¢ a minute — count the checks you plan in the price you name before the first paid step. `describe_media` is not reliable about sound: it misses effects mixed under music and can hear voices or instruments that are not there. Check speech with `transcribe_media` and ask the person to listen for effects and music. Never repay an uncertain submission; reuse an attempt ID only for the identical request. Make each new `requestId` or `generationAttemptId` unique, for example the task, the date and a short random suffix: an ID used before, even in another chat, replays that earlier request or answers `REQUEST_ID_CONFLICT`.

**On the board.** Inspect with `list_board_sessions` and `get_board_snapshot` and carry the same `sessionId` and a fresh `activeBoardId` as `expectedBoardId`. Native cards: `execute_board_action` (`listNativeModels`, `setModel`), `prepare_board_generation` with ordered board items or owned outputs, then one `generate_on_board` within the authorized budget. Board media tools: `list_media_tools` → `start_media_tool` → `get_media_tool_run`. Put headless results on a board with `add_media_to_board`.

Keep mandatory safety settings and the live limits of each model. Prices, timings, endpoints and "free retry" claims in the sources are historical, not FlashBoards contracts. If a step this guide needs is not available or is refused (a tool error, `audio_not_configured`, a missing model or input), keep the finished assets, tell the person which step is blocked and why, and ask how to go on. A single generation that ends `failed` is not a blocked step: submit it once more with a new `generationAttemptId` (reworded if it may have hit the content checker), and stop to ask only if it fails again. A failed attempt is not always refunded, so the retry may be paid again and `maxCostUsd` caps each request on its own: count both against the budget the person approved. Never swap in another route on your own: no image model redrawing a layout or a frame, no `describe_media` in place of the frames it should check, no clip generated only to take its sound, no picture drawn where the guide takes a film frame.

## Source and related guides

- Written for FlashBoards from the owner's social-publishing research of 2026-10-12 (flashboards-apps `chat/RESEARCH-SOCIAL-2026-10-12.md`) and the FlashBoards Social MCP tools (`social_connect`, `social_publish`, `social_inbox`, `social_account`); no Learn article yet.

Read: `viral`, `viral-publish`, `viral-rules`, `youtube`, `reels`. Source experiments and demo materials are historical; use the person's own approved media.
