7-day offer$199$9
X-Autopilot

X API followers: the request that can cost $10

Follower reads bill per user at $0.010, pages go to 1,000, and two owned routes exist in the spec with no doc page, no SDK method and no rate limit.

X-Autopilot Team··9 min read
On this page · 9 sections

The short version

  • ▸Following/Followers: Read bills at $0.010 per user returned, and max_results goes to 1,000. One full page of somebody else's followers is a $10 request. Pulling a 100,000-follower account costs about $1,000 in credits.
  • ▸Your own followers are 100 times cheaper. GET /2/users/{id}/followers and /following are on the Owned Reads table at $0.001 per resource when the id is the app owner's, so the same 100,000 rows cost about $100.
  • ▸GET /2/users/me/followers and GET /2/users/me/following exist in spec 2.174 with written descriptions, and they appear in no doc page, no documentation index entry, no rate-limit table and no SDK method. They are spec-only routes.
  • ▸Follow and unfollow are capped at 50 per 15 minutes per user, which is 4,800 a day. X's own account limit is 400 follows a day, so the API ceiling is 12 times more permissive than the platform will actually allow, and follow churn is a policy violation either way.
  • ▸Block and unblock are Enterprise plan only. Mute and unmute are not. The live spec declares all four with ordinary OAuth 2.0 scopes and no enterprise marker, so the restriction exists in prose and nowhere your code can read it.

Quick answer

Reading follows on X API v2 is priced per user returned, not per request. Following/Followers: Read is $0.010 a head and max_results goes to 1,000, so one page of a stranger's followers is a $10 call and a 100,000-follower account is about $1,000 in credits. Your own list is the exception: it qualifies for Owned Read pricing at $0.001, a hundredfold difference for the identical route. Writing follows is cheap and rate-limited to 50 per 15 minutes, which is twelve times looser than the 400-a-day ceiling X enforces on the account itself.

Last updated: November 2026

Everything here is checked against the live API description at api.x.com/2/openapi.json, version 2.174, X's follows, blocks, pricing and rate-limit pages, the published Python SDK wheel, and X's own follow-limit help page. All read on 9 November 2026.

Four documented routes, and two that are not

X documents four follow endpoints:

MethodRouteWhat it does
GET/2/users/{id}/followerswho follows that user
GET/2/users/{id}/followingwho that user follows
POST/2/users/{id}/followingfollow somebody
DELETE/2/users/{source_user_id}/following/{target_user_id}unfollow somebody

Note the path asymmetry on the writes. You follow at /2/users/{id}/following with the target in the body, and you unfollow at /2/users/{source_user_id}/following/{target_user_id} with both ids in the path. Same relationship, two different parameter names for the same acting account.

Then there are two more. Spec 2.174 declares GET /2/users/me/followers and GET /2/users/me/following, each with a description written by a human: "Same results as GET /2/users/{id}/followers with your own user ID, without looking it up." They save you a lookup, which at $0.010 a profile is not nothing.

Here is what they do not have: a reference page, an entry in docs.x.com/x-api/llms.txt, a row in the rate-limit tables, a line in the changelog, and a method in the generated Python SDK. The string me/followers appears zero times in the documentation index. A codegen client built from the spec will have them; a developer reading the docs will never learn they exist.

They also do not accept an app-only Bearer token, which makes sense, and they are not listed on the Owned Reads table, which does not.

The cost of a follower list

Following/Followers: Read sits at $0.010 per resource. Resource means user row, so the arithmetic is linear and unforgiving:

What you pullRowsCost
one page, max_results=100100$1.00
one page, max_results=10001,000$10.00
a 10,000-follower account10,000$100.00
a 100,000-follower account100,000$1,000.00

Paging does not change the total. A thousand calls of 100 and a hundred calls of 1,000 both bill $1,000 for a 100,000-row account; the large pages just burn fewer requests out of your rate-limit budget.

What does change the total is whose list it is. Both follower routes are on the Owned Reads table, which drops to $0.001 per resource when the {id} in the path matches the authenticated user and that user owns the developer app. So your own 100,000 followers cost about $100, and somebody else's cost about $1,000. Same endpoint, same payload, 100x apart on a condition that lives in your token rather than your query string. The rest of the card has the same shape, mapped in X API pricing.

Two things take the edge off. Resources dedupe inside a 24-hour UTC window, so re-reading the same follower twice in a day is free, and X describes that as a soft guarantee rather than a promise. And blocks and mutes read at $0.001 instead of $0.010, because those list routes return less: in the spec, GET /2/users/{id}/blocking and GET /2/users/{id}/muting declare only max_results and pagination_token, with no user.fields parameter at all. The follower routes take the whole 27-value field enum described in X API user lookup. You pay ten times more because you can ask for ten times more.

