Site catalog

X (x.com) for AI Agents

x.com: 23 mapped actions across 9 screens

X is where conversations break first: news, launches, developer chatter, market sentiment. Through Rindler, your agent works that surface directly. It can run keyword and advanced-operator searches, sweep both the Top and Latest result tabs, open a post's full thread and expand replies, read any account's timeline and follower graph, pull the current trending topics by category, and follow curated Lists and Communities.

Every one of those reads comes back as structured records, not raw HTML. Posts arrive with their full text, permalink, author, timestamp, and engagement counts, so your agent can dedup, rank, and drill in without ever parsing the page.

What's mapped

The x.com config covers 23 actions across 9 screens, and it is built for reading and research. Search is the anchor: search lands on chronological Latest results, set_search_tab re-runs the same query under Top, People, Media, Photos, or Videos, and apply_advanced_query composes X's full operator grammar (from:, since:, until:, min_faves:, filter:media, lang:, OR, exact phrases) into a single query string. list_available_filters reports what applies in the current context, because filters are dynamic, not fixed.

From any result, the agent can go deeper: open_post reads a full thread with replies, load_more_replies expands it, open_quotes and open_reposts map who amplified a post, and open_profile plus set_profile_tab walk an account's posts, replies, highlights, followers, and following. get_trending_topics and set_explore_tab cover what's trending by category (for_you, trending, news, sports, entertainment), and open_list and open_community follow curated List and Community feeds by URL.

Quirks worth knowing

These come straight from the mapped action behavior, and they matter for correct results.

**Permalinks end in /analytics.** The permalink field on each post is a relative path like /handle/status/id/analytics. To open one with open_post, prepend https://x.com and strip the trailing /analytics. Only use ids that came back in results; never fabricate a status id.

**Top and Latest are not supersets of each other.** Latest is chronological and dedups likely spam; Top applies opaque ranking. For real topic coverage, sweep both tabs and union by permalink. Also, spaces in queries must be %20-encoded, never +.

**Infinite scroll has a ceiling.** load_more scrolls a virtualized feed and appends rows, but it only reaches so far back. For deep history, deep_paginate appends a max_id: snowflake cursor to the query (smallest post id seen so far, minus 1) and walks backwards in time, call after call.

**Some surfaces just don't exist or don't read.** X has no public likers page for a post (there is open_reposts, but no likers equivalent), a profile's likes tab is usually private and redirects back to the profile, and the media tab is an image grid with no post text.

Signing in

