Is the X (Twitter) API free to read posts?
No. The free tier of the X API is write-only. Reading posts, profiles, or search needs a paid tier, billed monthly, with a cap on how many posts you may pull. Go over the cap and you wait for next month or buy the next tier.
For public data you can skip the plan. Openhandle reads public X posts, profiles, followers, and search for $0.0025 per request, billed after use, with 100 free requests to start.
Checked September 2026 · request and response run against the API · no affiliate links
curl "https://api.openhandle.dev/v1/twitter/profiles/@copperfield_lab_x_test/posts" \
-H "Authorization: Bearer $OPENHANDLE_API_KEY"import { OpenHandle } from '@openhandle/sdk';
const openhandle = new OpenHandle({ apiKey: process.env.OPENHANDLE_API_KEY! });
const page = await openhandle.twitter.profile('copperfield_lab_x_test').posts.list();
for (const post of page.data) console.log(post.createdAt, post.text);{
"platform": "twitter",
"resource": "post",
"capturedAt": "2026-09-18T10:52:48Z",
"source": "live",
"data": [
{
"id": "940100000000000001",
"text": "A deterministic text post from a fictional lab. #synthetic",
"createdAt": "2026-08-09T15:30:00Z",
"metrics": { "likes": 42, "reposts": 3, "comments": 3, "quotes": 0, "views": null }
}
],
"meta": { "cursors": { "next": "b3BhcXVlLWN1cnNvcg" } }
}Trimmed to one post and the fields this question needs. The example is a Test account, so you can run it on a free Test key.
How the X API bills
- —Free. Post only. No read endpoints. Meant for bots that write.
- —Paid tiers. A monthly fee with a fixed monthly post cap. The tiers jump by an order of magnitude in price. Unused cap is lost at month end.
- —Approval. A developer account, an app, and terms that restrict what you may store and show.
Check the X developer pricing page for current tiers. They change often. We do not quote their numbers here so this page never goes stale.
How Openhandle bills
- —Per request. $0.0025 per live request, lower at volume. A 24-hour cache hit costs less. A 30-day cache hit is free.
- —After use. No plan to pick. No cap to plan around. Set a spend limit per key and per month if you want a hard stop.
- —Failed requests are free. You pay only when the API returns an answer. Provider errors and our errors are never billed.
What you get for it
Public profiles, posts, replies, media, followers, following, lists, and search. Every X answer uses the same envelope as Instagram, TikTok, and Reddit. Views are the number X shows, or null when X hides it. Protected accounts return PROFILE_PRIVATE.
When this does not work
These answers are definitive. Store them, do not retry them.
| Situation | Status | Code |
|---|---|---|
| The account is protected | 403 | PROFILE_PRIVATE |
| The account is suspended, deleted, or never existed | 404 | PROFILE_NOT_FOUND |
| The identifier is malformed | 400 | INVALID_IDENTIFIER |
{
"error": {
"code": "PROFILE_PRIVATE",
"message": "This profile is private.",
"requestId": "req_01j8…",
"retryable": false
}
}Openhandle is read-only. It never posts, likes, reposts, or follows. If you need to write to X, the official API is the only path.
Read next
More X (Twitter) questions
Send your agent ahead.
Paste the prompt into your agent and it sets everything up. Or come yourself, it takes five minutes.