Which is worth knowing because the blocks page's own example passes user.fields=username,description to the blocking route. That parameter is not declared there.

No way to audit the bill

There is one programmatic usage endpoint, GET /2/usage/tweets, and it reports Post consumption. The published monthly cap is 3 million Post reads per billing cycle. Neither covers user reads. If a background job pages a large follower list on a loop, the only place that spend shows up is the Developer Console balance, after the fact.

Set a spending limit before you build anything that paginates. At the full 300 requests per 15 minutes with 1,000-row pages, the theoretical ceiling on follower reads is 300,000 billable rows a quarter hour. Nothing in the API stops that, and nothing in the API tells you it happened.

Rate limits, and the ceiling that actually applies

MethodRoutePer appPer user
GET/2/users/{id}/followers300/15min300/15min
GET/2/users/{id}/following300/15min300/15min
POST/2/users/{id}/followingnone50/15min
DELETE/2/users/{source}/following/{target}none50/15min
GET/2/users/{id}/blockingnone15/15min
GET/2/users/{id}/mutingnone15/15min

Two of these deserve a second look.

Reads are capped at 300 per 15 minutes per user as well as per app, unlike plain profile lookups, which give a user token 900. Adding a second authorising user does not buy you a bigger pool here. More of those asymmetries are collected in X API rate limits.

The writes are the interesting case. 50 follows per 15 minutes works out to 200 an hour and 4,800 a day. X's own help page puts the account-level limit at 400 follows per day, and calls it "a technical account limit only" before listing the behavioural rules that sit on top. So the API will happily accept your 401st follow call of the day and the account will refuse it. The rate limiter is not the ceiling; the account is. The full set of platform-side numbers is in X daily limits.

What the follow response actually tells you

Request bodies here are tightly specified. FollowUserRequest requires exactly one key, target_user_id, typed as a string matching ^[0-9]{1,19}$, with additionalProperties: false. Pass an integer instead of a string, or add a stray key, and it is a hard 400.

Responses require two booleans:

{
  "data": {
    "following": true,
    "pending_follow": false
  }
}

pending_follow is the one people miss. Follow a protected account and the call succeeds as a follow request: following comes back false and pending_follow comes back true until the person approves it. A client that branches on data.following alone will log that as a failure and retry, which is how you turn one legitimate follow request into a burst of identical ones.

Unfollow is asymmetric here too. UnfollowUserResponseData requires only following, with no pending_follow counterpart, so there is no documented way to cancel a pending request and confirm it through the response shape.

Both sides also return errors as an array of problem objects alongside data, which means a 200 can carry a partial failure. Check the array, not just the status.

Blocks are Enterprise, mutes are not

This is the restriction most likely to break a plan you have already made. X's Blocks page says it plainly: "The block and unblock users endpoints are only available under the Enterprise plan." Reading your block list on pay-per-use is fine. Writing a block is not.

Mute and unmute have no such gate. POST /2/users/{id}/muting and DELETE /2/users/{source_user_id}/muting/{target_user_id} are ordinary 50-per-15-minute write endpoints, and unmute even gets its own discounted Mute: Delete row at $0.005 where a generic Interaction: Delete is $0.010.

One gap is worth flagging: the live OpenAPI description declares all four block operations with normal block.read and block.write OAuth 2.0 scopes, no deprecated flag, and nothing marking them enterprise-only. The restriction exists in one sentence of prose on one hub page. Generate a client from the spec and it will give you a block_user method that cannot work on your plan. The official Python SDK, as it happens, ships no block or unblock method at all, only the DM-specific block_dms and unblock_dms, so the generator and the spec disagree about this too.

Where the rules bite, not the rate limiter

Everything above is about whether a request succeeds. Whether you should send it is a different page.

X's follow limit and ratio page names two behaviours directly. Follow churn is following and then unfollowing large numbers of accounts to inflate your own follower count. Indiscriminate following is following or unfollowing a large number of unrelated accounts in a short period, and X's wording singles out doing it "particularly by automated means." Separately, once you follow 5,000 accounts, further follows are governed by a ratio X calculates from your own numbers and does not publish.

The platform manipulation and spam policy covers artificially inflating account metrics, and the automation rules cover what you may do programmatically. Holding a valid API token does not exempt you from any of it. The endpoint is sanctioned; a follow-unfollow loop running through it is not, and the enforcement happens against the account rather than against the app.

