Docs / X account operations

Use a connected X account from Soundside

Connect one X account, review a finished image or video in Soundside, then use the existing publish_content MCP tool for the supported X reads and writes. X operations require authenticated credits and are unavailable through x402.

One-time setup

Connect X and grant only the capabilities an agent needs

  1. Open Account settings and choose Connect X.
  2. Review the consent notice and approve the X authorization in the browser.
  3. For an unattended API key or verified OAuth client, select read, publish, and/or manage as needed.

Read permits account and Post lookups. Publish permits posts and replies. Manage permits edits, deletes, likes, and reposts. Older grants are publish-only until you explicitly add another capability.

Soundside stores the X OAuth 1.0a authorization separately from website login. It does not need routine token refreshes or repeated Soundside login. Agents never receive an X password or token. Reconnecting or disconnecting X revokes unattended grants; reconnect the intended account and enable each agent again.

In the app

Review a finished resource before publishing

Open a completed image or video from your library, select Publish to X, review the account, caption, disclosure choice, and assets, then select Publish. The new dialog leaves Made with AI unchecked until you choose it. It locks the caption and disclosure with a pending request so recovery uses the exact payload.

Use one MP4 video up to 512 MiB and 140 seconds, with H.264/yuv420p and optional AAC audio, or one to four JPEG, PNG, or WebP images up to 5 MiB each. Image alt text is optional and aligns with its image.

Publish

Text, video, and images

action defaults to "publish". The MCP tool keeps made_with_ai: true as its compatibility default; agents should pass the disclosure choice explicitly. Every write needs a stable idempotency key.

Publish examples
// Text
{"name":"publish_content","arguments":{"action":"publish","destination":"x","idempotency_key":"xop-pub-a1","project_id":"11111111-1111-4111-8111-111111111111","text":"Today’s Soundside briefing is ready.","made_with_ai":false}}

// Finished MP4
{"name":"publish_content","arguments":{"action":"publish","destination":"x","idempotency_key":"xop-vid-a1","project_id":"11111111-1111-4111-8111-111111111111","text":"A quiet morning at the coast.","resource_ids":["22222222-2222-4222-8222-222222222222"],"made_with_ai":true}}

// Images with aligned alt text
{"name":"publish_content","arguments":{"action":"publish","destination":"x","idempotency_key":"xop-img-a1","project_id":"11111111-1111-4111-8111-111111111111","text":"Two moments from the new campaign.","resource_ids":["33333333-3333-4333-8333-333333333333","44444444-4444-4444-8444-444444444444"],"alt_texts":["A cyclist on a tree-lined road at sunrise.","A close view of the cyclist’s hands on the handlebars."],"made_with_ai":true}}

Read

Synchronous account and Post lookup

Supported reads are get_account, get_user, get_posts, list_posts, list_mentions, search_posts, list_followers, and list_following. They complete synchronously as a standard response with top-level data (an X object or list), meta, optional includes, bounded errors, Soundside-derived total_count, and next_pagination_token where available. There is no items field. An empty page is successful; partial data can arrive with errors.

username is valid only for get_user, which needs exactly one of username or x_user_id. List posts, followers, and following use the connected account by default or an explicit x_user_id; they never resolve a username behind the scenes. List posts and mentions require a limit of at least 5, recent search at least 10, and followers/following at least 1; every list caps at 100. Recent search covers the last seven days. Private fields are limited to the connected account’s own Posts where X permits them in its active window. Keep opaque pagination tokens unchanged.

Read examples
// Connected account, one user, and selected Posts
{"name":"publish_content","arguments":{"action":"get_account","destination":"x"}}
{"name":"publish_content","arguments":{"action":"get_user","destination":"x","username":"soundside"}}
{"name":"publish_content","arguments":{"action":"get_posts","destination":"x","post_ids":["1888000000000000001","1888000000000000002"],"include_private_metrics":false}}

// Lists and search; list posts/mentions require 5+, recent search 10+, relationships 1+; all cap at 100
{"name":"publish_content","arguments":{"action":"list_posts","destination":"x","x_user_id":"1888000000000000003","limit":10}}
{"name":"publish_content","arguments":{"action":"list_mentions","destination":"x","limit":10,"pagination_token":"opaque-page-token"}}
{"name":"publish_content","arguments":{"action":"search_posts","destination":"x","query":"soundside release","limit":10}}
{"name":"publish_content","arguments":{"action":"list_followers","destination":"x","x_user_id":"1888000000000000003","limit":10}}
{"name":"publish_content","arguments":{"action":"list_following","destination":"x","limit":10}}

