Fuxux Social Manager
Turn OpenClaw into an autonomous social media manager for Fuxux. Schedule and publish to 12 platforms via REST API and MCP: media, drafts, queue, editing, publishing analytics and …
abogitoff
@abogitoff
Install
$ openclaw skills install @abogitoff/fuxux-openclaw-skillSocial Media Assistant (via fuxux.com)
Turn your OpenClaw agent into an autonomous social media manager using the Fuxux API and MCP server. Use when scheduling, posting, or managing content across Twitter/X, Instagram, LinkedIn, Facebook, TikTok, YouTube, Bluesky, Threads, Pinterest, Discord, Kick, or Twitch. Covers media upload, post creation, scheduling, draft mode, queue inspection, editing and deleting posts, publishing analytics, and AI caption generation (POST /api/ai/generate).
Setup
-
Create a Fuxux account at fuxux.com and connect at least one social account (Settings → Accounts or onboarding).
-
Create an API key: Settings → API keys → Create key. Keys look like
fx_live_+ 40 hex characters (48 chars total). The full secret is shown once — store it safely. -
Store the key in the agent workspace
.env(never commit real keys):FUXUX_API_KEY=fx_live_your_secret_here -
Download API docs for offline reference:
- OpenAPI JSON:
https://www.fuxux.com/openapi.json - Interactive reference:
https://www.fuxux.com/reference - MCP setup guide:
https://www.fuxux.com/mcp/docs
- OpenAPI JSON:
-
(Recommended for OpenClaw) Connect MCP so the agent can call Fuxux tools directly (see MCP below).
Auth
All authenticated HTTP requests use a Bearer token:
Authorization: Bearer <FUXUX_API_KEY>
Primary env var: FUXUX_API_KEY
Base URL
Routes below are rooted at https://www.fuxux.com (e.g. GET https://www.fuxux.com/api/accounts).
MCP (recommended for OpenClaw)
Fuxux exposes a Streamable HTTP MCP server. Send the same Bearer header on every MCP request.
| Endpoint | Notes |
|---|---|
https://www.fuxux.com/api/mcp | Primary public MCP endpoint |
OpenClaw / Claude Desktop (stdio bridge):
{
"mcpServers": {
"fuxux": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://www.fuxux.com/api/mcp",
"--header",
"Authorization: Bearer YOUR_FUXUX_API_KEY"
]
}
}
}
Cursor / HTTP clients:
{
"mcpServers": {
"fuxux": {
"url": "https://www.fuxux.com/api/mcp",
"headers": {
"Authorization": "Bearer ${env:FUXUX_API_KEY}"
}
}
}
}
MCP tools
| Tool | Purpose |
|---|---|
whoami | Validate token; return profile (id, email, plan) |
list_connected_accounts | Connected social accounts + connected / expired status |
get_dashboard | Stats, upcoming scheduled posts, platform snapshot |
list_posts | Queue / calendar — optional month (YYYY-MM), status (scheduled | published | draft | failed | all), limit (1–50, default 20), offset, order (upcoming | newest | recently_published | recently_updated) |
create_post | Publish, schedule (scheduled_at) or save a draft (draft: true); optional targets (account_id, platform, format, board_id) to pick accounts |
get_post | One post with its per-platform variants (variant ids for update_post); also finds drafts |
update_post | Reschedule, edit captions (variant_updates), or replace media on a draft/scheduled post |
delete_post | Delete a post from Fuxux (published posts stay on the platform — only Fuxux's record goes) |
Prefer MCP when the host supports it; fall back to REST when you need raw control.
Core workflow (REST)
1. Validate auth / profile
GET /api/settings/profile
Authorization: Bearer $FUXUX_API_KEY
Returns user id, email, full_name, plan (free | creator | growth | pro).
2. List connected social accounts
GET /api/accounts
Authorization: Bearer $FUXUX_API_KEY
Returns accounts[] with id, platform, platform_username, status (connected | expired), scopes, and via_reminder (this isn't a real OAuth connection — it's a manual "notify me" entry for a platform Fuxux can't auto-publish to; Fuxux will remind the user to post it themselves rather than publishing on their behalf).
Important: Fuxux posts by platform id in the captions map (e.g. twitter, instagram), not by account UUID. Only include platforms the user has connected and that are not expired — status: "expired" means the account must be reconnected in the Fuxux dashboard (Settings → Accounts) before it can publish again; publishing to it will fail otherwise.
3. Dashboard summary
GET /api/dashboard
Authorization: Bearer $FUXUX_API_KEY
High-level stats (postsThisMonth, totalPublished, upcomingThisWeek), next scheduled posts, and per-platform connection info.
4. Upload media
Option A — Fuxux upload (works with fx_live_ API keys too, not just browser sessions):
POST /api/media/upload
Content-Type: multipart/form-data
Form field file. Allowed: JPEG, PNG, GIF, WebP, MP4, MOV, WebM. Fuxux itself allows up to 50 MB, but the underlying hosting platform hard-caps any single request body at ~4.5 MB — files above that will fail here regardless of the 50 MB limit. For anything larger, use Option B.
Response includes public url — pass it in media_urls on post create.
Option B — API-only / agent workspace (recommended, and required for files over ~4 MB):
Upload video or image to your own CDN or object storage, then pass public HTTPS URLs in media_urls (up to 4 URLs).
5. Create post — publish now, schedule, or save draft
POST /api/posts
Authorization: Bearer $FUXUX_API_KEY
Content-Type: application/json
Body:
| Field | Required | Description |
|---|---|---|
captions | Yes* | Object: platform id → caption string. Unknown keys are ignored. |
prompt | No | Short idea stored on the post (max 500 chars). |
scheduled_at | No | ISO 8601 future datetime. Omit to publish immediately. |
media_urls | No | Up to 4 public URLs (images/video). |
draft | No | If true, saves as draft — does not publish or schedule. Cannot combine with scheduled_at. |
* Not required when draft: true if prompt is set.
Publish now — X + LinkedIn:
{
"prompt": "Shipped analytics timeframe picker",
"captions": {
"twitter": "You can now pick 7/14/30/90 days in Fuxux Analytics 📊",
"linkedin": "We shipped a clearer analytics experience — pick your chart window and keep monthly summaries separate."
}
}
Schedule for later:
{
"captions": { "instagram": "Tomorrow: AMA at 3pm ET" },
"scheduled_at": "2026-05-20T19:00:00.000Z",
"media_urls": ["https://cdn.example.com/promo.jpg"]
}
Save draft (publish later from Fuxux UI or a follow-up API call):
{
"prompt": "Thread idea: 5 lessons from our first 100 customers",
"captions": {
"twitter": "Draft hook — refine before posting",
"linkedin": "Long-form draft for LinkedIn"
},
"draft": true
}
Immediate publish response includes per-platform results[] with success, platform_post_id, and error when applicable — plus two fields worth checking before treating a result as a hard failure:
still_processing: true meanssuccessisfalsebut the post was accepted and may still go live shortly (some networks confirm status asynchronously). Don't retry or tell the user it failed — checkGET /api/posts?status=publishedagain after at least 60 seconds instead (never in a tight loop).inbox_pending: true means the platform accepted the media into an inbox/draft flow (e.g. TikTok's upload inbox) rather than publishing directly — counts as success, but the user may need to finish posting from within that platform's own app.
Rate limits: ~30 creates per 5 minutes per user; 120 requests/min per API key and 300/min per account across all keys. Over the limit returns 429 with Retry-After (seconds): wait that long before retrying. Don't poll: post status settles on the order of minutes, so check at most once a minute.
6. List posts (queue / calendar)
GET /api/posts?month=2026-05&status=scheduled
Authorization: Bearer $FUXUX_API_KEY
| Query | Meaning |
|---|---|
month | YYYY-MM — filter scheduled posts in that calendar month |
status | scheduled | published | draft | all |
limit | Optional, 1–50 |
Response: posts[] with post_variants (per-platform content + status) and counts (scheduled, published, drafts).
7. Check publish status
There is no separate /post-results endpoint. Inspect status via:
GET /api/posts?status=published
GET /api/posts?status=scheduled
Each post / variant has status: draft, scheduled, publishing, published, or failed. Failed variants include error_message.
For immediate publishes, the POST /api/posts response already returns results[].
8. Delete a scheduled post
DELETE /api/posts/{post_id}
Works with your fx_live_ API key. A draft or scheduled post is removed and will never publish. For an already-published post this deletes only Fuxux's record — it does not remove the post from the social platform. Returns 409 while the post is mid-publish; wait a moment and retry.
9. Publishing analytics
GET /api/analytics?days=30
days ∈ 7 | 14 | 30 | 90 (default 30).
Returns publishing stats: totals, success rate, daily post counts, platform breakdown (published vs failed), recent posts.
Also includes real third-party engagement where available — likes, comments, shares, views, impressions, reach:
engagement: totals across the selected window, pluspostsWithInsights(how many posts have synced data).platformBreakdown[].engagement/.postsWithInsights: the same, broken down per platform.recentPosts[].post_variants[].insights: per-post detail, includingengagement_rate(not summed at the aggregate level since it's a percentage).
Engagement is only populated for posts published to a platform with native insights support, and syncs in on a delay (a few hours after publish, refreshed periodically) — expect postsWithInsights: 0 / missing insights for brand-new posts or platforms without engagement support yet.
Works fine with fx_live_ API keys — get_dashboard via MCP is also a good lighter-weight option for quick summaries.
Platform IDs (captions keys)
Use these string ids (must match connected accounts):
| Platform | Id | Typical char limit |
|---|---|---|
| Twitter / X | twitter | 280 |
instagram | 2200 | |
linkedin | 3000 | |
facebook | 63206 | |
| TikTok | tiktok | 2200 |
| YouTube | youtube | 5000 |
| Bluesky | bluesky | 300 |
| Threads | threads | 500 |
pinterest | 500 | |
| Discord | discord | 2000 |
| Kick | kick | 140 (stream title) |
| Twitch | twitch | 140 (stream title) |
Platforms that need more than a caption (send them through targets on POST /api/posts; Twitch/Kick categories are REST-only):
- Google Business Profile is coming soon. It can't be connected or posted to yet, so don't offer it or send a
google-businesscaption. - Reddit is not available to agents. Reddit posts are written and approved by the user in the Fuxux web app; a
redditcaption or target is refused with 403reddit_web_only. Don't retry it; tell the user to post to Reddit from the app. - Twitch / Kick don't have posts: the first line of the caption becomes the channel's stream title, and publishing updates the channel (at the scheduled time, if scheduled). Optional category:
{"account_id": "<uuid>", "platform": "twitch", "category": {"id": "509658", "name": "Just Chatting"}}(numeric Twitch game id / Kick category id). No media on either.
Per-platform captions (Fuxux model)
Unlike APIs that take one caption + platform config objects, Fuxux expects one caption per platform in the captions map. Tailor tone and length per network:
{
"captions": {
"twitter": "Short hook + link 🚀",
"linkedin": "Three-paragraph story with a clear takeaway for professionals.",
"instagram": "Visual-first caption with 3–5 hashtags #buildinpublic"
},
"media_urls": ["https://cdn.example.com/launch.mp4"]
}
Only include keys for platforms that are connected (GET /api/accounts).
Connecting new accounts (human-in-the-loop)
The agent should not handle OAuth secrets alone. Instruct the user to connect in the Fuxux UI:
- OAuth: Twitter/X, Instagram, LinkedIn, Facebook, TikTok, YouTube, Threads, Pinterest, Discord, Kick, Twitch — Settings → Accounts
- Bluesky: app password in Fuxux UI (not in chat)
Recommended workflow for video content
-
Keep source videos in a workspace folder (e.g.
content/inbox/). -
Optional: extract a frame for caption context:
ffmpeg -i video.mp4 -ss 00:00:04 -frames:v 1 frame.jpg -y -
Write per-platform captions (short for X/Bluesky, longer for LinkedIn).
-
Upload media to public storage or use Fuxux upload from the web app → copy
url. -
POST /api/postswithcaptions+media_urls— publish now or setscheduled_at. -
Move posted assets to
content/posted/to avoid duplicates. -
After scheduled time,
GET /api/posts?status=publishedorget_dashboardto confirm delivery. -
Review
GET /api/analytics?days=30for volume and success rate trends.
Tips
- List accounts first — intersect
captionskeys with connected platforms, and skip any account withstatus: "expired"(tell the user to reconnect it in Settings → Accounts instead of trying to publish to it). - Stagger schedules across the day (e.g. 9:00 and 15:00 UTC) for better reach.
- Batch schedule with future
scheduled_atvalues; Fuxux publishes automatically at the scheduled time. - Draft mode (
draft: true) for human review before going live. - MCP
create_postmirrors REST — use it from OpenClaw for fewer raw HTTP calls. - 429 / rate limits: respect
Retry-After; avoid burst posting and never poll in a loop without sleeping (once a minute is plenty for status checks). - AI captions:
POST /api/ai/generateworks withfx_live_API keys and enforces a monthly quota by plan — for unauthenticated one-off copy ideas outside a Fuxux account, the public tools (/api/tools/tiktok-caption,/api/tools/youtube-tags) are also an option.
API key coverage (today)
| Route | fx_live_ API key |
|---|---|
GET /api/settings/profile | ✅ |
GET /api/accounts | ✅ |
GET /api/dashboard | ✅ |
GET /api/posts | ✅ |
POST /api/posts | ✅ |
GET /api/analytics | ✅ |
POST /api/media/upload | ✅ |
GET /api/posts/{id} | ✅ |
PATCH /api/posts/{id} | ✅ |
DELETE /api/posts/{id} | ✅ |
POST /api/ai/generate | ✅ |
When a route returns 401 with an API key, tell the user to complete the action in the Fuxux web app or use MCP tools that wrap supported routes.
Safety
- Treat
FUXUX_API_KEYlike a password — rotate from Settings if leaked. - Confirm before mass posting or irreversible actions; dry-run with
list_posts+list_connected_accountsfirst. - Warn users that agents may read workspace files (including
.env) when following these instructions.
Install (ClawHub)
openclaw skills install @abogitoff/fuxux-openclaw-skill
Version
- Skill:
1.1.5(see frontmatter) - Compatible with: Fuxux production —
https://www.fuxux.com - MCP server:
fuxuxv1.2.2 (8 tools)
Top skills in this category
Playwright MCP
@spiceman161Browser automation via Playwright MCP server. Navigate websites, click elements, fill forms, extract data, take screenshots, and perform full browser automation workflows.
YouTube
@byungkyuYouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a YouTube connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a YouTube action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with YouTube examples; they add no YouTube capability - YouTube is not an event source, a trigger cannot read YouTube data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).
Peekaboo
@steipeteCapture and automate macOS UI with the Peekaboo CLI.
google-slides
@byungkyuGoogle Slides API integration with managed OAuth. Create presentations, add slides, insert content, and manage slide formatting. Use this skill when users want to interact with Google Slides. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Calls run through the `maton` CLI with OAuth login, or over raw HTTP with a Maton API key where the CLI cannot be installed. Every call is authenticated as the user's connection and reaches only what that connection's authorization allows, which the provider enforces on every request; the endpoints documented here are the ones this skill uses, and any other endpoint of this app needs the user to ask for it by name. Default to read and list calls, and confirm every write or new connection with the user. This file also documents the three constructs that turn a Google Slides connection into automation, in the order they are used: the connection (the first step), a hosted function that runs a Google Slides action through the Maton SDK, and a trigger that calls that function on a schedule or on an event. Those sections are the platform's own reference text, shared with the api-gateway skill, with Google Slides examples; they add no Google Slides capability - Google Slides is not an event source, a trigger cannot read Google Slides data, and the files under `references/<source>/triggers.md` are the platform's event catalogues for the sources Maton offers (time, Calendly, GitHub, Gmail, HubSpot, Linear, Notion, Slack, Stripe).
百度网盘
@wscats百度网盘(Baidu Drive, pan.baidu.com)文件管理 — 上传、下载、转存、分享、搜索、移动、复制、重命名、创建文件夹、删除(高风险,需用户确认)。 同时支持 Agent 记忆备份/恢复(kimiclaw/maxclaw/qclaw/openclaw)。 TRIGGER: 用户消息明确提及"百...