X API Lists: the add limit that is not in the docs
The Lists endpoints in 2026: what a List read costs, why owned_lists is the cheapest and most throttled call, and the member-add ceiling X staff admit but never publish.
On this page · 8 sections
- Quick answer
- Seventeen endpoints, fifteen published limits
- The only read on the X API you can budget in advance
- Owning a List does not make it an Owned Read
- The write limit that is not in the docs
- You can search a List. You cannot stream one.
- Shape limits worth knowing before you design
- When a List is the wrong tool
The short version
- ▸X documents 17 Lists endpoints across six groups and publishes a rate limit for 15 of them. GET /2/lists/:id/followers and GET /2/users/:id/followed_lists have reference pages, prices and no rate-limit row.
- ▸A List is the one read surface on the X API where you can calculate your worst-case daily bill before writing code: membership is capped at 5,000 accounts you picked, and each Post is charged once per UTC day no matter how often you poll.
- ▸Owning a List does not make reading it an Owned Read. owned_lists, followed_lists, list_memberships and pinned_lists get the $0.001 rate; the List timeline, members and followers of your own List do not.
- ▸The documented add-member limit is 300 requests per 15 minutes. X staff confirmed in July 2026 that a downstream platform spam limit lands first, and one developer measured roughly 100 adds per day before a persistent 429.
- ▸At 300 adds per 15 minutes, filling a 5,000-member List takes about 4 hours. At 100 a day it takes about 50. Design the build for the second number.
Quick answer
The X API Lists group is 17 endpoints that let you build, read and curate Lists in code. The reads are cheap and generously rate limited. The writes are the problem: the published ceiling for adding a member is 300 requests per 15 minutes, but X staff have confirmed that a separate platform spam limit lands first, and the developer who asked about it was stopped near 100 adds a day.
Last updated: October 2026
That gap decides the architecture. A 5,000-member List is about four hours of work at the documented rate and closer to fifty days at the observed one.
Seventeen endpoints, fifteen published limits
X groups the Lists endpoints into six sets. The rate-limit reference heads the block "Lists (14 endpoints)" and then prints 15 rows, which is a decent clue about how recently the page was audited.
| Group | Endpoints | Limit |
|---|---|---|
| List lookup | GET /2/lists/:id | 75/15min |
GET /2/users/:id/owned_lists | 15/15min | |
| List Posts | GET /2/lists/:id/tweets | 900/15min |
| List members | GET /2/lists/:id/members | 900/15min |
GET /2/users/:id/list_memberships | 75/15min | |
POST and DELETE on members | 300/15min | |
| Manage Lists | POST /2/lists, PUT and DELETE /2/lists/:id | 300/15min |
| List follows | POST and DELETE /2/users/:id/followed_lists | 50/15min |
| Pinned Lists | GET /2/users/:id/pinned_lists | 15/15min |
POST and DELETE on pinned lists | 50/15min |
Two documented endpoints are missing from that table entirely. GET /2/lists/:id/followers has a reference page and no rate limit. GET /2/users/:id/followed_lists has a reference page, a price in the Owned Reads table, and no rate limit. List follows also has no guide section at all, so the only way to learn the endpoint group exists is to read the index.
Assume an unpublished limit is low rather than absent, and read the x-rate-limit-limit header on your first call to find out what it actually is.
The only read on the X API you can budget in advance
Here is the thing that makes Lists genuinely useful, and it has nothing to do with the endpoints themselves.
X deduplicates billable resources inside a 24-hour UTC window. Request the same Post twice in a day, pay once. Combine that with a List, whose membership is capped at 5,000 accounts that you chose, and your worst-case daily cost stops depending on how often you poll.
Work it through. A 100-account List whose members average 10 Posts a day produces about 1,000 unique Posts in a UTC day. At $0.005 that is $5, whether you poll the timeline once an hour or every two minutes, because the repeat reads are free inside the window. Scale the List to 500 accounts at the same posting rate and you are at $25 a day. The number moves with membership and their posting habits, both of which you can measure before you commit.
Now compare that to the alternative. On X API stream the bill is written by other people's posting rate against a keyword you cannot bound, with no page size to cap it. On X API search you control max_results but a broad query still returns whatever matched. A List is the only read surface where the author set is finite and yours.
Three practical notes on the timeline endpoint:
max_resultsgoes to 100, so one page of a List timeline is roughly $0.50 at the $0.005 rate. List: Read and Posts: Read are both $0.005, so the bucket argument does not change the arithmetic.- 900 requests per 15 minutes is enormous headroom. If you are near it you are polling 100 Lists a minute, which is a different design problem.
- The reads land against the same 3 million Post read monthly cap as everything else on the account. At $0.005 that cap is $15,000, and a dozen busy Lists will not get near it.
Our X API pricing breakdown has the rest of the rate card, and X API rate limits covers how the per-app and per-user ceilings interact.
Owning a List does not make it an Owned Read
X added Owned Reads to the rate card for exactly the use case Lists suit: an app reading its own owner's data at $0.001 per resource instead of $0.005 or $0.010. Four Lists endpoints qualify.
| Endpoint | Rate |
|---|---|
GET /2/users/:id/owned_lists | $0.001 |
GET /2/users/:id/followed_lists | $0.001 |
GET /2/users/:id/list_memberships | $0.001 |
GET /2/users/:id/pinned_lists | $0.001 |
Notice the pattern. Every discounted endpoint is user-scoped: the Lists you own, follow, belong to or pinned. None of them returns the contents of a List.
GET /2/lists/:id/tweets, GET /2/lists/:id/members, GET /2/lists/:id/followers and GET /2/lists/:id are not in the Owned Reads table. Your own List, created by your own app, read with your own token, is full price. The discount covers finding your Lists, not reading them.
There is a second irony in the rate limits. The cheapest Lists call, owned_lists at $0.001, is tied with pinned_lists for the most throttled in the group at 15 requests per 15 minutes, or one a minute. The full-price timeline read gets 900. Pricing and throttling point in opposite directions, so cache your List inventory and spend your request budget on content.
The write limit that is not in the docs
The Lists documentation says POST /2/lists/:id/members allows 300 requests per 15 minutes. Taken at face value, that is 1,200 adds an hour and a full 5,000-member List in about four hours and ten minutes.
In July 2026 a developer posted that the API cut them off around 100 adds a day with a 429, against that documented 300 per 15 minutes. X staff answered the same day, and the answer is the important part: the limit for adding members is indeed 300 requests per 15 minutes on self-serve pay-per-use, "however you may hit downstream platform spam limits before exceeding your API limit." The advice was to throttle off the endpoint on 429 and avoid spammy behaviour.
So there are two ceilings. One is published and belongs to the API. The other is anti-abuse, applies to the account rather than the app, and is not written down anywhere, which is normal for anti-abuse systems and still inconvenient when you are sizing a job.
An earlier thread shows the shape of the failure. In June 2026 a developer reported five consecutive days of bare 429s on the same endpoint, every single add attempt, with no documented window and no reset in sight. Nothing in the response body distinguishes the API limit from the platform limit. Both are a 429; only one clears on a schedule.
What to do with that:
- Treat 100 adds a day as your design number, not 1,200 an hour. A 5,000-member List becomes a 50-day backfill, so build it as a queue with durable state rather than a script you babysit.
- Back off hard on the first 429, with a long cooldown rather than a retry. A tight retry loop against an anti-abuse limit is the behaviour the limit exists to stop.
- Spread adds across the day instead of bursting. The burst is what looks like bulk action, and bulk aggressive actions are called out in X's automation rules.
- Budget the writes at $0.005 each. List: Manage is a flat per-request charge, so filling 5,000 seats costs about $25 in credits regardless of how long it takes.
The honest version: adding thousands of accounts to a List quickly is not something the platform wants to let you do, and that is a deliberate product decision rather than a bug in your client.
You can search a List. You cannot stream one.
The list: operator exists, it is standalone, and it matches Posts from members of a specific List. list:123 on recent search gives you the same corpus as the List timeline with query syntax layered on top, which is the move when you want "Posts from my List that also mention our product."
It is not in the Filtered Stream operator set. The stream has listed_count:, which matches Posts from users who appear in a given number of Lists, and that is a different thing entirely. There is no way to open a streaming connection scoped to a List.
That is fine. It just means the design is a poller, and the dedup maths above is why polling a List is not the expensive choice it sounds like.
Shape limits worth knowing before you design
Per X's own Lists help page, an account can hold 1,000 Lists and each List can hold 5,000 accounts. That ceiling multiplies out to five million memberships, which no self-serve rate limit will ever let you reach.
The API adds its own constraints, visible only in the request schema: a List name is 1 to 25 characters, a description caps at 100, and the name cannot start with a number. Twenty-five characters is tighter than most people expect and it is a 400, not a truncation.
Every write in the group is user-context. POST /2/lists, the PUT, the DELETE, the member writes, the follow and pin writes all show a per-user rate limit and no per-app column, and creating a List needs an OAuth 2.0 user token with users.read, tweet.read, list.read and list.write. Reads can run on an app-only Bearer token, with the obvious exception that private Lists need the owner's token.
When a List is the wrong tool
Lists are a monitoring and curation primitive. They are excellent at "watch these 200 accounts" and bad at everything adjacent to growth.
If the aim is to find accounts worth replying to, a List is the index and not the work. Building the List is the slow part, as the add limits above make clear, and the reading is only useful if something acts on it. If the aim is audience signal, note that GET /2/lists/:id/followers returns user objects in the $0.010 Following/Followers bucket, which makes "who follows my List" the single most expensive question you can ask about a List you own.
And if the aim is consistent posting and replying from your own account, the API route adds a constraint that has nothing to do with Lists: since February 2026 self-serve tiers can only publish a reply when the original author mentioned or quoted you, which X API reply covers in full. A curated List of accounts you cannot reply to programmatically is an expensive reading list.
X-Autopilot takes the other route, driving your own browser on your own machine, so a curated feed is just a List you read the way a person does and replies are not gated by API tier. The trade-offs are different and we are direct about them: browser automation sits in a grey area under X's automation rules, while the API route is the sanctioned one. Neither removes risk from your account.
For the hand-driven version of all of this, our guide to using Lists on X covers building, sorting and pinning them in the app, which is still the fastest way to get the first version of a List right before you spend credits automating it.
Frequently asked
Answers indexed by Google + AI assistants.
What are the X API Lists endpoints?+
Seventeen endpoints in six groups: List lookup (GET /2/lists/:id, GET /2/users/:id/owned_lists), List Posts (GET /2/lists/:id/tweets), List members (GET /2/lists/:id/members, GET /2/users/:id/list_memberships, POST and DELETE on members), Manage Lists (POST /2/lists, PUT and DELETE /2/lists/:id), List follows (POST and DELETE /2/users/:id/followed_lists, GET /2/users/:id/followed_lists), and pinned Lists (GET, POST and DELETE on /2/users/:id/pinned_lists). GET /2/lists/:id/followers sits outside those groups with a reference page but no guide.
How much does it cost to read a List on the X API?+
List: Read is $0.005 per resource and Posts: Read is the same, so a 100-Post page of a List timeline costs about $0.50 either way. The four 'Lists you have a relationship with' endpoints - owned_lists, followed_lists, list_memberships and pinned_lists - qualify for Owned Read pricing at $0.001 per resource when the ID is the authenticated app owner. List followers return user objects and sit in the $0.010 Following/Followers bucket.
How many members can an X List have?+
5,000 accounts per List and 1,000 Lists per account, per X's own Lists help page. The API adds its own shape limits: a List name is 1 to 25 characters and cannot start with a number, and the description caps at 100 characters.
Why do I get a 429 adding members to a List?+
Because the published API limit is not the binding one. X staff answered this directly in July 2026: the endpoint allows 300 requests per 15 minutes on self-serve pay-per-use, but 'you may hit downstream platform spam limits before exceeding your API limit.' The developer who asked was capped near 100 adds a day. Back off on any 429 rather than retrying, and spread adds over days.
Can I stream a List instead of polling it?+
No. The list: operator exists on recent and full-archive search, where it matches Posts from members of a given List, but it is absent from the Filtered Stream operator set. A List timeline is a polling surface. GET /2/lists/:id/tweets allows 900 requests per 15 minutes, which is far more headroom than most builds need.
Do Lists writes work with an app-only Bearer token?+
No. Every POST, PUT and DELETE in the Lists group is rate limited per user with no per-app column, and creating a List needs an OAuth 2.0 user token carrying users.read, tweet.read, list.read and list.write. Reads can be app-only, but anything that changes a List acts as a person.
- X developer docs - 'X API Rate Limits': the Lists block, headed '14 endpoints' while listing 15 rows, with 900/15min on the List timeline and members lookups, 75/15min on GET /2/lists/:id, 15/15min on owned_lists and pinned_lists, 300/15min on the manage and member-write endpoints, 50/15min on List follows, and no row for GET /2/lists/:id/followers or GET /2/users/:id/followed_lists (accessed 20 October 2026)
- X developer docs - 'Pricing': List: Read at $0.005 per resource, List: Create at $0.010 per request, List: Manage at $0.005 per request, the Owned Reads table listing owned_lists, followed_lists, list_memberships and pinned_lists at $0.001, the 24-hour UTC deduplication window, and the 3 million Post read monthly cap (accessed 20 October 2026)
- X developer docs - 'Create List': the OpenAPI request schema setting the List name to 1-25 characters and the description to a 100-character maximum, and the OAuth 2.0 scopes users.read, tweet.read, list.read and list.write (accessed 20 October 2026)
- X developer docs - 'List Posts' and its integration guide: GET /2/lists/:id/tweets, max_results up to 100, the 900/15min app and user limits, and the author_id expansion (accessed 20 October 2026)
- X developer docs - 'Search operators': the list: operator listed as standalone, matching Posts from members of a specific List, with no equivalent entry in the Filtered Stream operator reference (accessed 20 October 2026)
- X Developers forum - 'Rate Limits for List Adds': a developer capped near 100 adds per day against a documented 300 per 15 minutes, and X staff confirming on 2 July 2026 that self-serve pay-per-use allows 300 requests per 15 minutes but 'you may hit downstream platform spam limits before exceeding your API limit'
- X Developers forum - 'Permanent 429 on list add': POST /2/lists/:id/members returning a bare 429 for five consecutive days on App ID 33005723 at api-version 2.165, with no documented reset (posted 6 June 2026)
- X Help Center - 'How to use X Lists': the 1,000 Lists per account and 5,000 accounts per List caps, and the rule that a List name cannot exceed 25 characters or begin with a numerical character (read via search indexing, 20 October 2026, as help.x.com blocks direct fetches)
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 →