Browser

Read and post on X (Twitter) via the official X API v2. With an app bearer token: look up a profile, read an account's recent posts (optionally without retweets or replies), read a thread its author wrote in the last 7 days, search posts from the last 7 days with X's search operators, and look up posts by URL or ID (up to 100 at once). With a one-time OAuth 2.0 sign-in in the browser: read the signed-in account's home timeline (newest first), list its bookmarks (filtered by text, or just their links), list liked posts, and publish a post, which only shows a preview until run again with --yes. The bearer token and the OAuth client come from env vars or config.json; the sign-in is stored owner-only (by default in ~/.openclaw/x), renewed automatically, and revoked by logout. Every command can also print JSON (--json). X bills API use per request. Use when the user asks to look someone up on X, read recent posts or a thread, search X, see their home timeline, bookmarks or likes, or post on

What it does

Interact with X via API v2. Pure Python stdlib — no dependencies.

The skill document

X (Twitter) API

Interact with X via API v2. Pure Python stdlib — no dependencies.

Features

Public data (bearer token):

  • User profiles (bio, followers, tweets count)
  • User timelines (with filters: exclude retweets/replies)
  • Conversation threads (self-threads by same author)
  • Search recent tweets (last 7 days)
  • Single/batch tweet lookup
  • Tweet metrics (likes, retweets, replies)

User context (OAuth 2.0):

  • Bookmarks
  • Liked tweets
  • Post tweets

Setup

See SETUP.md for credentials setup (bearer token + optional OAuth 2.0).

Usage

User Info

# Get user profile (bio, followers, verification status)
python3 {baseDir}/scripts/x.py user steipete
python3 {baseDir}/scripts/x.py user elonmusk

Timeline

# Get user's recent tweets
python3 {baseDir}/scripts/x.py timeline steipete --max 50

# Exclude retweets
python3 {baseDir}/scripts/x.py timeline steipete --max 100 --exclude retweets

# Exclude both retweets and replies
python3 {baseDir}/scripts/x.py timeline steipete --max 100 --exclude retweets,replies

Threads

# Get conversation thread (self-thread by same author)
python3 {baseDir}/scripts/x.py thread https://x.com/steipete/status/123456
python3 {baseDir}/scripts/x.py thread 123456789

# Note: Only searches last 7 days (recent search). For older threads, need full-archive search.
# Search recent tweets (last 7 days)
python3 {baseDir}/scripts/x.py search "OpenClaw" --max 20
python3 {baseDir}/scripts/x.py search "from:steipete OpenAI" --max 50

# Advanced search operators work (from:, to:, -filter:retweets, etc.)

Tweet Lookup

# Single tweet
python3 {baseDir}/scripts/x.py tweet 2025504475100614695
python3 {baseDir}/scripts/x.py tweet https://x.com/steipete/status/2025504475100614695

# Multiple tweets (batch)
python3 {baseDir}/scripts/x.py tweets 123456 789012 345678

Bookmarks (OAuth Required)

# One-time auth setup
python3 {baseDir}/scripts/x.py auth

# Get your bookmarks
python3 {baseDir}/scripts/x.py bookmarks --max 100

Likes (OAuth Required)

# Get user's liked tweets (requires OAuth)
python3 {baseDir}/scripts/x.py likes steipete --max 50

Posting (OAuth Required)

# Post a tweet
python3 {baseDir}/scripts/x.py post "Hello from OpenClaw! 🦞"

# Note: 280 character limit enforced by API

Output Format

All commands output clean, readable text:

👤 Peter Steinberger 🦞 (@steipete)
   ID: 25401953
   Bio: Polyagentmorous ClawFather...
   👥 382,854 followers · 2,241 following · 135,096 tweets
   https://x.com/steipete

🐦 @VictorKnox99 I think my stance on using AI here is pretty clear.
   📅 2026-02-22 09:34:33
   ❤️  5  🔁 0  💬 0
   https://x.com/steipete/status/2025504475100614695

Common Use Cases

Research user activity:

# Get someone's recent thoughts on a topic
python3 {baseDir}/scripts/x.py timeline steipete --max 100 --exclude retweets | grep -i openai

Monitor discussions:

# Search for OpenClaw mentions
python3 {baseDir}/scripts/x.py search "OpenClaw" --max 100

Extract threads:

# Get full thread for analysis
python3 {baseDir}/scripts/x.py thread  > thread.txt

Archive bookmarks:

# Export bookmarks to file
python3 {baseDir}/scripts/x.py bookmarks --max 100 > bookmarks.txt

