通过 Claw Post API 发布到 X(Twitter)、LinkedIn、Facebook 和 TikTok。搜索 Facebook 群组,加入并向其发布内容。适用于用户想要发布内容时。
Social posting infrastructure for AI agents. A paired browser extension publishes from the user's real browser session — no API keys to the social platforms needed.
POST /v1/jobs/tweet endpoint.publish_to_groups is gone; Buffer/Zapier cannot publish there. Post only to groups the human already belongs to. Never auto-join, never discover→join→post.https://mcp.clawpost.net/mcp) uses Streamable HTTP with OAuth 2.0. Claude, ChatGPT, Hermes, and other agents built on the official MCP SDKs (TypeScript, Python, and compatible clients) can connect — no Claw Post API key required.The old bird / steipete X posting skill is discontinued (404). If the human hit that break and still needs agents to post from a real browser session:
@daydreamnationtechlabs/clawpost.io.github.Daydreamnationtechlabs/clawpostopenclaw skills install @daydreamnationtechlabs/clawpostCapabilityEndpointPlatformsPost to feed or groupPOST /v1/jobs/tweetX, LinkedIn, Facebook, TikTok, InstagramComment / reply on a threadPOST /v1/reddit/commentRedditUpload media for posts (small files)POST /v1/media/uploadX, LinkedIn, Facebook, TikTok, InstagramUpload large media (signed URL)POST /v1/media/upload-urlX, LinkedIn, Facebook, TikTok, InstagramSearch for groupsPOST /v1/groups/searchFacebookJoin a groupPOST /v1/facebook/groups/joinFacebookCheck group membershipPOST /v1/facebook/groups/statusFacebookPoll any job resultGET /v1/jobs/:idAll
All endpoints require the clawpost-api-key header.
MCP agents: If your agent supports the Model Context Protocol, point it at
https://mcp.clawpost.net/mcpand complete OAuth instead of using this REST API. Tools:list_platforms,create_post,create_reddit_comment,get_upload_url,get_post_status, andget_account_status. Use an MCP client that supports Streamable HTTP (current Anthropic / OpenAI SDK paths and the reference Python client).
Before any action works, the human must:
CLAWPOST_API_KEY environment variable in the agent (copy the key from the Dashboard — it is not embedded in this skill file)Extension scope. The Chrome extension is designed to activate on supported social sites and when communicating with the Claw Post API. Verify permissions on the Chrome Web Store listing and review the Terms of Service before installing.
If the agent gets EXTENSION_NOT_PAIRED or not_logged_in, direct the human to complete these steps.
If automatic pairing fails, use the Dashboard 6-digit code flow as a fallback.
All requests use the clawpost-api-key header:
text
clawpost-api-key: YOUR_CLAWPOST_API_KEY
The value above is a placeholder. Set the real secret via the CLAWPOST_API_KEY environment variable (or your agent’s secret store); do not paste live keys into this file or commit them to version control.
text
https://api.clawpost.net
This is the stable, official Claw Post API endpoint. Full documentation: https://clawpost.net/api-docs
Create a post job, then poll for completion.
text
POST https://api.clawpost.net/v1/jobs/tweet
Content-Type: application/json
clawpost-api-key: YOUR_CLAWPOST_API_KEY
X (Twitter):
json
{ "text": "Hello world!", "platform": "x" }
LinkedIn:
json
{ "text": "Hello LinkedIn!", "platform": "linkedin" }
Facebook feed:
json
{ "text": "Hello Facebook!", "platform": "facebook" }
Facebook group (use groupUrl from search results, or a known groupId):
json
{
"text": "Hello group!",
"platform": "facebook",
"platformPayload": { "groupUrl": "https://www.facebook.com/groups/123456789/" }
}
TikTok (video + caption):
json
{ "text": "Caption text", "platform": "tiktok", "mediaPaths": ["<url from upload>"] }
Instagram (image or video + caption):
json
{ "text": "Caption text", "platform": "instagram", "mediaPaths": ["<url from upload>"] }
Instagram requires at least one media file (image or video). Text-only posts are not supported.
Optional fields:
platform – "x" (default), "linkedin", "facebook", "tiktok", or "instagram"mediaPaths – array of media URLs (upload first via media endpoint below)idempotencyKey – unique string to prevent duplicate postsplatformPayload – Facebook group targeting: { "groupId": "..." } or { "groupUrl": "..." }text
GET https://api.clawpost.net/v1/jobs/:id
Status progresses: queued → processing → succeeded | failed.
postUrl — the live URL of the published post. Share this with the user to confirm the post is live.error and errorCode.Reply to a specific Reddit post or comment through the user's logged-in Chrome. No Reddit API key. The agent must supply the target thread/comment URL — Claw Post does not find threads for you.
text
POST https://api.clawpost.net/v1/reddit/comment
Content-Type: application/json
clawpost-api-key: YOUR_CLAWPOST_API_KEY
json
{
"text": "Useful reply text",
"targetUrl": "https://www.reddit.com/r/example/comments/abc123/title/"
}
targetUrl must be a Reddit URL whose path includes /comments/ (post or comment permalink).idempotencyKey.GET /v1/jobs/:id the same way as posts. On success, postUrl is the live comment permalink.Upload media before posting. The returned url goes into the mediaPaths array.
Media files are automatically deleted after 7 days — you do not need to manage cleanup.
Send the file body directly to the API:
text
POST https://api.clawpost.net/v1/media/upload
clawpost-api-key: YOUR_CLAWPOST_API_KEY
Content-Type: multipart/form-data
Body: file=<media file>
Response:
json
{ "url": "https://storage.googleapis.com/..." }
For large files, get a signed upload URL first, then PUT the file directly to storage. This bypasses all proxy limits and works for files of any size.
Step 1 — request an upload URL:
text
POST https://api.clawpost.net/v1/media/upload-url
Content-Type: application/json
clawpost-api-key: YOUR_CLAWPOST_API_KEY
json
{ "filename": "video.mp4" }
contentType is optional — the API infers it automatically from the filename extension. Pass platform to validate the file type before uploading (e.g. "platform": "x" rejects audio files immediately).
Response:
json
{
"uploadUrl": "https://storage.googleapis.com/...?X-Goog-Signature=...",
"url": "https://storage.googleapis.com/...",
"resolvedContentType": "video/mp4"
}
Step 2 — PUT the file directly to uploadUrl using the resolved content type (no clawpost-api-key header — the URL is self-authorised):
text
PUT <uploadUrl>
Content-Type: <resolvedContentType from Step 1>
Body: <raw file bytes>
The signed URL will reject PUT requests with incorrect Content-Type headers (403). Always use the resolvedContentType value returned in Step 1.
Expect a 200 or 204 response from Google Storage. The upload window is 1 hour.
Step 3 — use the url in the job exactly as with small files:
json
{ "text": "Check this out!", "platform": "tiktok", "mediaPaths": ["<url from step 1>"] }
The url is valid for 24 hours — sufficient for any normal job queue time.
Out of scope for the recommended workflow. Post only to a groupUrl the human gave.
Optional lookup only. Use POST /v1/groups/search if the human already named a group and you need a canonical URL. Do not search for new groups to join. Do not chain search → join → post.
text
POST https://api.clawpost.net/v1/groups/search
Content-Type: application/json
clawpost-api-key: YOUR_CLAWPOST_API_KEY
json
{
"platform": "facebook",
"query": "ai automation",
"filters": { "minMembers": 1000, "privacy": "any" },
"limit": 20
}
platform: must be "facebook" (only supported platform for now).query: search keywords (required).filters.minMembers: minimum member count (optional).filters.privacy: "public", "private", or "any" (optional).limit: max results, up to 50 (optional, default 20).Response:
json
{ "jobId": "<id>" }
Poll GET https://api.clawpost.net/v1/jobs/:id until status is succeeded.
Results are in details.groupSearch.results[]. Each result:
FieldTypeDescriptionnamestringGroup title (best-effort; may say "Group" if title not extractable)urlstringCanonical group URL — use this for joining or postingplatformIdstring?Numeric Facebook group ID (when available)slugstring?URL slug (when available, e.g. "aiautomationagency")privacystring?"public", "private", or "unknown"``memberCountnumber?Approximate member count (when visible on search page)activityHintstring?Raw activity text, e.g. "10 posts a day"``joinStatusstring?"joined", "requested", "not_member", or "unknown"``scorenumber0–1 relevance score (higher = better match)reasonsstring[]Why this group scored well (e.g. "keyword match", "large member base", "active", "public")signalsobject?Raw numeric signals: keywordHit, memberCount, activityPerDay
Reliability notes:
url is always present and reliable. Use it as the primary identifier.name, memberCount, privacy, activityHint, and joinStatus are best-effort; they depend on what the search page exposes.score and reasons are computed by the extension from available signals.Out of scope for the recommended workflow. Do not call POST /v1/facebook/groups/join to grow membership. Only use it if the human already clicked Join in Facebook and is asking you to wait or retry a post.
Join a group so you can post to it. Use the url from search results (extract the group ID or pass the full URL).
text
POST https://api.clawpost.net/v1/facebook/groups/join
Content-Type: application/json
clawpost-api-key: YOUR_CLAWPOST_API_KEY
json
{ "groupId": "123456789" }
Response: a job object. Poll GET /v1/jobs/:id for completion.
On success, check details.buttonState:
"joined" – user is now a member; you can post."requested" – group requires approval; wait and check status later."not_member" – join may not have worked; retry or inspect.text
POST https://api.clawpost.net/v1/facebook/groups/status
Content-Type: application/json
clawpost-api-key: YOUR_CLAWPOST_API_KEY
json
{ "groupId": "123456789" }
Same polling pattern. details.buttonState tells you the current membership state.
POST /v1/facebook/groups/status). If buttonState is not "joined", stop and tell the human to join in Facebook themselves.POST /v1/jobs/tweet with platform: "facebook" and platformPayload: { "groupUrl": "<url they gave>" }.POST /v1/facebook/groups/join unless the human explicitly clicked Join in Facebook and is only asking you to wait/retry a post. Auto-join is out of scope.CLAWPOST_API_KEY is tied to a single account and can be rotated from the Dashboard at any time.Code / errorCodeCauseAction401Invalid or missing API keyCheck clawpost-api-key header503 / EXTENSION_NOT_PAIREDNo paired extensionUser must install and pair the extension at clawpost.net/dashboardnot_logged_inUser not logged in to the platformUser must log in to the platform in their browserno_x_tab / no_platform_tabNo browser tab for the platformRetry; extension will try to open onecontent_script_unavailableExtension could not reach the tabAsk user to refresh the platform tab, then retryselector_not_foundPlatform UI changed or element not foundRetry after a short delaygroup_not_approvedUser not a member / not approved in this groupDo not auto-join. Tell the human to join in Facebook if they want this group. Retry only after they are a member.challenge_requiredPlatform security check (captcha/checkpoint)Ask user to complete the challenge in their browser, then retry
On any failure, poll GET /v1/jobs/:id and read error and errorCode for details.
Full API docs: https://clawpost.net/api-docs