X
Service domainSOCIAL MEDIA
Arcade Optimized
Arcade.dev LLM tools for X (Twitter).
33tools
The X toolkit provides Arcade tools for interacting with the X (Twitter) platform, enabling LLMs to read and write tweets, manage lists, search content, and inspect user and Space metadata on behalf of an authenticated user.
Capabilities
- Tweeting & threads: Post, delete, like, unlike, retweet, undo-retweet, and quote tweets; compose multi-tweet threads with mid-thread resume support; attach polls and control reply permissions.
- Timeline & search: Fetch the home timeline, @-mentions, quote tweets, direct replies, and full conversation threads; search the recent (~7-day) tweet index by structured keyword filters with pagination and empty-page auto-follow.
- User & engagement data: Look up users by handle or numeric ID; retrieve liked tweets, authored tweets (full history), and engager lists (likers/retweeters); fetch the authenticated user's own profile.
- List management: Create, update, delete, pin, and unpin lists; add and remove members (with eventual-consistency and serialization caveats); read list members, list memberships for a user, and recent tweets from a list.
- Spaces: Look up a Space by ID, list live/scheduled Spaces by creator, and search Spaces by title.
OAuth
This toolkit uses OAuth 2.0 with X as the identity provider. See the Arcade X auth provider docs for setup details.
Available tools(33)
33 of 33 tools
Operations
Behavior
| Tool name | Description | Secrets | |
|---|---|---|---|
Add one or more users to an X List owned by the authenticated user.
Provide ``user_ids``, ``usernames``, or both. Adding a user who is already
a member is treated as success.
On a mid-loop rate-limit, the run short-circuits and remaining targets
are marked as not attempted. On retry, drop the targets that already
succeeded; otherwise polling re-arms X's bucket and extends the lockout.
X is eventually consistent on list membership: a success status here
does not mean a subsequent ``GetListMembers`` will immediately return
the new member. Allow a few seconds before relying on the read endpoint
to reflect the mutation.
Serialize dependent list mutations: do not fire ``AddListMember`` in
parallel with ``DeleteList``, ``RemoveListMember``, or ``UpdateList``
against the same ``list_id``. Concurrent dependent mutations race and
surface spurious ``not_found`` errors when the member call lands after
the list is gone. Await each mutation before issuing the next one on
the same list. | |||
Create a new X List owned by the authenticated user. | |||
Delete an X List owned by the authenticated user.
The list and its memberships are removed. The tool distinguishes "I just
deleted it" from "it was already gone" rather than collapsing both into
the same idempotent-success envelope.
Serialize dependent list mutations: do not fire ``DeleteList`` in
parallel with ``AddListMember`` / ``RemoveListMember`` / ``UpdateList``
/ ``PinList`` against the same ``list_id``. The list-membership endpoints
will race against the delete and surface a spurious ``not_found`` when
the member call lands after the list is gone. Await each mutation before
issuing the next one on the same list. | |||
Delete one of the authenticated user's tweets.
The tool distinguishes "I just deleted it" from "it was already gone"
rather than collapsing both into the same idempotent-success envelope. | |||
Fetch the conversation thread containing ``tweet_id``.
Returns every tweet that shares the same ``conversation_id`` as the
given tweet, ordered oldest-first so a caller can render the thread top
to bottom. The conversation root sits at position 0 whenever accessible.
Replies are pulled from the recent-search index (~7-day window) which
can lag real time by several minutes. To verify a specific reply, look
it up by id instead. | |||
Fetch the authenticated user's reverse-chronological home timeline.
Returns recent tweets from accounts the user follows. | |||
List members of an X List.
The members endpoint is eventually consistent: after ``AddListMember`` or
``RemoveListMember`` returns success, the membership read endpoints
(``GetListMembers``, ``GetListMembershipsForUser``) can take several
seconds to surface the change. The list-tweets endpoint
(``GetListTweets``) is typically refreshed faster than the members
endpoint, so an empty page immediately after an add is more likely a
consistency window than a genuine empty list. Re-query after a brief
wait when verifying a just-applied mutation. | |||
List the X Lists the target user is a member of.
Pass ``user_id`` or ``username`` (exactly one). With ``username``, the
handle is resolved to a numeric id first; passing ``user_id`` skips
that hop. | |||
List recent tweets from members of an X List, newest first. | |||
Fetch recent @-mentions of the authenticated user, newest first. | |||
List the X Lists a user owns.
Omitting both ``user_id`` and ``username`` defaults to the authenticated
user (the common "show me my lists" workflow after creating a list).
Each list record carries ``id``, ``name``, ``private``, ``description``,
``member_count``, ``follower_count``, ``owner_id``, and ``created_at``. | |||
Fetch public quote tweets of the given tweet. | |||
Fetch public DIRECT replies to a given tweet (last ~7 days).
Returns only tweets whose ``referenced_tweets`` carry a ``replied_to``
edge pointing at ``tweet_id`` -- not the whole conversation thread.
Sibling replies and nested replies further down the tree are filtered
out so the result reflects what a reader would see when expanding
"replies to this tweet" in the X UI. Use the conversation tool to get
the full thread surrounding a tweet instead.
The recent-search index can lag real time by several minutes, so a
just-posted reply may not appear yet. To verify a reply you just
posted, look it up by id instead.
Pagination note: each page is fetched as ``max_results`` from X's
recent-search index, then locally filtered down to direct replies.
Pages where every tweet is an indirect reply (sibling or nested) come
back with ``data=[]`` plus a ``next_token`` -- continue paginating to
surface the direct replies further into the conversation. | |||
List the live or scheduled X Spaces created by a set of users.
Useful for monitoring whether a set of accounts has any Space currently
airing or queued. Ended Spaces are not returned. | |||
List tweets a user has liked, newest-liked first.
Omitting both ``user_id`` and ``username`` defaults to the authenticated
user. Each tweet carries ``tweet_url``, ``author_username``,
``author_name``, and any media or poll enrichment.
When the target user's likes are private, the response is an empty page
indistinguishable from "no liked tweets." | |||
Fetch tweets authored by a specific X user, newest first.
Paginates through the author's full tweet history (no 7-day window).
Results include original tweets, replies (unless ``exclude_replies=True``),
retweets (unless ``exclude_retweets=True``), and quote tweets. Author
handle, name, and media or poll details are flattened onto each tweet. | |||
Like a tweet as the authenticated user.
Idempotent: liking an already-liked tweet succeeds. | |||
Look up a single X Space by its id.
Returns the Space's lifecycle state, title, creator, host and speaker
ids, language, and participant and subscriber counts.
X gates several Space metadata fields behind ownership: most non-host
callers cannot read a Space's full metadata, even when the Space surfaces
in a search or by-creator listing. | |||
List the users who liked or retweeted a tweet.
Each user record carries the standard handle, name, and profile metadata so
callers can render an engager row without a follow-up lookup.
When the tweet shows non-zero engagement in ``public_metrics`` but X's
engagers endpoint returns zero users on the first page, the call returns
an ``errors[0].type = "data_unavailable"`` envelope. This signals that
the account's X access tier does not expose engager lists for this
tweet; treat ``public_metrics.like_count`` / ``retweet_count`` from
``LookupTweetById`` as the authoritative engagement total in that case. | |||
Look up tweets by id (single or batched) on X.
Pass one id or up to 100 ids; the response is always a list. Each entry
carries ``referenced_tweets`` (``type`` of ``replied_to``, ``quoted``, or
``retweeted`` plus the parent ``id``), ``conversation_id``, and the
convenience fields ``tweet_url`` / ``author_username`` / ``author_name``.
Set ``include_author_only_metrics=True`` to retrieve ``non_public_metrics``
(impressions, user_profile_clicks, url_link_clicks) and ``organic_metrics``
for tweets the authenticated caller authored. X drops third-party tweets
from ``data`` when those fields are requested, so leave the flag false
unless every id in the batch is known to be authored by the caller. | |||
Look up X (Twitter) users by handle and/or numeric user id.
Provide ``usernames``, ``user_ids``, or both. Up to 100 of each per call. | |||
Pin an X List to the authenticated user's profile.
Idempotent: pinning an already-pinned list succeeds. | |||
Post a multi-tweet thread as the authenticated user.
Posts the first tweet, then chains every subsequent entry as a reply to
the prior tweet's id. ``tweets`` must contain 2-25 entries when posting a
new thread, or 1-25 entries when resuming an existing thread via
``parent_tweet_id`` (the 1-entry case lets a caller append one more reply
to the tail of a prior thread).
``poll_options`` / ``poll_duration_minutes`` / ``quote_tweet_id`` /
``reply_settings`` apply to the head tweet only.
Pre-flight validation runs on every entry before any post is created. If
any entry fails validation, the call posts nothing.
On a mid-thread interruption, ``posted`` carries the rows that landed
and ``next_position`` is the 1-based index of the first non-posted
entry (0 when every entry posted). Resume the chain with::
tweets = (tweets[next_position - 1 :],)
parent_tweet_id = posted[-1]["tweet_id"] # from the prior call
Without ``parent_tweet_id``, a resume call would re-create a fresh head
tweet and silently split the thread into two disconnected chains.
X also rejects mid-thread entries with ``status='invalid_input'`` when
the text passes local validation but contains codepoints that X counts
as multiple weighted characters (emoji, many CJK glyphs) pushing the
weighted total above 280, or when the text contains control characters
X disallows. Simplify the entry at ``tweets[next_position - 1]`` (plain
ASCII is the safest reset) and resume. | |||
Post a new tweet as the authenticated user.
The same tool covers top-level posts, replies, and quote tweets. Supply
``reply_to_tweet_id`` to post the new tweet as a reply; supply
``quote_tweet_id`` to quote another tweet; supply both to post a reply
that also quotes a tweet. Pass ``reply_settings`` to restrict who can
reply. Pass ``poll_options`` plus ``poll_duration_minutes`` to attach a
poll (polls cannot be combined with ``quote_tweet_id``).
For multi-tweet threads, use the post-thread tool. | |||
Remove one or more users from an X List owned by the authenticated user.
Provide ``user_ids``, ``usernames``, or both. Removing a user who is not
a member is treated as success.
On a mid-loop rate-limit, the run short-circuits and remaining targets
are marked as not attempted. On retry, drop the targets that already
succeeded; otherwise polling re-arms X's bucket and extends the lockout.
X is eventually consistent on list membership: a success status here
does not mean a subsequent ``GetListMembers`` will immediately stop
returning the removed member. Allow a few seconds before relying on the
read endpoint to reflect the mutation.
Serialize dependent list mutations: do not fire ``RemoveListMember`` in
parallel with ``DeleteList`` on the same ``list_id`` (a known race that
produces spurious ``not_found`` when the remove lands after the delete).
Await each mutation before issuing the next one on the same list. |
Page 1 of 2(25 of 33)
Last updated on