Rate Limits

X API enforces rate limits per 15-minute window:

EndpointApp-Only (Bearer)User Context (OAuth)
User lookup900900
User timeline~1,500~900
Search450300
Tweet lookup900900
BookmarksN/A~180
LikesN/A~75

Headers in responses:

  • x-rate-limit-limit — max requests allowed
  • x-rate-limit-remaining — requests left in window
  • x-rate-limit-reset — Unix timestamp when limit resets

Design tips:

  • Cache results locally (deduplication helps but isn't guaranteed)
  • Add delays between requests (avoid hitting limits)
  • Use batch endpoints when possible (tweets for multiple IDs)

Billing & Costs

Pay-per-usage model:

  • Buy credits in Developer Console
  • Charged per unique tweet/user returned
  • 24-hour deduplication — same tweet fetched twice in a UTC day = charged once
  • Set spending limits to control costs
  • Monitor usage: /2/usage/tweets endpoint or console

What's billable:

  • Tweet lookups
  • Search results
  • Timeline requests
  • Bookmarks retrieval

What's NOT billable:

  • Failed requests (4xx/5xx errors)
  • Re-fetching same tweet within 24h UTC window (deduplicated)

See references/pricing.md for detailed pricing info.

Search Operators

X API search supports advanced operators:

OperatorExampleDescription
from:from:steipeteTweets from user
to:to:steipeteReplies to user
--from:steipeteExclude user
-filter:-filter:retweetsExclude retweets
filter:filter:verifiedOnly verified users
lang:lang:enLanguage filter
since:since:2026-02-01After date
until:until:2026-02-20Before date

Example:

# OpenClaw tweets from verified users, excluding retweets
python3 {baseDir}/scripts/x.py search "OpenClaw filter:verified -filter:retweets" --max 50

Limitations

Recent search only:

  • search and thread commands only cover last 7 days
  • Full-archive search requires Pro tier ($5,000/mo) or pay-per-usage

Bookmarks/likes require OAuth:

  • Bearer token alone can't access private user data
  • Need OAuth 2.0 user context (one-time setup)

No Watch Later equivalent:

  • X API doesn't expose "Watch Later" or similar lists
  • Use bookmarks as alternative

Rate limits still apply:

  • Pay-per-usage removes monthly caps but rate limits per 15-min window remain
  • Design for retries with exponential backoff

Troubleshooting

403 Forbidden:

  • Check credentials file exists and has valid bearer_token
  • Ensure endpoint doesn't require OAuth (bookmarks, likes, posting need OAuth)

429 Too Many Requests:

  • Hit rate limit — wait until x-rate-limit-reset time
  • Reduce --max values
  • Add delays between requests

No results found:

  • Recent search only covers 7 days — thread/search may miss older content
  • User may have no tweets or privacy settings blocking access

Authentication errors (OAuth):

  • Ensure oauth2.json has correct client_id/client_secret
  • Re-run x.py auth to refresh tokens
  • Check scopes in Developer Portal match required scopes

Notes

  • Pure stdlib — no pip dependencies, uses urllib + json
  • Works offline — caches nothing, always fetches fresh data
  • Thread-safe — stateless CLI, safe for parallel invocations
  • Deduplication — X API deduplicates within 24h UTC day (soft guarantee)
  • Output encoding — UTF-8, handles emoji and international characters

Related skills

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván559 installs18 stars

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai22 installs8 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván855 installs69 stars

More from odrobnik

Browse all skills

Automate George banking (Erste/Sparkasse AT): balances, transactions, and SEPA file upload in JSON.

by odrobnik132 installs1 stars

Text-to-speech, sound effects, music generation, voice management, and quota checks via the ElevenLabs API. Use when generating audio with ElevenLabs or mana...

by Oliver Drobnik211 installs2 stars

Manage multiple OpenAI Codex accounts by capturing current login tokens, switching between saved accounts, and auto-selecting the best one based on quota bud...

by odrobnik141 installs3 stars

Use when integrating with Tesla's official Fleet API to read vehicle/energy device data or issue remote commands (e.g. start HVAC preconditioning, wake vehic...

by odrobnik151 installs1 stars

Fetches health data from the Withings API for multiple family members including weight, body composition (fat, muscle, bone, water), activity, and sleep. Use...

by odrobnik96 installs1 stars

Control and monitor Snapmaker 2.0 3D printers via their HTTP API. Status, job management, progress watching, and event monitoring.

by odrobnik82 installs1 stars