How to publish a text post to several platforms
Send one POST /api/content/text request with a list of connection slugs and a text field. Socifyr queues one publish job per account and reports a result for each. The same task works from the dashboard, the CLI, the TypeScript and Python SDKs, plain REST, and an MCP agent.
You need an API key and at least one connected account. If you have neither, start with the Quickstart and Connections and slugs.
How do I publish a text post?
1. Sidebar > New Post.
2. Pick the text content type and select your accounts.
3. Write the caption. Add a first comment if you want one.
4. Click Publish.socifyr post "Shipped v2.0 today" --to x-myhandle,linkedin-myhandle --waitimport { Socifyr } from '@socifyr/sdk'
const socifyr = new Socifyr({
apiKey: process.env.SOCIFYR_API_KEY!,
workspaceId: process.env.SOCIFYR_WORKSPACE_ID!,
})
const upload = await socifyr.uploads.text({
connections: ['x-myhandle', 'linkedin-myhandle'],
text: 'Shipped v2.0 today',
})
console.log(upload.id, upload.requestId)from socifyr import Socifyr
client = Socifyr() # reads SOCIFYR_API_KEY and SOCIFYR_WORKSPACE_ID
res = client.uploads.text(
connections=["x-myhandle", "linkedin-myhandle"],
text="Shipped v2.0 today",
)
print(res["requestId"])curl -X POST https://api.socifyr.com/api/content/text \
-H "Authorization: Bearer $SOCIFYR_API_KEY" \
-H "X-Workspace-Id: $SOCIFYR_WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"connections": ["x-myhandle", "linkedin-myhandle"],
"text": "Shipped v2.0 today"
}'{
"tool": "post_text",
"arguments": {
"caption": "Shipped v2.0 today",
"connections": ["x-myhandle", "linkedin-myhandle"]
}
}Prompt for your agent: "Post 'Shipped v2.0 today' to my X and LinkedIn accounts." The agent calls list_connections to find the slugs, then post_text.
What does the response look like?
The REST response uses the { success, data } envelope. The data object carries the upload ID and a request ID:
{
"success": true,
"data": {
"success": true,
"requestId": "b3f1c0de-7a52-4d0e-9a7b-5c2f1e6a9d10",
"usage": { "count": 4, "limit": 30, "remaining": 26 },
"uploadId": "6a05032a84584482ace13d5f"
}
}uploadIdis the post ID. The SDK exposes it asupload.id.usage.limitis-1on plans with unlimited posts.- Python's
uploads.text()sendsasync: true, so the Python response hasrequestId,messageandtotalChannelsinstead ofuploadId. PassrequestIdtouploads.get_status(). - If the API key requires approval, the post is held for review and the response includes
"status": "pending_approval". See Approvals and guardrails.
How do I add a first comment?
Use firstComment (REST, SDK) or firstComment on the MCP post_text tool. It takes a string or an object with text, linkUrl and imageUrl. Platforms that cannot post a first comment ignore it; see platform constraints.
curl -X POST https://api.socifyr.com/api/content/text \
-H "Authorization: Bearer $SOCIFYR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"connections": ["linkedin-myhandle"],
"text": "We just open-sourced our scheduler.",
"firstComment": "Repo: https://github.com/socifyr/socifyr"
}'What are the limits on a text post?
textis required and can be up to 25,000 characters in the request. Each platform then enforces its own caption limit (X allows 280, Bluesky 300).titleis limited to 500 characters anddescriptionto 5,000.- A post to several platforms must fit the shortest limit unless you override the text per account with
platformOptions. See Cross-posting.
What errors can I get, and how do I fix them?
| Error | Status | Fix |
|---|---|---|
text is required | 400 | Send a non-empty text. |
Connection "x-oldname" not found or not active. Check your connections page for valid slugs. | 400 | Run socifyr connections or list_connections and copy the exact slug. |
Upload limit reached for your plan. Upgrade to continue. | 403 | Check usage or upgrade. |
X (Twitter) post allowance reached ... | 403 | X posts are capped per plan each month. Wait for the reset or upgrade. |
reconnect_required: ... in the channel result | n/a | The token is dead. Follow Connect, refresh and reconnect accounts. |
More in the error reference.
FAQ
Can I post to every account on one platform at once?
No wildcard exists. List each slug, or filter the connection list in code. See Cross-posting.
How do I know whether it published?
Poll the status endpoint or subscribe to webhooks. See Check status and retry failures.
Is posting idempotent?
Send idempotencyKey (up to 64 characters) in the body. A second request with the same key and workspace returns the existing record instead of posting again.