@so-me/cli
v2.1.2
Published
CLI tool for so-me.studio social media scheduler. Ships an OpenClaw skill (SKILL.md + tools.md + examples) so AI agents can drive the platform.
Maintainers
Readme
@so-me/cli
Command-line tool for the so-me social media scheduler. Manage posts, accounts, media, analytics, inbox, AI content, approvals, teams, biolinks, drafts, and settings from your terminal.
Installation
npm install -g @so-me/cliAuthentication
API Key (recommended for scripts)
so-me auth:login --api-key sk_live_your_key_here
# Or use environment variable
export SOME_API_KEY=sk_live_your_key_hereBrowser Login (interactive)
so-me auth:login
# Opens browser for authorization, no API key neededCheck Status
so-me auth:status # Local auth state
so-me auth:whoami # Verify key against server + print user/org
so-me auth:logoutCommands
Sections below follow the same order as the Mintlify CLI docs.
Publishing
Posts
so-me posts:list # List all posts
so-me posts:list --table # Table format
so-me posts:list --status draft --platform TWITTER
so-me posts:list --start-date 2026-04-01 --end-date 2026-04-30
so-me posts:list --page 2 --limit 10
so-me posts:get <id> # Get a single post
so-me posts:calendar --start 2026-04-01T00:00:00Z --end 2026-04-30T23:59:59Z
so-me posts:create -c "Hello!" --platform TWITTER
so-me posts:create -c "Scheduled" -s 2026-04-10T14:00:00Z --platform LINKEDIN
so-me posts:create -c "With media" -m file-id-1,file-id-2 --post-type IMAGE
so-me posts:create -c "Multi account" -a acc-1,acc-2
so-me posts:create --settings '{"threadMode":true}' -c "Thread" --platform TWITTER
so-me posts:create -j ./campaign.json # From JSON file
so-me posts:update <id> -c "Updated text"
so-me posts:update <id> -s 2026-05-01T10:00:00Z
so-me posts:schedule <id> -s 2026-04-10T14:00:00Z
so-me posts:unschedule <id>
so-me posts:retry <id> # Retry a failed post
so-me posts:resubmit <id> # Resubmit rejected post for approval
so-me posts:delete <id> --yes
so-me posts:delete id1 id2 id3 --yes # Bulk delete via delete
so-me posts:bulk-delete id1 id2 id3 --yes # Bulk delete (explicit command)Drafts
so-me drafts:list # List draft posts
so-me drafts:list --page 2 --limit 10
so-me drafts:get <id> # Get a single draft
so-me drafts:create -c "Draft content" --title "My Draft"
so-me drafts:create -c "With media" -m url1 url2 --post-type IMAGE
so-me drafts:create --metadata '{"key":"value"}'
so-me drafts:update <id> -c "Updated" --title "New Title"
so-me drafts:convert <id> --platform TWITTER # Convert draft to post
so-me drafts:convert <id> --platform LINKEDIN -s 2026-04-10T14:00:00Z
so-me drafts:delete <id> --yes
so-me drafts:delete id1 id2 --yes # Bulk deleteComments
so-me comments:list <post-id>
so-me comments:list <post-id> --page 2 --limit 50
so-me comments:add <post-id> --content "Looks great!"
so-me comments:update <comment-id> --content "Edited text"
so-me comments:mark-read <post-id> # Mark all comments on a post as read
so-me comments:delete <comment-id>Media
so-me media:upload ./photo.jpg # Upload file
so-me media:upload # Interactive (drag & drop)
so-me media:upload ./photo.jpg --folder "Campaign Assets"
so-me media:list # List files and folders
so-me media:list --folder <folder-id> # Files in folder
so-me media:list --file <file-id> # File details
so-me media:get <id> # Get file metadata by ID
so-me media:search <query> # Search files by name/originalName
so-me media:folders # List folders
so-me media:create-folder --name "Campaign Assets"
so-me media:move <id> --to <folder-id> # Move file to folder
so-me media:move <id> --to root # Move file to root
so-me media:move-folder <id> --to <parent-id> # Move folder under another folder
so-me media:rename <id> --name "new-name" # Rename file
so-me media:rename <id> --name "new" --type folder # Rename folder (shortcut)
so-me media:rename-folder <id> --name "new" # Rename folder (explicit command)
so-me media:delete <id> --yes # Delete file
so-me media:delete <id> --type folder --yes # Delete folder (any depth)
so-me media:delete id1 id2 --yes # Bulk delete files
so-me media:bulk-delete id1 id2 id3 --yes # Bulk delete (explicit command)Content Templates
Render preset graphics (memes, quote cards, testimonials, etc.) into your media library, ready to attach to posts. Categories: meme, quote_card, before_after, reaction, announcement, testimonial.
so-me templates:list # List content templates (meme, quote card, etc.)
so-me templates:list --category quote_card --limit 50
so-me templates:list --category testimonial
so-me templates:get <id> # Template details (incl. field schema)
so-me templates:render <id> --data '{"quote":"Ship it","author":"CLI"}'
so-me templates:render <id> --file ./vars.jsonAI Studio
AI
so-me ai:generate --prompt "Write a tweet about product launch"
so-me ai:generate --prompt "LinkedIn post" --platform LINKEDIN --tone professional
so-me ai:generate --prompt "Short caption" --length short
so-me ai:generate-and-schedule --prompt "Monday motivation" --platform TWITTER --date 2026-05-01T09:00:00Z
so-me ai:image --prompt "A sunset over mountains"
so-me ai:image --prompt "Logo design" --style minimalist --aspect-ratio 1:1
so-me ai:image:list # List generated images
so-me ai:image:get <id> # Image metadata
so-me ai:image:delete <id> # Delete a generated image
# AI video (UGC)
so-me ai:video:generate --prompt "30-sec ad about our dashboard"
so-me ai:video:list # List generated videos
so-me ai:video:get <id> # Video metadata
so-me ai:video:delete <id> # Delete a generated video
so-me ai:video:avatars # List available avatars
so-me ai:video:sounds # List available background sounds
so-me ai:video:sounds --genre chill # Filter sounds by genre
so-me ai:video:hooks --topic "new feature launch" # Hook-line suggestions
so-me ai:history # View generation historyInbox & Engagement
Manage Meta-approved WhatsApp Business templates and send template messages. The <account-id> accepts either the internal UUID (from accounts:list) or the Meta WABA provider ID.
so-me whatsapp:templates <account-id> # List templates
so-me whatsapp:create-template --account <id> --file ./tmpl.json
so-me whatsapp:delete-template <account-id> <template-name> -y
so-me whatsapp:send <account-id> --to +15551234567 --template welcome_v1 --language en_US
so-me whatsapp:send <account-id> --to +15551234567 --template order_shipped --language en_US \
--components '[{"type":"body","parameters":[{"type":"text","text":"Alice"}]}]'
so-me whatsapp:upload-media --account <id> --type image --url https://cdn.example.com/hero.jpgInbox
so-me inbox:list # List conversations
so-me inbox:list --status unresolved # Filter by status
so-me inbox:list --platform twitter # Filter by platform
so-me inbox:list --type comment # Filter by type (message, comment, mention)
so-me inbox:list --unread # Only unread
so-me inbox:list --search "keyword" # Search conversations
so-me inbox:list --page 2 --limit 50 # Paginate
so-me inbox:messages <thread-id> # Thread messages
so-me inbox:read <thread-id> # Mark as read
so-me inbox:resolve <thread-id> --status resolved
so-me inbox:resolve <thread-id> --status archived
so-me inbox:reply <thread-id> --message "Thanks!"
so-me inbox:reply <thread-id> --image url1 url2 # Reply with images
so-me inbox:reply <thread-id> --video <url> # Reply with video
so-me inbox:reply <thread-id> --audio <url> # Reply with audio
so-me inbox:reply <thread-id> --file <url> # Reply with document
so-me inbox:subscribe <account-id-or-platform> # Enable inbox
so-me inbox:unsubscribe <account-id-or-platform> # Disable inbox
so-me inbox:enable <account-id-or-platform> # Alias for inbox:subscribe
so-me inbox:disable <account-id-or-platform> # Alias for inbox:unsubscribe
so-me inbox:saved-replies # List saved replies
so-me inbox:saved-replies <id> # Get reply details
so-me inbox:create-reply --text "Hello!" # Create saved reply
so-me inbox:create-reply --text "Hi" --file f1 f2 # With attachments (max 4)
so-me inbox:edit-reply <id> --text "Updated"
so-me inbox:delete <thread-id> --yes # Delete conversation
so-me inbox:delete id1 id2 --yes # Bulk delete conversations
so-me inbox:delete-reply <id> --yes # Delete saved reply
so-me inbox:delete-reply id1 id2 --yes # Bulk delete saved repliesAnalytics
so-me analytics:platform <account-id-or-platform> # Platform metrics (7 days)
so-me analytics:platform <account-id-or-platform> --days 30
so-me analytics:platform facebook page # Facebook page analytics
so-me analytics:platform facebook posts # Facebook post analytics
so-me analytics:platform instagram account # Instagram account analytics
so-me analytics:platform instagram stories # Instagram stories
so-me analytics:platform linkedin page # LinkedIn page analytics
so-me analytics:platform youtube channel # YouTube channel analytics
so-me analytics:platform x account # X/Twitter account analytics
so-me analytics:post <post-id> --days 30 # Engagement metrics for a single postPlatform sections:
- Facebook:
page,posts,videos - Instagram:
account,media,stories - LinkedIn:
page,posts - YouTube:
channel,videos - X/Twitter:
account,content - WhatsApp:
account
Biolink
Biolinks
so-me biolink:list # List all biolinks
so-me biolink:get <id> # Biolink details
so-me biolink:public <slug> # Inspect the public biolink payload
so-me biolink:create --slug my-link --name "My Page" --bio "Welcome!"
so-me biolink:update <id> --name "Updated" --bio "New bio"
so-me biolink:update <id> --slug new-slug --button-style pill
so-me biolink:update <id> --show-grid # Show Instagram grid
so-me biolink:publish <id> # Toggle publish/unpublish
so-me biolink:analytics <id> # Views, clicks, CTR
so-me biolink:delete <id> --yes
# Themes
so-me biolink:theme <id> --preset dark
so-me biolink:theme <id> --preset neon
so-me biolink:theme <id> --bg "#1a1a2e" --text "#fff" --button "#e94560"
# Buttons
so-me biolink:buttons <biolink-id> # List buttons
so-me biolink:add-button <biolink-id> --type link --text "Website" --url https://example.com
so-me biolink:add-button <biolink-id> --type email --text "Contact" --email [email protected]
so-me biolink:add-button <biolink-id> --type phone --text "Call" --phone "+1234567890"
so-me biolink:update-button <biolink-id> <button-id> --text "Updated" --active
so-me biolink:reorder-buttons <biolink-id> btn1 btn2 btn3
so-me biolink:delete-button <biolink-id> <button-id> --yes
# Gallery Posts
so-me biolink:posts <biolink-id> # List gallery posts
so-me biolink:add-post <biolink-id> --image <url> --caption "Check this out" --link <url>
so-me biolink:update-post <biolink-id> <post-id> --caption "Updated" --visible
so-me biolink:reorder-posts <biolink-id> p1 p2 p3
so-me biolink:delete-post <biolink-id> <post-id> --yesTheme presets: default, dark, gradient, minimal, neon, sunset, ocean, forest
Button types: link, social, email, phone, file, text
Team & Collaboration
Teams
so-me teams:list # List members
so-me teams:invite --email [email protected]
so-me teams:invite --email [email protected] --post-approval auto_approve
so-me teams:invitations # Pending invitations
so-me teams:update <id-or-email> --post-approval requires_approval
so-me teams:cancel-invite <id-or-email> # Cancel invitation
so-me teams:remove <id-or-email> # Remove memberApprovals
so-me approvals:list # List posts pending approval
so-me approvals:approve <post-id>
so-me approvals:approve <post-id> --comment "Looks good"
so-me approvals:reject <post-id> --comment "Needs revision"Accounts
so-me accounts:list # List connected accounts
so-me accounts:get <id-or-platform> # Account details by ID or platform name
so-me accounts:get-details <uuid> # Account details by exact UUID
so-me accounts:connect --platform twitter # Connect via browser OAuth
so-me accounts:remove twitter # Remove a connected account by platform
so-me accounts:remove-by-id <uuid> --yes # Remove by exact UUIDSupported platforms: twitter (alias x), linkedin, linkedin_page, instagram, facebook, tiktok, youtube, threads, pinterest, whatsapp, dribbble
Settings & Billing
Profile
so-me settings:profile # Get your profile
so-me settings:update-profile --name "New Name"
so-me settings:update-profile --password "newpass123"Organization
so-me settings:org # Current org details
so-me settings:update-org --name "My Studio" --color "#ff5733"
so-me settings:tenants # List all orgs you belong to
so-me settings:create-org --name "New Org" --description "Description"
so-me settings:leave-org <id> --yes
so-me settings:delete-org <id> --yesAPI Keys
so-me settings:api-keys # List API keys
so-me settings:create-api-key --name "CI/CD"
so-me settings:revoke-api-key <id> --yesBilling
# Current subscription + usage
so-me settings:billing # Subscription status
so-me settings:usage # Usage for current period
so-me settings:referral-code # Your referral code + totals
# Plan catalog
so-me billing:plans # List all subscription plans
so-me billing:plan-features <name> # Feature matrix for a plan
so-me billing:plan-features scale # e.g. plan name = scale
so-me billing:addons # List add-on SKUsWebhooks
so-me webhooks:list # List subscriptions
so-me webhooks:get <id> # Subscription details
so-me webhooks:create --url https://example.com/hook --categories post
so-me webhooks:create --url https://... --categories post,inbox --description "prod"
so-me webhooks:create --url https://... --categories post --events post.published,post.failed
so-me webhooks:create --url https://... --categories post --payload-template '{"e":"{{event}}"}'
so-me webhooks:update <id> --url https://new.example.com/hook
so-me webhooks:update <id> --inactive # Pause deliveries
so-me webhooks:update <id> --active # Resume deliveries
so-me webhooks:update <id> --regenerate-secret # Rotate signing secret
so-me webhooks:test <id> # Send a synthetic test delivery
so-me webhooks:deliveries # Recent delivery logs
so-me webhooks:deliveries --page 2 --limit 50
so-me webhooks:retry <delivery-id> # Re-queue a failed delivery
so-me webhooks:events # Available event catalog
so-me webhooks:delete <id> # Permanently removeSupport
so-me support:list-tickets # List your tickets
so-me support:create-ticket --subject "Can't schedule" --message "Details..."
so-me support:create-ticket --subject "X" --message "Y" --priority HIGH
so-me support:get-ticket <id> # Ticket details
so-me support:send-message <id> --message "Follow-up note"
so-me support:list-messages <id> # All messages on a ticketGlobal Options
| Flag | Description |
|------|-------------|
| --api-key <key> | Override stored API key |
| --api-url <url> | Override API base URL |
| --json | JSON output (default) |
| --table | Table-formatted output |
| --verbose | Show detailed errors |
| --yes / -y | Skip confirmation prompts |
Environment Variables
| Variable | Description |
|----------|-------------|
| SOME_API_KEY | API key (alternative to --api-key) |
| SOME_API_URL | API base URL (default: https://api.so-me.studio) |
Scripting
All commands output JSON by default, making them scriptable with jq:
# Get the first post's ID
so-me posts:list | jq '.data[0].id'
# List account names
so-me accounts:list | jq '.[].accountName'
# Create post and capture ID
POST_ID=$(so-me posts:create -c "Hello" --platform TWITTER | jq -r '.id')
so-me posts:schedule $POST_ID -s 2026-04-10T14:00:00ZSelf-Hosted
Point the CLI at your own instance:
export SOME_API_URL=https://api.your-domain.com
so-me auth:login --api-key sk_live_xxx