Install
openclaw skills install clawbirdX/Twitter integration — post, reply, search, like, follow, DMs, and mentions via the official X API v2
openclaw skills install clawbirdYou have access to 13 tools for interacting with X (Twitter) via the official X API v2. All tools return JSON with results and estimated API cost.
This plugin authenticates to the X API using OAuth 1.0a User Context for write operations (posting, liking, following, DMs) and optionally a Bearer Token for read-only operations (search, user lookup).
Where credentials come from: You must generate them at the X Developer Portal:
How credentials are provided: Credentials are passed to the plugin at runtime by the OpenClaw plugin config system (pluginConfig). The plugin never reads config files directly. Fallback: environment variables X_API_KEY, X_API_SECRET, X_ACCESS_TOKEN, X_ACCESS_SECRET, X_BEARER_TOKEN.
No credentials are hardcoded or bundled. The plugin will return a clear error if credentials are missing.
All network requests go exclusively to the official X API v2. No other hosts are contacted.
| Endpoint | Method | Tool(s) | Data Sent |
|---|---|---|---|
https://api.x.com/2/tweets | POST | x_post_tweet, x_post_thread, x_reply_tweet | Tweet text, reply metadata |
https://api.x.com/2/tweets/:id | GET | x_get_tweet | Tweet ID |
https://api.x.com/2/tweets/search/recent | GET | x_search_tweets | Search query string |
https://api.x.com/2/users/me | GET | x_like_tweet, x_get_mentions, x_follow_user | (auth headers only) |
https://api.x.com/2/users/by/username/:username | GET | x_get_user_profile, x_send_dm, x_follow_user | Username |
https://api.x.com/2/users/:id/likes | POST | x_like_tweet | Tweet ID |
https://api.x.com/2/users/:id/mentions | GET | x_get_mentions | User ID, pagination params |
https://api.x.com/2/users/:id/following | POST | x_follow_user | Target user ID |
https://api.x.com/2/dm_conversations/with/:id/messages | POST | x_send_dm | Message text, recipient ID |
https://api.x.com/2/dm_conversations/with/:id/dm_events | GET | x_get_dms (filtered) | Participant ID |
https://api.x.com/2/dm_events | GET | x_get_dms (all) | Pagination params |
api.x.com (official X API). No other domains are contacted.clawbird-interactions.jsonl file to the working directory, logging mutation actions (posts, likes, follows, DMs) so the agent can avoid duplicating work. No other files are read or written beyond the declared environment variables.Clawbird is an npm-distributed skill — the runtime code is installed via npm i -g @xonder/clawbird and is not bundled in the ClawHub skill archive. The security properties below can be verified by auditing the source:
api.x.com (source: src/client.ts)clawbird-interactions.jsonl) for session interaction logging — no other filesystem access (source: src/interaction-log.ts)@xdevplatform/xdk SDK and @sinclair/typeboxnpm testSince this skill installs code from npm at runtime, review the source or pin a specific version (npm i -g @xonder/clawbird@1.1.0) before granting credentials.
The following tools modify remote state on your X account:
| Tool | Action | Reversible? |
|---|---|---|
| x_post_tweet | Posts a tweet | Delete manually |
| x_post_thread | Posts multiple tweets | Delete manually |
| x_reply_tweet | Posts a reply | Delete manually |
| x_like_tweet | Likes a tweet | Unlike manually |
| x_follow_user | Follows a user | Unfollow manually |
| x_send_dm | Sends a direct message | Cannot unsend |
Recommendation: If running autonomously, consider requiring explicit user confirmation before write actions by configuring agent-level tool policies. Read-only tools (x_get_tweet, x_search_tweets, x_get_user_profile, x_get_mentions, x_get_dms, x_get_cost_summary) are safe for autonomous use.
x_post_tweet — Post a single tweet.
text (required): Tweet content (max 280 chars){ id, text, url, estimatedCost }x_post_thread — Post a multi-tweet thread.
tweets (required): Array of tweet texts (posted in order, each as a reply to the previous){ threadId, tweetCount, tweets: [{ id, text, url }], estimatedCost }x_reply_tweet — Reply to an existing tweet.
tweetId (required): Tweet ID or full URL (e.g. https://x.com/user/status/123456)text (required): Reply content (max 280 chars){ id, text, url, inReplyTo, estimatedCost }x_like_tweet — Like a tweet.
tweetId (required): Tweet ID or full URL{ liked, tweetId, estimatedCost }x_follow_user — Follow a user.
username (required): Username to follow (with or without @){ following, user: { id, username }, estimatedCost }x_get_tweet — Get a single tweet by ID or URL.
tweetId (required): Tweet ID or full URL (e.g. https://x.com/user/status/123456){ id, text, authorId, createdAt, metrics, conversationId, lang, url, author: { id, name, username, verified, profileImageUrl }, estimatedCost }x_search_tweets — Search recent tweets (last 7 days).
query (required): Search query — supports X operators like from:user, #hashtag, "exact phrase", -exclude, lang:enmaxResults (optional): 10–100, default 10{ query, resultCount, tweets: [{ id, text, authorId, createdAt, metrics, url }], estimatedCost }x_get_user_profile — Get a user's profile.
username (required): Username with or without @{ id, name, username, description, followersCount, followingCount, tweetCount, verified, profileImageUrl, url, createdAt, location, profileUrl, estimatedCost }x_get_mentions — Get recent mentions of the authenticated account.
maxResults (optional): 5–100, default 10{ resultCount, mentions: [{ id, text, authorId, createdAt, metrics, url }], estimatedCost }x_send_dm — Send a direct message to a user.
username (required): Recipient's username (with or without @)text (required): Message content{ sent, eventId, conversationId, recipient: { id, username }, estimatedCost }x_get_dms — Get recent direct messages.
username (optional): Filter DMs to a specific user's conversationmaxResults (optional): 1–100, default 10{ resultCount, messages: [{ id, text, senderId, createdAt, conversationId, eventType }], estimatedCost }x_get_interaction_log — Get the log of all write actions performed this session (posts, replies, likes, follows, DMs). Useful to review what has already been done and avoid duplicating actions.
limit (optional): Maximum number of recent entries to return (default: all){ totalEntries, returned, logFile, entries: [{ timestamp, action, summary, details }] }x_get_cost_summary — Get cumulative API cost for this session.
{ totalCost, breakdown: { [action]: { calls, totalCost } } }from:username to search a specific user's tweets#hashtag for hashtag search"exact phrase" for exact matches#AI from:openai -is:retweet lang:en-is:retweet to filter out retweetsEvery tool response includes an estimatedCost field. Approximate costs:
Use x_get_cost_summary to check cumulative session spend before expensive operations.
All tools return errors as { error: "message", details?: ... }. Common issues:
npm i -g @xonder/clawbird