← All changelog
platformApril 26, 2026· Engineering

X / Twitter reads are live

Second platform online. POST /v1/social/read now supports x/handle and x/search/query. Same response shape as Reddit. Now in the playground too.

X / Twitter is the second platform online for SocialRouter reads. As of today, POST /v1/social/read with platform: "x" works against the same normalized response shape as Reddit. The playground now has Reddit and X as a tab toggle — no signup, 10 requests per minute.

What you can do

Two source patterns are supported:

  • User timelinessource: "x/openai" returns the most recent posts from @openai. Retweets and replies excluded by default. Up to 100 posts per request with an API key (10 in the playground).
  • Recent searchsource: "x/search/AI agents" runs a recent-search query. Supports the standard X search operators (from:, has:media, etc.) up to 512 characters. Sort by recency (default) or relevancy.

The response shape

The same items[] shape we use for Reddit. Engagement metrics map across:

{
  "id": "1234567890",
  "platform": "x",
  "author": "@openai",
  "text": "...",
  "media_url": "https://pbs.twimg.com/...",
  "media_type": "image",
  "engagement": {
    "likes": 4823,
    "comments": 312,        // X replies
    "shares": 891,          // retweets + quotes
    "impressions": 2400000, // X-specific
    "bookmarks": 67,        // X-specific
    "total": 6026
  },
  "published_at": "2026-04-26T...",
  "url": "https://x.com/openai/status/1234567890"
}

Reddit-specific fields (upvotes, awards) and X-specific fields (impressions, bookmarks) coexist on the engagement object. Code that only reads engagement.total works across both platforms unchanged. Code that wants platform-native metrics gets them when present.

How it works under the hood

We use the X API v2 with App-Only Bearer authentication. For username timelines, we resolve the handle to a user ID via /2/users/by/username/{name}, then fetch from /2/users/{id}/tweets. For search, we hit /2/tweets/search/recent directly. Media expansion is requested up-front so we don't need a second round trip.

The provider lives at lib/providers/x.ts. It's a sibling to the Reddit provider — same interface (fetchX(opts) → ProviderResult), same error codes, same normalized output. Adding the next platform (Instagram, TikTok) will follow the same shape.

Pricing

$0.001 per X read, same as Reddit. Failed requests aren't charged. We're absorbing the X API Basic tier cost ($100/mo for 10K tweet reads) on our side — your per-request cost stays clean and predictable regardless of which upstream provider it routes to.

Honest limits

A few things to know:

  • Search is "recent" only. X's full-archive search requires Academic or Enterprise tier. We can build that as a separate endpoint when there's demand.
  • Protected accounts return empty. App-Only auth only sees public posts. We'll add user-context OAuth later for protected timelines.
  • Rate limits at our side. The Basic tier has a monthly tweet cap. If we hit it, your requests fall back to a 502 with retry guidance until the cap resets. Per-account rate limiting on our side keeps any single user from burning through the pool.
  • Real-time is best-effort. X's recent-search endpoint typically lags real-time by 30-90 seconds. Streaming endpoints (filtered stream) need a different integration; we'll add when there's demand.

What's next

The next platforms in build order:

  • Reddit writes — submit posts and comments via the official OAuth API. Two weeks out.
  • X writes — basic tweet creation via OAuth 2.0 PKCE. Three weeks.
  • Instagram reads — Basic Display API for public posts. Trickier ToS landscape, scheduled for May.

Try the X endpoint at /playground. Issues to support@socialrouter.ai.