If what you want is to see who left, that is a read problem rather than a write one, and who unfollowed me on X covers doing it without paying by the row. If you want to clean up a bloated following list, how to unfollow everyone on X walks the limits and the tools.

Should you build on these endpoints

For reading, yes, with a budget. Follower analysis, audience overlap, a dashboard over your own list: the Owned Read rate makes your own data cheap, and the 300-per-15-minute cap is generous enough for a nightly sync. Store ids rather than handles, cache aggressively to use the 24-hour dedupe window, and set a spending limit before the first deploy.

For writing, be honest about what you are building. The API gives you 4,800 follow calls a day against an account that permits 400, and the rules that govern the difference are written about behaviour rather than about interfaces.

If the actual goal is to grow by posting and replying well rather than by follow volume, the API is an expensive way in. X-Autopilot works the other way: it drives your own logged-in session in your own browser on your own Mac, so your session cookie never leaves the machine and there is no shared cloud IP pool or delegate account in the path. That is a lower detection surface than a cloud scheduler, not a safe one, and automating engagement through a browser rather than the API is a gray area rather than a sanctioned route. The API is the sanctioned one. Pick it when sanctioned access is what you need, and price the pagination before you write the loop.

Frequently asked

Answers indexed by Google + AI assistants.

How do I get a user's followers with the X API?+

GET https://api.x.com/2/users/{id}/followers with an optional max_results between 1 and 1,000 and a pagination_token for the next page. The follow-the-cursor key in the response meta is called next_token, not pagination_token. Add user.fields to get anything beyond id, name and username. An app-only Bearer token works on this route; the /2/users/me variants do not accept one.

How much does it cost to download a follower list from the X API?+

Following/Followers: Read is $0.010 per user returned. A 1,000-row page is $10, and a 100,000-follower account is roughly $1,000 in credits. If the account is your own and your own app owns the token, the same route qualifies for Owned Read pricing at $0.001 per resource, which brings that 100,000 rows down to about $100. Resources dedupe inside a 24-hour UTC window, which X calls a soft guarantee.

Can I follow and unfollow people with the X API?+

Yes. POST /2/users/{id}/following with a JSON body of {"target_user_id": "..."} follows, and DELETE /2/users/{source_user_id}/following/{target_user_id} unfollows. Both need a user token with the follows.write scope and both are limited to 50 requests per 15 minutes per user. Doing it in bulk is a separate question from whether the endpoint works, because X's rules on follow churn and indiscriminate following apply regardless of which interface you used.

What is pending_follow in the X API follow response?+

A required boolean in the follow response alongside following. If the target account is protected, the follow becomes a request and pending_follow comes back true until the person approves it. So following: false with pending_follow: true is a success, not a failure. The unfollow response has no pending_follow field at all, only following.

Why can't I block a user with the X API?+

Because POST /2/users/{id}/blocking and DELETE /2/users/{source_user_id}/blocking/{target_user_id} are Enterprise plan only, as stated on X's Blocks page. Reading your block list with GET /2/users/{id}/blocking is available on pay-per-use at $0.001 per resource. Mute and unmute have no such restriction. The live OpenAPI description declares the block writes with normal block.write scopes and gives no hint that a plan gate exists.

Do follower lists return full profiles?+

They can. The followers and following routes accept the full 27-value user.fields enum plus expansions, so each row can carry public_metrics, created_at, description and the rest. The block and mute list routes do not: they declare only max_results and pagination_token, with no user.fields parameter, which is why they cost a tenth as much per resource.

Sources
Related searches
x api followersx api get followers/2/users/id/followersx api follow user endpointtwitter api followers list 2026x api unfollowx api follower list costx api block user enterprisex api pricingx api rate limitsx daily limitsx follow limittwitter api v2 followsx api user lookupfollow churn
DY
Deepak YadavBuilding X-Autopilot

Product designer and indie hacker. Runs the agent on his own X account every day and writes up what the data shows, including when it's inconvenient.

Follow on X →
Try X-Autopilot.
7-day offer: $199 $9 once. No subscription, no monthly bill. Real Chrome on your Mac.
See pricing▶
Free PDF · the X Growth Playbook

The exact playbook we use to grow on X

The bio that converts, the daily reply loop, the posting cadence, and the tool stack, in one no-fluff PDF. Drop your email and it's yours.

No spam. Unsubscribe anytime.

Free tools

Try it yourself.

All free X tools →
Keep reading

Related posts.