Reply and manage

Explicit writes with live checks

Supported writes are reply, edit, delete, like, unlike, repost, and unrepost. X permits a self-serve reply only when the original author mentioned the replying account or quoted one of its Posts (the account is summoned). Soundside does not automatically reply to mentions. For publish/reply, omit reply_settings for X’s default or choose mentionedUsers, following, subscribers, or verified.

Edit reads current X edit controls rather than promising a fixed edit window. With preserve_media: true (the default), omit replacement media. Soundside rejects an edit before mutation when it cannot preserve the existing media safely; use preserve_media: false only with the complete replacement payload. Media preservation uses saved upload IDs for posts published through Soundside. For attachments from elsewhere, supply replacement library resources with preservation disabled.

Write examples
// Reply is allowed only when X considers the account summoned
{"name":"publish_content","arguments":{"action":"reply","destination":"x","idempotency_key":"xop-reply-a1","post_id":"1888000000000000001","text":"Thanks for the feedback.","made_with_ai":false}}

// Edit checks live X edit controls; preserve existing media when safe
{"name":"publish_content","arguments":{"action":"edit","destination":"x","idempotency_key":"xop-edit-a1","post_id":"1888000000000000001","text":"Updated copy.","preserve_media":true,"made_with_ai":false}}

// Target-only operations
{"name":"publish_content","arguments":{"action":"delete","destination":"x","idempotency_key":"xop-del-a1","post_id":"1888000000000000001","text":"","made_with_ai":false}}
{"name":"publish_content","arguments":{"action":"like","destination":"x","idempotency_key":"xop-like-a1","post_id":"1888000000000000001","text":"","made_with_ai":false}}
{"name":"publish_content","arguments":{"action":"unlike","destination":"x","idempotency_key":"xop-unlike-a1","post_id":"1888000000000000001","text":"","made_with_ai":false}}
{"name":"publish_content","arguments":{"action":"repost","destination":"x","idempotency_key":"xop-repost-a1","post_id":"1888000000000000001","text":"","made_with_ai":false}}
{"name":"publish_content","arguments":{"action":"unrepost","destination":"x","idempotency_key":"xop-unrepost-a1","post_id":"1888000000000000001","text":"","made_with_ai":false}}

Receipts

Recover writes without duplicate actions

Reads finish in the call. Writes are asynchronous and return a durable receipt resource. Publish, reply, and edit receipts include a Post ID and URL when confirmed. Delete, like, unlike, repost, and unrepost receipts describe the completed operation; they do not claim a new post exists.

Check the receipt's status with free lib_list, including after a reconnect. A notifications/resources/updated push may also arrive, but don't rely on it. Reuse an exact idempotency key after a lost response only to recover its durable request. If the receipt is unknown, X may have accepted the write: inspect X before starting anything new.

Recover a receipt
{"name":"lib_list","arguments":{"entity_type":"resources","resource_ids":["55555555-5555-4555-8555-555555555555"]}}

Pricing and limits

Authenticated credits only

One credit is $0.01 USD. Publish is 2 credits normally or 22 credits with a URL, with the existing nonempty image-alt-text class. Reply uses the same class. Edit charges ceil(total provider USD × 110): 3 credits for plain text or 23 with a URL before optional alt-text metadata. Delete costs 2 credits including ownership lookup; like, unlike, repost, and unrepost cost 2 credits each.

Post reads (get_posts, list_posts, list_mentions, search_posts) are ceil(0.55 × N) credits. User and relationship reads (get_account, get_user, list_followers, list_following) are ceil(1.1 × N). Soundside quotes the requested-page ceiling before execution, then settles against the actual returned count N; an empty result costs 0.

X operations are excluded from the x402 lane and never appear in /api/x402/status. See Pricing & Limits for credit behavior.

Not supported

Deliberate boundaries

This release excludes DMs, bookmarks, ads, quote creation, and raw X endpoint passthrough. Quote creation is Enterprise-only. Soundside does not schedule activity; use your own scheduler or workflow for an explicit tool call.