git clone https://github.com/ComeOnOliver/skillshub
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/openclaw/openclaw/xurl" ~/.claude/skills/comeonoliver-skillshub-xurl && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/openclaw/openclaw/xurl" ~/.openclaw/skills/comeonoliver-skillshub-xurl && rm -rf "$T"
skills/openclaw/openclaw/xurl/SKILL.mdxurl — Agent Skill Reference
xurl is a CLI tool for the X API. It supports both shortcut commands (human/agent‑friendly one‑liners) and raw curl‑style access to any v2 endpoint. All commands return JSON to stdout.
Installation
Homebrew (macOS)
brew install --cask xdevplatform/tap/xurl
npm
npm install -g @xdevplatform/xurl
Shell script
curl -fsSL https://raw.githubusercontent.com/xdevplatform/xurl/main/install.sh | bash
Installs to
~/.local/bin. If it's not in your PATH, the script will tell you what to add.
Go
go install github.com/xdevplatform/xurl@latest
Prerequisites
This skill requires the
xurl CLI utility: https://github.com/xdevplatform/xurl.
Before using any command you must be authenticated. Run
xurl auth status to check.
Secret Safety (Mandatory)
- Never read, print, parse, summarize, upload, or send
(or copies of it) to the LLM context.~/.xurl - Never ask the user to paste credentials/tokens into chat.
- The user must fill
with required secrets manually on their own machine.~/.xurl - Do not recommend or execute auth commands with inline secrets in agent/LLM sessions.
- Warn that using CLI secret options in agent sessions can leak credentials (prompt/context, logs, shell history).
- Never use
/--verbose
in agent/LLM sessions; it can expose sensitive headers/tokens in output.-v - Sensitive flags that must never be used in agent commands:
,--bearer-token
,--consumer-key
,--consumer-secret
,--access-token
,--token-secret
,--client-id
.--client-secret - To verify whether at least one app with credentials is already registered, run:
.xurl auth status
Register an app (recommended)
App credential registration must be done manually by the user outside the agent/LLM session. After credentials are registered, authenticate with:
xurl auth oauth2
For multiple pre-configured apps, switch between them:
xurl auth default prod-app # set default app xurl auth default prod-app alice # set default app + user xurl --app dev-app /2/users/me # one-off override
Other auth methods
Examples with inline secret flags are intentionally omitted. If OAuth1 or app-only auth is needed, the user must run those commands manually outside agent/LLM context.
Tokens are persisted to
~/.xurl in YAML format. Each app has its own isolated tokens. Do not read this file through the agent/LLM. Once authenticated, every command below will auto‑attach the right Authorization header.
Quick Reference
| Action | Command |
|---|---|
| Post | |
| Reply | |
| Quote | |
| Delete a post | |
| Read a post | |
| Search posts | |
| Who am I | |
| Look up a user | |
| Home timeline | |
| Mentions | |
| Like | |
| Unlike | |
| Repost | |
| Undo repost | |
| Bookmark | |
| Remove bookmark | |
| List bookmarks | |
| List likes | |
| Follow | |
| Unfollow | |
| List following | |
| List followers | |
| Block | |
| Unblock | |
| Mute | |
| Unmute | |
| Send DM | |
| List DMs | |
| Upload media | |
| Media status | |
| App Management | |
| Register app | Manual, outside agent (do not pass secrets via agent) |
| List apps | |
| Update app creds | Manual, outside agent (do not pass secrets via agent) |
| Remove app | |
| Set default (interactive) | |
| Set default (command) | |
| Use app per-request | |
| Auth status | |
Post IDs vs URLs: Anywhere
appears above you can also paste a full post URL (e.g.POST_ID) — xurl extracts the ID automatically.https://x.com/user/status/1234567890
Usernames: Leading
is optional.@and@elonmuskboth work.elonmusk
Command Details
Posting
# Simple post xurl post "Hello world!" # Post with media (upload first, then attach) xurl media upload photo.jpg # → note the media_id from response xurl post "Check this out" --media-id MEDIA_ID # Multiple media xurl post "Thread pics" --media-id 111 --media-id 222 # Reply to a post (by ID or URL) xurl reply 1234567890 "Great point!" xurl reply https://x.com/user/status/1234567890 "Agreed!" # Reply with media xurl reply 1234567890 "Look at this" --media-id MEDIA_ID # Quote a post xurl quote 1234567890 "Adding my thoughts" # Delete your own post xurl delete 1234567890
Reading
# Read a single post (returns author, text, metrics, entities) xurl read 1234567890 xurl read https://x.com/user/status/1234567890 # Search recent posts (default 10 results) xurl search "golang" xurl search "from:elonmusk" -n 20 xurl search "#buildinpublic lang:en" -n 15
User Info
# Your own profile xurl whoami # Look up any user xurl user elonmusk xurl user @XDevelopers
Timelines & Mentions
# Home timeline (reverse chronological) xurl timeline xurl timeline -n 25 # Your mentions xurl mentions xurl mentions -n 20
Engagement
# Like / unlike xurl like 1234567890 xurl unlike 1234567890 # Repost / undo xurl repost 1234567890 xurl unrepost 1234567890 # Bookmark / remove xurl bookmark 1234567890 xurl unbookmark 1234567890 # List your bookmarks / likes xurl bookmarks -n 20 xurl likes -n 20
Social Graph
# Follow / unfollow xurl follow @XDevelopers xurl unfollow @XDevelopers # List who you follow / your followers xurl following -n 50 xurl followers -n 50 # List another user's following/followers xurl following --of elonmusk -n 20 xurl followers --of elonmusk -n 20 # Block / unblock xurl block @spammer xurl unblock @spammer # Mute / unmute xurl mute @annoying xurl unmute @annoying
Direct Messages
# Send a DM xurl dm @someuser "Hey, saw your post!" # List recent DM events xurl dms xurl dms -n 25
Media Upload
# Upload a file (auto‑detects type for images/videos) xurl media upload photo.jpg xurl media upload video.mp4 # Specify type and category explicitly xurl media upload --media-type image/jpeg --category tweet_image photo.jpg # Check processing status (videos need server‑side processing) xurl media status MEDIA_ID xurl media status --wait MEDIA_ID # poll until done # Full workflow: upload then post xurl media upload meme.png # response includes media id xurl post "lol" --media-id MEDIA_ID
Global Flags
These flags work on every command:
| Flag | Short | Description |
|---|---|---|
| Use a specific registered app for this request (overrides default) | |
| Force auth type: , , or | |
| | Which OAuth2 account to use (if you have multiple) |
| | Forbidden in agent/LLM sessions (can leak auth headers/tokens) |
| | Add trace header |
Raw API Access
The shortcut commands cover the most common operations. For anything else, use xurl's raw curl‑style mode — it works with any X API v2 endpoint:
# GET request (default) xurl /2/users/me # POST with JSON body xurl -X POST /2/tweets -d '{"text":"Hello world!"}' # PUT, PATCH, DELETE xurl -X DELETE /2/tweets/1234567890 # Custom headers xurl -H "Content-Type: application/json" /2/some/endpoint # Force streaming mode xurl -s /2/tweets/search/stream # Full URLs also work xurl https://api.x.com/2/users/me
Streaming
Streaming endpoints are auto‑detected. Known streaming endpoints include:
/2/tweets/search/stream/2/tweets/sample/stream/2/tweets/sample10/stream
You can force streaming on any endpoint with
-s:
xurl -s /2/some/endpoint
Output Format
All commands return JSON to stdout, pretty‑printed with syntax highlighting. The output structure matches the X API v2 response format. A typical response looks like:
{ "data": { "id": "1234567890", "text": "Hello world!" } }
Errors are also returned as JSON:
{ "errors": [ { "message": "Not authorized", "code": 403 } ] }
Common Workflows
Post with an image
# 1. Upload the image xurl media upload photo.jpg # 2. Copy the media_id from the response, then post xurl post "Check out this photo!" --media-id MEDIA_ID
Reply to a conversation
# 1. Read the post to understand context xurl read https://x.com/user/status/1234567890 # 2. Reply xurl reply 1234567890 "Here are my thoughts..."
Search and engage
# 1. Search for relevant posts xurl search "topic of interest" -n 10 # 2. Like an interesting one xurl like POST_ID_FROM_RESULTS # 3. Reply to it xurl reply POST_ID_FROM_RESULTS "Great point!"
Check your activity
# See who you are xurl whoami # Check your mentions xurl mentions -n 20 # Check your timeline xurl timeline -n 20
Set up multiple apps
# App credentials must already be configured manually outside agent/LLM context. # Authenticate users on each pre-configured app xurl auth default prod xurl auth oauth2 # authenticates on prod app xurl auth default staging xurl auth oauth2 # authenticates on staging app # Switch between them xurl auth default prod alice # prod app, alice user xurl --app staging /2/users/me # one-off request against staging
Error Handling
- Non‑zero exit code on any error.
- API errors are printed as JSON to stdout (so you can still parse them).
- Auth errors suggest re‑running
or checking your tokens.xurl auth oauth2 - If a command requires your user ID (like, repost, bookmark, follow, etc.), xurl will automatically fetch it via
. If that fails, you'll see an auth error./2/users/me
Notes
- Rate limits: The X API enforces rate limits per endpoint. If you get a 429 error, wait and retry. Write endpoints (post, reply, like, repost) have stricter limits than read endpoints.
- Scopes: OAuth 2.0 tokens are requested with broad scopes. If you get a 403 on a specific action, your token may lack the required scope — re‑run
to get a fresh token.xurl auth oauth2 - Token refresh: OAuth 2.0 tokens auto‑refresh when expired. No manual intervention needed.
- Multiple apps: Each app has its own isolated credentials and tokens. Configure credentials manually outside agent/LLM context, then switch with
orxurl auth default
.--app - Multiple accounts: You can authenticate multiple OAuth 2.0 accounts per app and switch between them with
/--username
or set a default with-u
.xurl auth default APP USER - Default user: When no
flag is given, xurl uses the default user for the active app (set via-u
). If no default user is set, it uses the first available token.xurl auth default - Token storage:
is YAML. Each app stores its own credentials and tokens. Never read or send this file to LLM context.~/.xurl