skills/content-distributor/SKILL.md
Schedules social media posts via Blotato API and verifies publishing. Processes posts at "Can Be Scheduled" status only. Handles post creation, status polling, and publish verification. Runs on Friday 9am cron or manual invocation. Use when the user says "schedule posts," "publish posts," "content distributor," "process scheduled," "verify published," or wants posts sent to Blotato for scheduling.
npx skillsauth add demtomi/social-media-agent-toolkit content-distributorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You schedule approved posts via the Blotato API and verify they publish correctly. You process posts at "Can Be Scheduled" status, schedule them, and track through to "Published" or "Needs Rework".
You do NOT write copy (content-writer) or generate images (content-designer).
Query the Notion Calendar for posts ready for scheduling.
Calendar DB: YOUR_CALENDAR_DB_ID
Filter: Status = "Can Be Scheduled"
For each post, verify:
datetime.strptime(date, '%Y-%m-%d').weekday() <= 4. If it falls on Saturday/Sunday, REJECT the post and report: "LinkedIn post on weekend. Move to next available weekday before scheduling."If any prerequisite fails, skip the post, report what is missing, and continue to the next.
If no valid posts found, report "No posts ready for scheduling" and stop.
Base URL: https://backend.blotato.com/v2
Auth header: blotato-api-key: {key from .env as BLOTATO_API_KEY}
Rate limit: 30 requests/minute
| Platform | accountId | |---|---| | LinkedIn | YOUR_LINKEDIN_ACCOUNT_ID | | Instagram | YOUR_INSTAGRAM_ACCOUNT_ID | | TikTok | YOUR_TIKTOK_ACCOUNT_ID | | YouTube | YOUR_YOUTUBE_ACCOUNT_ID |
{
"scheduledTime": "2026-04-03T07:00:00.000Z",
"post": {
"accountId": "YOUR_ACCOUNT_ID",
"content": {
"platform": "linkedin",
"text": "Post text here with #hashtags at end",
"mediaUrls": ["https://...image1.png", "https://...image2.png"]
},
"target": {
"targetType": "linkedin"
}
}
}
scheduledTime goes at ROOT level, NOT inside postaccountId goes inside post, NOT at roottarget is singular (not targets), it is an object (not an array)content.platform must match target.targetTypepageId from targettext, not in a separate fieldmediaUrls = automatic carousel/multi-imageLinkedIn:
{
"targetType": "linkedin"
}
No pageId for personal profile.
Instagram (image/carousel):
{
"targetType": "instagram"
}
Multiple URLs in mediaUrls = automatic carousel.
Instagram (Reel):
{
"targetType": "instagram",
"mediaType": "reel"
}
TikTok (requires ALL fields):
{
"targetType": "tiktok",
"privacyLevel": "PUBLIC_TO_EVERYONE",
"disabledComments": false,
"disabledDuet": false,
"disabledStitch": false,
"isBrandedContent": false,
"isYourBrand": false,
"isAiGenerated": true,
"title": "Video title",
"autoAddMusic": false,
"isDraft": false
}
YouTube Shorts:
{
"targetType": "youtube"
}
Combine the Notion entry's Publish Date and Scheduled Time into ISO 8601 UTC format:
{date}T{time}:00.000Z
Example: Publish Date = 2026-04-03, Scheduled Time = 07:00 -> 2026-04-03T07:00:00.000Z
For each valid post:
POST /posts to BlotatoAfter all posts are scheduled, verify publishing for any posts whose scheduled time has passed.
GET /posts/{blotato_id} for each postOn success (status = "published"):
publicUrl in Notion (Public URL property)On failure (status = "failed"):
errorMessage from responseOn pending (status = "in-progress"):
Do not poll yet. Report them as "Scheduled, publishing at {time}".
Send a summary listing:
If a post fails on Blotato:
When the user asks to "verify published posts" or "check post status":
GET /posts/{blotato_id}| Database | ID |
|---|---|
| Social Media Calendar | YOUR_CALENDAR_DB_ID |
content-writer -- creates copy (runs Thu 9am)content-designer -- generates images (runs Thu 3pm)content-ideation -- fills Topic Bank (runs Wed)content-analytics -- measures performance (runs Mon)testing
Automated content writer. Takes topics from the Notion Topic Bank or Calendar and generates platform-specific copy for LinkedIn, Instagram, TikTok, and YouTube using parallel subagents. Handles slot assignment, conflict checking, and Notion status management. Runs on Thursday 9am cron or manual invocation. Use when the user says "write content," "draft posts," "content writer," "write this week's posts," or wants copy generated for social media calendar entries.
development
Scans trend sources via Perplexity API, generates topic ideas, scores them, and pushes to the Notion Topic Bank and Social Media Calendar. Runs on Wednesday 9am cron or manual invocation. Use when the user says "find topics," "content ideation," "what should I post about," "scan for trending topics," "fill the topic bank," or wants fresh content ideas for the week.
development
Generates images for approved social media posts using Gemini API, uploads to Blotato media hosting, stores URLs in Notion, and sets status to Ready. Processes posts at "Approved" status only. Runs on Thursday 3pm cron or manual invocation. Use when the user says "generate images," "process approved posts," "content designer," "create visuals," or wants images generated for approved calendar entries.
development
Weekly performance analytics. Pulls metrics for published posts, tags top and bottom performers, updates the Topic Bank with success data, and generates an HTML dashboard email. Runs on Monday 9am cron or manual invocation. Use when the user says "content analytics," "weekly report," "how did posts perform," "check analytics," "tag top posts," or wants a performance review of recent social media content.