Skip to content
Back to readx.sh

Card snapshot

readx.sh · 2026-07-28 01:46:25 UTC · b53f180f95ba46c922509b3b7ccceb15160dbbce224a5a73152fed32b4f9cf66

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "protocolVersion": "0.3.0",
  "name": "ReadX",
  "description": "Read-only JSON API for X (Twitter) data \u2014 user profiles, timelines, tweets and conversations, edit history, search, Lists, followers/following/mentions, trending topics, Spaces metadata, long-form articles, and broadcasts. No signup or API key: every call is paid per request in USDC via the x402 protocol, so any x402-capable agent can pay and fetch directly.",
  "url": "https://readx.sh/api/a2a/v1",
  "preferredTransport": "HTTP+JSON",
  "additionalInterfaces": [
    {
      "url": "https://readx.sh/api/a2a/v1",
      "transport": "HTTP+JSON"
    }
  ],
  "provider": {
    "organization": "ReadX",
    "url": "https://readx.sh"
  },
  "version": "1.0.0",
  "documentationUrl": "https://readx.sh/skill.md",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "supportsAuthenticatedExtendedCard": false,
  "skills": [
    {
      "id": "profile-lookup",
      "name": "User Profile Lookup",
      "description": "Look up an X user's profile: bio, follower/following counts, verification status, pinned tweet, and join date.",
      "tags": [
        "profile",
        "user",
        "bio"
      ],
      "examples": [
        "Get @jack's profile and follower count",
        "What's the bio and verification status for @openai?"
      ],
      "x-inputSchema": {
        "username": "string, required \u2014 X handle without @"
      }
    },
    {
      "id": "user-info",
      "name": "User Profile Info",
      "description": "Look up an X user's profile info: id, name, bio, location, follower/following counts, and verification status.",
      "tags": [
        "profile",
        "user",
        "bio"
      ],
      "examples": [
        "What's @jack's follower count and bio?",
        "Get profile info for @openai"
      ],
      "x-inputSchema": {
        "username": "string, required \u2014 X handle without @"
      }
    },
    {
      "id": "user-relations",
      "name": "Followers, Following & Mentions",
      "description": "Export a user's followers, following, web-view followers/following, verified-followers, mentions, media, or affiliates.",
      "tags": [
        "followers",
        "following",
        "social-graph",
        "mentions",
        "media"
      ],
      "examples": [
        "List the first page of accounts @jack follows",
        "Get @openai's verified followers",
        "Get tweets that mention @jack",
        "Get @jack's media tweets"
      ],
      "x-inputSchema": {
        "username": "string, required",
        "kind": "string, optional \u2014 one of followers | followers_web | following | following_web | verified_followers | mentions | media | affiliates (default: followers)",
        "cursor": "string, optional \u2014 page cursor from a prior response's next_cursor"
      }
    },
    {
      "id": "timeline",
      "name": "User Timeline",
      "description": "Fetch a user's tweets, replies, or media-only timeline, paginated.",
      "tags": [
        "timeline",
        "tweets"
      ],
      "examples": [
        "Get the latest tweets from @jack",
        "Show @jack's replies-only timeline"
      ],
      "x-inputSchema": {
        "username": "string, required",
        "variant": "string, optional \u2014 one of tweets | with_replies | with_media (default: tweets)",
        "cursor": "string, optional \u2014 page cursor from a prior response's pagination.bottom"
      }
    },
    {
      "id": "tweet-lookup",
      "name": "Tweet & Conversation Lookup",
      "description": "Read a single tweet, its full conversation (replies), its edit history, or who retweeted it.",
      "tags": [
        "tweet",
        "conversation",
        "replies"
      ],
      "examples": [
        "Read tweet 20 on its own",
        "Read tweet 20 from @jack with its conversation",
        "Get the edit history for @jack's tweet 20"
      ],
      "x-inputSchema": {
        "id": "string, required \u2014 numeric tweet id",
        "view": "string, optional \u2014 one of single | conversation | history | replies | retweeters (default: single)",
        "username": "string, required when view is conversation or history",
        "cursor": "string, optional \u2014 page cursor, for view=replies or view=retweeters"
      }
    },
    {
      "id": "search",
      "name": "Tweet & User Search",
      "description": "Search tweets or users by keyword.",
      "tags": [
        "search"
      ],
      "examples": [
        "Search tweets for 'typescript'",
        "Search for users matching 'openai'"
      ],
      "x-inputSchema": {
        "q": "string, required \u2014 search query",
        "kind": "string, optional \u2014 tweets | users (default: auto-detect from query)",
        "product": "string, optional \u2014 tweet search product filter",
        "cursor": "string, optional"
      }
    },
    {
      "id": "hashtag",
      "name": "Hashtag Resolution",
      "description": "Resolve a hashtag to its tweet search results.",
      "tags": [
        "hashtag",
        "search"
      ],
      "examples": [
        "Look up tweets under #typescript"
      ],
      "x-inputSchema": {
        "tag": "string, required \u2014 hashtag, with or without the leading #"
      }
    },
    {
      "id": "lists",
      "name": "X List Members",
      "description": "Read the members of an X List by its numeric id.",
      "tags": [
        "lists"
      ],
      "examples": [
        "Get members of list 123"
      ],
      "x-inputSchema": {
        "id": "string, required \u2014 numeric list id",
        "cursor": "string, optional \u2014 page cursor from a prior response's next_cursor"
      }
    },
    {
      "id": "trends",
      "name": "Trending Topics",
      "description": "Get trending topics for a location \u2014 worldwide by default, or filter by country name/ISO code or WOEID.",
      "tags": [
        "trends",
        "trending"
      ],
      "examples": [
        "What's trending worldwide right now?",
        "What's trending in the US?"
      ],
      "x-inputSchema": {
        "country": "string, optional \u2014 location name or ISO code, e.g. US, india, tokyo (default: worldwide)",
        "woeid": "string, optional \u2014 numeric Yahoo WOEID; overrides country when both are given",
        "count": "string, optional \u2014 cap the number of trends returned (up to 50)"
      }
    },
    {
      "id": "articles",
      "name": "X Articles",
      "description": "Read a long-form X article by its wrapper tweet id (public), or by entity id with an auth token (owner-only).",
      "tags": [
        "articles",
        "long-form"
      ],
      "examples": [
        "Read the X article at tweet id 42"
      ],
      "x-inputSchema": {
        "id": "string, required \u2014 wrapper tweet id, or entity rest_id when authToken is set",
        "authToken": "string, optional \u2014 owner auth token for entity-id lookups"
      }
    },
    {
      "id": "id-resolution",
      "name": "Handle / User ID Resolution",
      "description": "Resolve an @handle to its numeric user id, or a numeric user id back to a username.",
      "tags": [
        "utility",
        "resolver"
      ],
      "examples": [
        "What's the numeric user id for @jack?"
      ],
      "x-inputSchema": {
        "username": "string, optional \u2014 resolves to a user id",
        "userId": "string, optional \u2014 resolves to a username (provide exactly one of username/userId)"
      }
    },
    {
      "id": "spaces",
      "name": "Space Info",
      "description": "Fetch metadata for an X Space by id \u2014 title, host, state, listener counts, and whether audio is downloadable.",
      "tags": [
        "spaces",
        "broadcast"
      ],
      "examples": [
        "Get Space 1vOxwrneqBqJB"
      ],
      "x-inputSchema": {
        "id": "string, required \u2014 Space id (the segment after /i/spaces/ in a Space URL)"
      }
    },
    {
      "id": "broadcasts",
      "name": "Broadcasts",
      "description": "Read metadata for an X broadcast (live audio/video) by id.",
      "tags": [
        "broadcast"
      ],
      "examples": [
        "Get broadcast abc123"
      ],
      "x-inputSchema": {
        "id": "string, required \u2014 broadcast id"
      }
    }
  ],
  "x-invocation": "POST a Message to {url}/message:send with { \"message\": { \"role\": \"user\", \"parts\": [ { \"kind\": \"data\", \"data\": { \"skill\": \"<skill id>\", \"input\": { ... } } } ] } }. Returns a Task with status.state \"completed\" (result in artifacts[0].parts[0].data) or \"failed\" (reason in status.message). Fetch a past Task with GET {url}/tasks/{id} (retained 10 minutes). Every message:send call is paid per request \u2014 see x-payment-info.",
  "x-payment-info": {
    "price": {
      "mode": "fixed",
      "currency": "USD",
      "amount": "0.010000"
    },
    "protocols": [
      {
        "x402": {
          "networks": [
            "base",
            "solana"
          ]
        }
      }
    ],
    "specUrl": "https://readx.sh/openapi.json"
  }
}