X puts nearly everything behind a login, and the mapping reflects that: every core action requires an authenticated session. The config records the login page (https://x.com/login) and the two cookies X keys a session on, auth_token and ct0. Once your session is captured through Rindler's login capture flow, it persists across the agent's calls, so the agent searches, reads threads, and browses profiles as your signed-in account without re-authenticating each time. A test-only login action (username, password, otp) also exists for the hosted handoff flow used in development.

Reading results

Every read lands as records in data.listings, and the mapped screens tell you what shape to expect. Search and timeline screens (search_results, list_timeline, community_timeline, post_thread) return posts: permalink, profile_url, timestamp, full_text, and engagement_summary with raw counts. People screens (search_people, profile_people, post_reposts) return accounts: name, profile_url, and a summary combining display name, handle, and bio. The explore_trends screen returns trend rows with a name and an optional search_url.

Three settle actions do the reading: list_results for the current search, timeline, or thread, list_user_posts for a profile timeline, and list_people for account results. Each read is capped at a handful of records, so the working loop is read, dedup by permalink, load_more, and stop when the deduped set stops growing.

Example session

start_session(url: "https://x.com")

# Latest results for the topic, then sweep Top too
dispatch_action(action: "search", params: { query: "..." })
dispatch_action(action: "set_search_tab", params: { tab: "top", query: "..." })

# Open the strongest post's full thread
dispatch_action(action: "open_post", params: { tweet_url: "https://x.com/.../status/..." })
dispatch_action(action: "load_more_replies")

close_session()

Every mapped action

Generated from the live site config. 21 of 23 actions require a signed-in session.

ActionWhat it does
apply_advanced_queryauthRun a search with advanced operators composed into one query string. Everything except the result tab lives inside query: space-join operators (space = AND), use OR (uppercase) for alternation, -term to exclude, double-quotes for exact phrases. Common operators: from:user to:user @user, since:YYYY-MM-DD until:YYYY-MM-DD, min_faves:N min_retweets:N min_replies:N, filter:media filter:images filter:videos filter:links filter:verified -filter:replies, lang:en, list:<id>, url:domain, #hashtag, $CASHTAG. Cap ~22 operators; time/source operators need at least one keyword. facet picks the tab (top/live/media/image/video). Spaces %20-encoded.
capture_login
deep_paginateauthReach results older than the single-scroll virtualization ceiling by appending a max_id: snowflake cursor to the query. Set cursor to the smallest post id you have seen so far minus 1 (post ids are the numeric segment of permalink). Repeat to walk backwards in time. Use this instead of load_more when you need deep historical coverage.
get_trending_topicsauthList what is trending right now (topics) for the account region. data.listings has trend rows: name (the trend label/blob) and an optional search_url. To explore a trend, search its name with the search action. Category variants via set_explore_tab.
list_available_filtersauthReport the filters available in the CURRENT search context (filters are dynamic, not fixed). Result tabs: Top (f= omitted/top), Latest (live), People (user), Media (media), Photos (image), Videos (video). Advanced operators that fold into the query: from: to: @user; since: until: (YYYY-MM-DD); min_faves: min_retweets: min_replies:; filter:media filter:images filter:videos filter:links filter:verified filter:follows filter:quote filter:replies and -filter:X to negate; lang:CODE; list:<id>; url:domain; near: within:; #hashtag; $CASHTAG; OR and -term and double-quote phrases. Compose with apply_advanced_query.
list_peopleauthSettle the People results and return accounts as data.listings: name (display name), profile_url (/<handle>), summary (display name + handle + bio). Open one with open_profile.
list_resultsauthSettle the current screen and return its records as data.listings (posts on a search/timeline/thread; accounts on the People tab). Read these directly; only fall back to extract_content if data.listings is empty when records are expected.
list_user_postsauthSettle a profile timeline and return the account recent posts as data.listings (same post fields as search). Fall back to extract_content only if empty when posts are expected.
load_moreauthLoad more results on a search or timeline screen. X uses virtualized infinite scroll, so this scrolls down and lets new rows append. After calling, read list_results and dedup by permalink; stop when the deduped set stops growing across 2-3 calls or you have the few you need (the runtime caps each read at 5). For results older than one scroll session, use deep_paginate instead.
load_more_repliesauthLoad more replies on a thread by scrolling and expanding any Show-more-replies / Show-probable-spam sections. Dedup replies by permalink; for best replies read engagement_summary and stop early rather than expanding the whole thread.
loginTEST-ONLY: sign in to X via the Rindler hosted handoff form (dev vault flow).
open_communityauthOpen a Community feed. Pass community_url as a FULL https://x.com/i/communities/<id> URL.
open_listauthOpen a curated List feed. Pass list_url as a FULL https://x.com/i/lists/<id> URL.
open_postauthOpen a single post to read its full thread (focal post + replies). Pass tweet_url as a FULL https://x.com/<handle>/status/<id> URL. The permalink in data.listings is a relative path that ends in /analytics; build tweet_url by prepending https://x.com and removing the trailing /analytics. Only use ids that came from data.listings; never fabricate a status id.
open_profileauthOpen an account profile to read its recent posts. Pass profile_url as a FULL https://x.com/<handle> URL (the data.listings profile_url is a relative /<handle> path; prepend https://x.com).
open_quotesauthOpen the quote-posts of a post. Pass tweet_url as the FULL clean https://x.com/<handle>/status/<id> URL (no /analytics suffix). Lands on a list of posts quoting it.
open_repostsauthOpen the accounts that reposted a post. Pass tweet_url as the FULL clean post URL (no /analytics suffix). Returns accounts (people) in data.listings ({name, profile_url, summary}). Note: X has no public likers page (/likes of a post redirects back to the post), so there is no open_likers.
open_trendauthOpen a trend by searching its topic. Pass topic = the trend name (or the most specific term in a trend blob). Lands on Top results for that topic.
reveal_sensitiveauthReveal a sensitive-content or blurred-media gate on the current post by clicking its View affordance, then re-read.
searchauthSearch X for posts about a topic. Navigates to the Latest (chronological) results. data.listings is an array of posts: each has permalink (a /<handle>/status/<id>/analytics path; to open it, prepend https://x.com and remove the trailing /analytics), profile_url (/<handle> author), timestamp, full_text (the complete post text), and engagement_summary (raw counts). To MAXIMIZE coverage of a topic sweep BOTH tabs: this Latest tab (f=live) plus the Top tab (set_search_tab tab=top), and union by permalink. Spaces in query MUST be %20-encoded (never +). Hashtags are #tag, exact phrases use double quotes, and the full advanced operator grammar (from:, since:, until:, min_faves:, filter:media, etc.) can be folded into query directly (see apply_advanced_query and list_available_filters).
set_explore_tabauthSwitch the Explore category. tab is one of: for_you, trending, news, sports, entertainment.
set_profile_tabauthSwitch a profile to a specific tab. handle is the bare username (no @). tab is one of: with_replies, highlights, articles (these return posts in data.listings); following, followers, verified_followers (these return ACCOUNTS in data.listings, on the profile_people screen). Bare profile (no tab) is Posts. CAVEATS: media is an image GRID (no post text, reads fall back to raw ARIA); likes is usually PRIVATE and 302-redirects back to the profile. Prefer with_replies/highlights for a users posts.
set_search_tabauthRe-run the current query under a different result tab. tab is one of: top (ranked), live (Latest/chronological), user (People accounts), media (combined media), image (Photos), video (Videos). Switching to user lands on the People results (accounts, not posts). Top and Latest are NOT supersets of each other: Latest is chronological and dedups likely-spam; Top applies opaque ranking. Sweep both for coverage.

Screens and structured records

  • community_timeline returns structured fields, _comment, container records
  • explore_trends returns structured fields, _comment, container records
  • list_timeline returns structured fields, _comment, container records
  • post_reposts returns structured fields, _comment, container records
  • post_thread returns structured fields, _comment, container records
  • profile returns structured fields, _comment, container records
  • profile_people returns structured fields, _comment, container records
  • search_people returns structured fields, _comment, container records
  • search_results returns structured fields, _comment, container records