From omnisocials
Create, schedule, and publish social media content across 10 platforms (Instagram, Facebook, LinkedIn, YouTube, TikTok, X, Pinterest, Bluesky, Threads, Mastodon) via the OmniSocials API.
How this skill is triggered — by the user, by Claude, or both
Slash command
/omnisocials:omnisocialsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Create, schedule, and publish social media content across 10 platforms using OmniSocials.
Create, schedule, and publish social media content across 10 platforms using OmniSocials.
OmniSocials is a social media management tool that lets you schedule posts, track analytics, and manage your inbox across Instagram, Facebook, LinkedIn, YouTube, TikTok, X (Twitter), Pinterest, Bluesky, Threads, and Mastodon.
Before using this skill, ensure:
API Key: Run the setup command to configure your API key securely
<skill-path>/scripts/omnisocials.js setupexport OMNISOCIALS_API_KEY=omsk_live_your_keyRequirements: Node.js 18+ (for built-in fetch API). No other dependencies needed.
Config priority (highest to lowest):
OMNISOCIALS_API_KEY environment variable./.omnisocials/config.json (project-local, in user's working directory)~/.config/omnisocials/config.json (user-global)CRITICAL: When you receive an "API key not found" error from the CLI:
Note: All script paths in this document are relative to the skill directory where this SKILL.md file is located. Resolve them accordingly based on where the skill is installed.
IMPORTANT: Follow these rules at all times.
--pinterest-board-idaccounts:get <pinterest_account_id> — its output lists each board's name and ID. Use the FIRST board automatically. After the post is created, mention to the user which board was used (e.g. "Posted to your 'Marketing' board on Pinterest — let me know if you'd prefer a different one and I'll move it."). If the user named a specific board in the request, match it case-insensitively against the list and use that one instead.| User says... | Action |
|---|---|
| "Post this to Instagram" | accounts:list to find Instagram channel ID, then posts:create --text "..." --channels <id> |
| "Schedule a post for tomorrow" | posts:create --text "..." --channels <ids> --schedule "2026-04-07T09:00:00Z" |
| "Show my scheduled posts" | posts:list --status scheduled |
| "Upload this image" | media:upload --url "https://..." |
| "Create a reel for TikTok" | posts:create --text "..." --channels <tiktok_id> --type reel --media-urls "https://video.mp4" |
| "Post to all platforms" | accounts:list, then posts:create --text "..." --channels <all_ids> |
| "How are my posts doing?" | analytics:overview --period 7d or analytics:post <id> |
| "Delete that post" | Confirm with user, then posts:delete <id> |
| "Publish my draft" | Confirm with user, then posts:publish <id> |
| "Set up a webhook" | webhooks:create --url "https://..." --events post.published,post.failed |
Follow this workflow when creating posts:
List accounts to find available channel IDs:
./scripts/omnisocials.js accounts:list
Upload media if needed (required for stories, reels, Instagram, TikTok, Pinterest):
./scripts/omnisocials.js media:upload --url "https://example.com/image.jpg"
Note the returned media_id.
Create the post with appropriate channels, media, and platform options:
./scripts/omnisocials.js posts:create --text "..." --channels <id1>,<id2> --media-ids <media_id>
Schedule or publish as needed:
--schedule "2026-04-10T14:00:00Z" to scheduleposts:create-and-publish to publish immediatelyposts:publish <id> after confirmation| Command | Description |
|---|---|
setup | Interactive setup - prompts for API key, validates, and saves |
setup --api-key <key> --global | Non-interactive setup to global config |
config:show | Show current config, API key source |
| Command | Description |
|---|---|
posts:list | List posts. Flags: --status draft|scheduled|published|failed, --limit, --offset |
posts:get <id> | Get full post details |
posts:create | Create a new post. Flags: --text, --channels, --schedule, --type post|story|reel, --media-ids, --media-urls, plus platform flags |
posts:create-and-publish | Create and publish immediately. Same flags as posts:create except --schedule |
posts:update <id> | Update a draft or scheduled post. Flags: --text, --channels, --schedule, --media-ids, --media-urls, plus platform flags |
posts:publish <id> | Publish a draft/scheduled post now |
posts:delete <id> | Delete a post (cannot be undone) |
| Command | Description |
|---|---|
media:list | List uploaded media files. Flags: --limit, --offset |
media:upload | Upload media from URL (max 50MB). Flags: --url (required), --filename |
media:delete <id> | Delete a media file |
| Command | Description |
|---|---|
accounts:list | List all connected social media accounts with channel IDs, platforms, content types, and Pinterest boards |
accounts:get <id> | Get full account details including platform-specific info |
| Command | Description |
|---|---|
analytics:post <post-id> | Get post analytics: impressions, engagements, likes, comments, shares, per-platform stats |
analytics:overview | Workspace analytics overview. Flags: --period 7d|30d|90d, --start-date YYYY-MM-DD, --end-date YYYY-MM-DD |
analytics:accounts | Account-level analytics (followers, subscribers). Flags: --platform, --date YYYY-MM-DD |
| Command | Description |
|---|---|
webhooks:list | List all webhooks |
webhooks:create | Create a webhook. Flags: --url (required), --events (required, comma-separated: post.scheduled, post.published, post.failed) |
webhooks:get <id> | Get webhook details |
webhooks:update <id> | Update webhook. Flags: --url, --events, --active true|false |
webhooks:delete <id> | Delete a webhook |
webhooks:rotate-secret <id> | Rotate webhook signing secret (save the new secret immediately) |
All commands support these flags:
| Flag | Description |
|---|---|
--json | Output raw JSON response (useful for parsing) |
--api-key <key> | Override API key for this command |
--base-url <url> | Override API base URL |
--help | Show help |
| Platform | Post | Story | Reel | Media Required |
|---|---|---|---|---|
| Yes | Yes | Yes | Always (image or video) | |
| Yes | Yes | Yes | Optional for posts, required for stories/reels | |
| Yes | No | No | Optional | |
| YouTube | No | No | Yes (Shorts) | Always (video) |
| TikTok | Yes | No | Yes | Always (image or video) |
| X (Twitter) | Yes | No | No | Optional |
| Yes | No | No | Always (image + board_id) | |
| Bluesky | Yes | No | No | Optional |
| Threads | Yes | No | No | Optional |
| Mastodon | Yes | No | No | Optional |
| Flag | Description |
|---|---|
--pinterest-board-id | Required for Pinterest. Get board IDs from accounts:get <pinterest_account_id> |
--pinterest-title | Pin title |
--pinterest-link | Link URL attached to the pin |
| Flag | Description |
|---|---|
--youtube-title | Video title |
--youtube-privacy | Privacy: public, private, or unlisted |
--youtube-tags | Tags (comma-separated) |
--youtube-category-id | YouTube category ID |
--youtube-made-for-kids | Made for kids flag |
| Flag | Description |
|---|---|
--instagram-share-to-feed | Share reel to feed |
--instagram-cover-url | Reel cover image URL |
--instagram-thumbnail-type | Thumbnail type: from-video or from-library |
| Flag | Description |
|---|---|
--tiktok-privacy | Privacy: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY |
--tiktok-disable-comment | Disable comments |
--tiktok-disable-duet | Disable duets |
--tiktok-disable-stitch | Disable stitches |
--tiktok-is-aigc | Mark as AI-generated content |
| Flag | Description |
|---|---|
--x-reply-settings | Who can reply: following or mentionedUsers (empty string = everyone) |
Media can be the same across all platforms or different per platform:
Same media for all platforms:
./scripts/omnisocials.js posts:create --text "..." --channels <ig>,<li> --media-urls "https://example.com/photo.jpg"
Different media per platform (use --json flag and API directly for per-platform media objects):
The API supports media_urls as an object: { "default": ["url1"], "instagram": ["url2"], "pinterest": ["url3"] }. The default key is the fallback for platforms without their own key. Pass an empty array to opt a platform out of media.
./scripts/omnisocials.js accounts:list
./scripts/omnisocials.js posts:create --text "Excited to announce our new feature!" --channels <linkedin_id>,<x_id>
./scripts/omnisocials.js posts:create --text "Check this out" --channels <instagram_id> --type reel --media-urls "https://example.com/video.mp4" --instagram-share-to-feed --instagram-cover-url "https://example.com/cover.jpg"
./scripts/omnisocials.js posts:create --text "Happy Monday!" --channels <id1>,<id2> --schedule "2026-04-13T09:00:00Z"
./scripts/omnisocials.js posts:create --text "Beautiful design inspiration" --channels <pinterest_id> --media-urls "https://example.com/pin.jpg" --pinterest-board-id <board_id> --pinterest-title "Design Inspiration" --pinterest-link "https://example.com"
./scripts/omnisocials.js media:upload --url "https://example.com/photo.jpg"
# Returns: ID: media_abc123
./scripts/omnisocials.js posts:create --text "New photo!" --channels <id> --media-ids media_abc123
./scripts/omnisocials.js posts:create --text "Quick tip" --channels <youtube_id> --type reel --media-urls "https://example.com/short.mp4" --youtube-title "Quick Tip #1" --youtube-privacy public --youtube-tags "tips,tutorial"
./scripts/omnisocials.js posts:create --text "Watch this" --channels <tiktok_id> --type reel --media-urls "https://example.com/video.mp4" --tiktok-privacy PUBLIC_TO_EVERYONE
./scripts/omnisocials.js posts:list --status scheduled --json
./scripts/omnisocials.js analytics:overview --period 30d
./scripts/omnisocials.js analytics:overview --start-date 2026-03-01 --end-date 2026-03-31
./scripts/omnisocials.js webhooks:create --url "https://yoursite.com/webhook" --events post.published,post.failed
./scripts/omnisocials.js setup
./scripts/omnisocials.js setup --api-key omsk_live_xxx --global
| Error | Cause | Fix |
|---|---|---|
API key not found | No API key configured | Run setup or set OMNISOCIALS_API_KEY |
unauthorized / invalid_api_key | Invalid or expired API key | Check key at Settings > API |
insufficient_scope | API key missing required scope | Create a new key with needed scopes |
rate_limit_exceeded | Too many requests (100/min limit) | Wait and retry after the reset time |
validation_error | Missing required fields or invalid data | Check required media/fields for the platform |
not_found | Resource doesn't exist | Verify the ID is correct |
The API allows 100 requests per minute per API key. Response headers include:
X-RateLimit-Limit: Max requests per windowX-RateLimit-Remaining: Remaining requestsX-RateLimit-Reset: Unix timestamp when the window resetsaccounts:list to discover channel IDs and platform capabilities--json when you need to parse the output programmaticallyaccounts:list to see what content types each account supports (post, story, reel)accounts:get <pinterest_id> to see available boards and their IDs2026-04-10T14:00:00Z)--schedule), review, then publish with posts:publishProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
npx claudepluginhub omnisocials/omnisocials-agent-skills --plugin omnisocials