Skip to content

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? ​

text
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.
bash
socifyr post "Shipped v2.0 today" --to x-myhandle,linkedin-myhandle --wait
typescript
import { 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)
python
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"])
bash
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"
  }'
json
{
  "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:

json
{
  "success": true,
  "data": {
    "success": true,
    "requestId": "b3f1c0de-7a52-4d0e-9a7b-5c2f1e6a9d10",
    "usage": { "count": 4, "limit": 30, "remaining": 26 },
    "uploadId": "6a05032a84584482ace13d5f"
  }
}
  • uploadId is the post ID. The SDK exposes it as upload.id.
  • usage.limit is -1 on plans with unlimited posts.
  • Python's uploads.text() sends async: true, so the Python response has requestId, message and totalChannels instead of uploadId. Pass requestId to uploads.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.

bash
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? ​

  • text is 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).
  • title is limited to 500 characters and description to 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? ​

ErrorStatusFix
text is required400Send a non-empty text.
Connection "x-oldname" not found or not active. Check your connections page for valid slugs.400Run socifyr connections or list_connections and copy the exact slug.
Upload limit reached for your plan. Upgrade to continue.403Check usage or upgrade.
X (Twitter) post allowance reached ...403X posts are capped per plan each month. Wait for the reset or upgrade.
reconnect_required: ... in the channel resultn/aThe 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.

Next steps ​