Install
openclaw skills install @sanjaykhanssk/social-by-idmCreate, schedule, and manage social media posts across Instagram, Facebook, X/Twitter, LinkedIn, and TikTok via the Social by InstantDM API and hosted MCP server. Covers media upload, post creation, scheduling (timezone-aware), draft mode, per-platform overrides, analytics, and per-platform result tracking. Use when the user wants to draft, schedule, cross-post, publish now, edit, delete, check the status of, or pull analytics for their social accounts.
openclaw skills install @sanjaykhanssk/social-by-idmAutonomously manage social media via Social by InstantDM. Post to Instagram, Facebook, X/Twitter, LinkedIn, and TikTok from a single API call — the same publish pipeline the dashboard uses.
There is no CLI to install. Drive it one of two ways: the hosted MCP server (recommended
for agents) or raw REST calls to /v1. Both use one workspace API key.
Freshness check: if more than 60 days have passed since the
last-updateddate above, tell the user this skill may be outdated and point them to the update options below.
Source: github.com/social-by-idm/agent-mode · API docs: socialbyidm.com/docs
| Installation | How to update |
|---|---|
npx skills | npx skills update |
| Claude Code plugin | /plugin marketplace update |
| Cursor | Remote rules auto-sync from GitHub |
| Manual | Pull the latest repo or re-copy skills/social-by-idm/ |
accounts:read, posts:read, posts:write, media:write, analytics:read)..env — treat it like a password:
SOCIAL_BY_IDM_API_KEY=sk_live_xxxxx
X-Api-Key: <SOCIAL_BY_IDM_API_KEY>.?key=<SOCIAL_BY_IDM_API_KEY> to the MCP URL and leave the OAuth fields blank.X-Api-Key: <SOCIAL_BY_IDM_API_KEY>. Base URL: https://social-api.instantdm.com/v1.https://social-api.instantdm.com/mcp{
"mcpServers": {
"social-by-idm": {
"type": "streamable-http",
"url": "https://social-api.instantdm.com/mcp",
"headers": { "X-Api-Key": "sk_live_xxx" }
}
}
}
MCP tools (13): list_accounts, create_post, update_post, get_post, get_post_status,
list_posts, delete_post, list_platform_posts, delete_platform_post,
upload_media_from_url, list_media, delete_media, get_analytics.
MCP
create_post/upload_media_from_urlaccept public media URLs — the server downloads and uploads them for you. No manual upload step needed when using MCP.
Use these endpoints directly if you prefer raw calls over MCP.
GET /v1/accounts
Returns connected accounts with id, platform, username. Store the IDs — every post needs them.
POST /v1/media/upload-url
Body: { "filename": "video.mp4", "contentType": "video/mp4" }
Returns mediaId + uploadUrl. Then PUT the bytes and finalize:
PUT <uploadUrl> (Content-Type: video/mp4, body: binary)
POST /v1/media/{mediaId}/complete
List/delete: GET /v1/media · DELETE /v1/media/{mediaId}.
POST /v1/posts
Body: {
"accountIds": ["acc_8fK2qz", "acc_19xQ"],
"content": "your caption #hashtags",
"postType": "text", // text|image|carousel|video|reel|story|thread|article|document
"mediaIds": ["md_xxx"], // required for image/carousel/video/reel/story/document
"scheduledAt": "2026-07-01T09:00:00+05:30", // omit + publishNow:true to post instantly
"publishNow": false, // true → publish immediately, ignores scheduledAt
"draft": false, // true → save without scheduling
"platformContent": { "twitter": "short", "linkedin": "longer" }, // optional per-platform caption
"platformSchedules": { "tiktok": "2026-07-01T18:00:00+05:30" } // optional per-platform time
}
GET /v1/posts/{id}/status → per-platform scheduled|published|failed + error + permalink
GET /v1/posts?status=scheduled&platform=instagram&limit=50
GET /v1/posts/{id}
PUT /v1/posts/{id} (update caption, schedule, accounts, media — scheduled/draft only)
DELETE /v1/posts/{id} (scheduled/draft only)
GET /v1/platform-posts?accountId=acc_xxx → recent posts pulled from the platform
DELETE /v1/platform-posts/{id} → returns { deleted: bool, reason } (see gotchas)
GET /v1/analytics → totals, status/type breakdown, live per-account & per-platform insights
GET /v1/analytics?refresh=1 → force a live refresh (slower; bypasses the 30-min cache)
scheduledAt with an offset (+05:30 or Z) is exact. WITHOUT an offset it's
interpreted in the workspace timezone (Settings → Timezone) — not UTC. When in doubt, include
an explicit offset.mediaIds takes Social by InstantDM media IDs
only. Either upload first (REST) or pass a direct, public URL via MCP upload_media_from_url
/ create_post media URLs. A non-direct share link (Google Drive/Dropbox preview pages) fails.get_post_status — a partial status means some targets failed; the per-target
error says why. Never assume success from the HTTP code alone.document needs a
PDF. Instagram requires media (no text-only). TikTok photos must be JPEG, ≤1920px, <10MB.delete_platform_post returns { "deleted": false, "reason": "..." } for these. Check the
deleted flag and verify against the real feed — do not trust a 200 status.status shows fewer platforms
than you posted to, suspect file size — re-encode smaller/shorter.X 280 (25,000 with Premium) · Instagram 2,200 · Facebook 63,206 · LinkedIn 3,000 · TikTok 2,200 ·
Threads 500. Keep captions concise; use platformContent to tailor per network.
Keep accounts in good standing:
draft: true) when unsure.instagram · facebook · twitter (X) · linkedin · tiktok
Schedule a carousel to Instagram + LinkedIn for tomorrow 9am IST:
POST /v1/posts
{ "accountIds": ["acc_ig","acc_li"], "postType": "carousel",
"mediaIds": ["md_1","md_2","md_3"], "content": "3 lessons from this week",
"scheduledAt": "2026-07-02T09:00:00+05:30" }
Publish a text post to X right now:
POST /v1/posts
{ "accountIds": ["acc_x"], "content": "shipping.", "publishNow": true }