L logiover
social-media · Jun 8, 2026 · 6 min read

X (Twitter) API Alternative: Tweets Without the Paid Tier 2026

An X (Twitter) API alternative for pulling tweets, profiles, and post detail without the paid developer tier, via the guest-token GraphQL surface.

If you have priced out the official X API recently, you already know the problem. The free tier is write-only in practice — a few hundred posts a month and almost no read access. The Basic tier sits in the low hundreds of dollars per month and still caps you to a tight monthly tweet-pull budget with aggressive per-endpoint rate limits. Real read volume pushes you into Pro and Enterprise pricing that starts in the thousands. For most developers and analysts who just need to read public tweets at a sane scale, the paid developer tier is the wrong tool. This guide covers a working X (Twitter) API alternative that pulls tweets without the paid tier, what it can and cannot reach, and how to keep it stable.

Why the official API gap exists

X monetized read access deliberately. After the 2023 API restructure, the cheap tier became a write/posting tier, and reading tweets at any volume moved behind paid plans. The pricing is built around monthly post-pull caps rather than simple rate limits, so even a modest research project burns the allowance quickly. The result is a gap: the data is public — anyone can open the page in a browser and read it — but the documented programmatic path to that same public data is now expensive and quota-bound. That gap is what an unauthenticated scraping approach fills: you read the same JSON the web client reads, without paying for an API key to do it.

The guest-token GraphQL surface

The X web client does not hit a friendly REST API. It talks to an internal GraphQL surface, and before it can do that it requests a guest token — an unauthenticated bearer credential that the public site itself uses for logged-out browsing.

The flow looks like this:

  1. Load the web app and grab the static public bearer token embedded in the client bundle.
  2. Call the guest activation endpoint with that bearer to mint a short-lived guest_token.
  3. Send GraphQL requests with both the bearer header and the x-guest-token header.

Each GraphQL operation is keyed by a queryId that changes when X ships a new client build, plus features and fieldToggles flags that must match what the current client sends. Miss a feature flag and the endpoint returns a 400 about an unset feature. The robust pattern is to read the current queryId and feature set out of the live client bundle at runtime rather than hardcoding them, so a client deploy does not silently break your pipeline.

What data is actually reachable

Being honest about coverage matters more than a long feature list. Without logging in, these surfaces work reliably:

  • Tweets / posts by ID — full text, language, created time, reply/retweet/quote/like/bookmark counts, view count, attached media URLs, quoted-tweet object, and the conversation root.
  • User profiles — display name, handle, bio, follower and following counts, listed count, verified/affiliation badges, join date, location, pinned tweet, profile and banner image URLs.
  • A user’s timeline — recent original tweets and retweets, paginated.
  • Post detail / conversation — the replies tree under a given tweet, paginated.

These surfaces are login-gated and will not work with a guest token:

  • Search (the SearchTimeline operation) requires an authenticated session.
  • Followers and following lists require auth.
  • Likes lists and other private-leaning endpoints require auth.

A credible X (Twitter) API alternative is the one that tells you this up front. If a tool promises unauthenticated keyword search across all of X, be skeptical — that endpoint rejects guest tokens.

Pagination and cursors

GraphQL timelines paginate with an opaque cursor. The response is a list of timeline “instructions” containing entries; two of those entries are cursor entries (Top and Bottom). To page forward you take the Bottom cursor value and pass it back as the cursor variable on the next call. When the returned cursor stops changing, or the entries list comes back empty, you have reached the end of the reachable window.

Two realities: logged-out timelines expose a shallower history than a logged-in session (recent activity, not the full archive), and the same tweet can appear in multiple instruction blocks — dedupe by tweet ID.

Rate limits and how to live with them

Guest tokens are rate-limited per token and per IP. Practical guidance:

  • Treat a guest token as short-lived — re-mint every few minutes or on any 401/403, rather than clinging to one until it dies mid-run.
  • Keep pacing modest; a steady cadence with small jitter survives far longer than bursts.
  • Spread volume across a pool of IPs for large jobs. Datacenter IPs are fine for light reads; heavier pulls do better on residential.
  • Back off on 429 and re-mint the token rather than hammering the same one.

A clean output schema

Normalize whatever the GraphQL response throws at you into a flat, warehouse-friendly row. Here is a realistic tweet shape:

{
  "id": "1799999999999999999",
  "type": "tweet",
  "url": "https://x.com/example/status/1799999999999999999",
  "author_handle": "example",
  "author_name": "Example Account",
  "author_id": "44196397",
  "text": "Shipping the new build today.",
  "lang": "en",
  "reply_count": 31,
  "retweet_count": 88,
  "quote_count": 12,
  "like_count": 640,
  "bookmark_count": 47,
  "view_count": 91230,
  "is_retweet": false,
  "is_reply": false,
  "quoted_tweet_id": null,
  "conversation_id": "1799999999999999999",
  "media": [
    { "type": "photo", "url": "https://pbs.twimg.com/media/abc.jpg" }
  ],
  "created_at": "2026-06-07T14:02:00Z",
  "scraped_at": "2026-06-08T09:15:00Z"
}

Keep conversation_id and quoted_tweet_id so you can reconstruct threads and quote-chains in SQL later.

Try the X Tweet Scraper on Apify — pulls tweets, profiles, and post detail through the guest-token surface. No API key, no paid developer tier.

Use cases

What teams build on this once the data is flowing:

  • Brand and competitor monitoring — track engagement on a known set of accounts and posts over time.
  • Creator and KOL analysis — follower trajectory, posting cadence, and which posts actually move.
  • Thread and conversation mining — pull a viral post plus its reply tree for sentiment work.
  • Dataset building — collect public posts from named accounts for analysis or model training.

Every reliable use case starts from a known account, tweet ID, or profile, not open keyword search. Build around handles and IDs you already have and you stay inside what the guest surface can do.

Build it yourself vs. a managed actor

Rolling your own is possible — the hard parts are well understood. The catch is maintenance. The queryId rotates on client deploys, the features flag set drifts, the guest-token lifetime is unforgiving, and the GraphQL response is deeply nested with optional branches for retweets, quotes, and tombstoned tweets. The first version works for a week, then a client ship changes a feature flag and your parser throws. A managed actor absorbs that churn — runtime queryId extraction, token re-minting, and response normalization — so you are not babysitting a scraper every time X ships.

Common pitfalls

  • Hardcoding queryId or features — these change; read them from the live bundle.
  • Reusing a dead guest token — re-mint on any auth error instead of retrying.
  • Expecting search to work logged-out — it does not; design around IDs and handles.
  • Counts as strings — several engagement counts arrive as strings; cast them.
  • Tombstoned tweets — deleted or restricted tweets come back as placeholder objects; detect and skip them rather than letting them poison the row.

Wrapping up

The official X API turned reading public tweets into a paid, quota-bound product. The guest-token GraphQL surface is the honest X (Twitter) API alternative: it reads the same public tweets, profiles, and post detail the web client reads, with no paid developer tier — as long as you respect that search and follower lists stay behind login. Build around known handles and IDs, treat guest tokens as disposable, and let a managed layer handle the client churn.

Open the X Tweet Scraper on Apify — tweets, profiles, and conversations by ID or handle, paid per result. Skip the developer dashboard entirely.

Related guides