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 timelines —
source: "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 search —
source: "x/search/AI agents"runs a recent-search query. Supports the standard X search operators (from:,has:media, etc.) up to 512 characters. Sort byrecency(default) orrelevancy.
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.