Skip to content

LIST MEMBERS

Twitter List API: Fetch Any List Members at $0.04/1K

What is the Twitter (X) List API?

The Twitter List API is a REST endpoint that returns every member of any public X list by numeric list ID, as paginated JSON at $0.0008 per call, about $0.04 per 1,000 members on a full 20-record page. TwitterAPIs delivers cursor pagination, structured per-member profile data, no X developer account, and one flat ceiling of 600 requests per minute and 20 concurrent per key. One endpoint. One Bearer key. One flat price.

What is the Twitter List Members API?

GET /twitter/list/members accepts a numeric listId and returns an array of member account objects, each with screen name, display name, follower count, bio, and profile metadata. The response also includes next_cursor and has_more so you loop page by page until the list is exhausted. A typical page returns 100 to 200 members. At $0.0008 per call, enumerating 1,000 members costs roughly $0.004 to $0.008. There is no subscription, no minimum spend, and no X developer account required. You start with $0.50 in free credits at signup.

$0.0008

Per call

$0.04

Per 1,000 members

$0.50

Free signup credit

99

Endpoints on one key

Endpoint reference

The list members surface is a single endpoint. Pass the numeric list ID, read the users array, and loop with the cursor until the list is fully enumerated.

MethodPathKey paramReturnsDocs
GET/twitter/list/memberslistId (numeric)Array of member profiles, next_cursor, has_moreView docs

This endpoint sits alongside 98 other endpoints on the same Bearer key at the same base URL. Switch to the followers endpoint or the search endpoint with zero re-authentication.

Fetch list members with cursor pagination

Three steps to fetch every member of a list, each call billed at $0.0008:

  1. Call GET /twitter/list/members with the numeric listId in the query string. Omit cursor on this first call.
  2. Read the users array from the JSON response; each entry is a full member profile.
  3. If has_more is true, pass the returned next_cursor as the cursor parameter on the next call. Repeat until has_more is false.

Get the first page of list members

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.twitterapis.com/twitter/list/members?listId=1234567890"

Example response (single page)

JSON
{
  "users": [
    {
      "id": "12345678",
      "username": "johndoe",
      "name": "John Doe",
      "followers_count": 42300,
      "following_count": 880,
      "description": "Product engineer. Building in public.",
      "verified": false,
      "profile_image_url": "https://pbs.twimg.com/profile_images/..."
    }
    // ... up to ~200 members per page
  ],
  "count": 200,
  "next_cursor": "eyJpZCI6IjEyMzQ1NiJ9",
  "has_more": true
}

Every member object carries the profile fields you need to enrich, score, or sync downstream. No HTML parsing, no proxy rotation, no session management. Read the full list members endpoint docs.

What people build with list member data

Curated X lists are one of the highest-signal data sources on the platform. The accounts on a list were added deliberately by someone with a point of view. Enumerating those members gives you a pre-filtered set that a keyword search would miss.

Use caseWhat you do with the dataList type
Competitor watchlist monitoringPull members from a curated competitor list every morning. Detect new accounts added by a competitor or industry insider and route them into your CRM.Any public list by list ID
Influencer discoveryIndustry publications curate 'top voices' lists. Enumerate the members and score them by follower count, engagement rate, or niche to build a shortlist fast.Media / publication lists
Signal list enrichmentYour ICP maintains a list of prospects or partners. Enumerate members, pull their profiles, and sync to your outreach tool without manual copy-paste.Private or public lists you own
Community analysisTwitter community managers maintain curated lists of active voices. Enumerate them to map a community's key nodes before launching outreach.Community or topic lists
News desk trackingJournalists and editors often maintain source lists. Pull members to surface the accounts a publication trusts for beats you cover.Journalist / newsroom lists

How to find a list ID on X

Every public X list has a numeric ID embedded in its URL. Open the list on x.com or twitter.com. The URL pattern is:

URL pattern
https://twitter.com/i/lists/1234567890
# or
https://x.com/i/lists/1234567890
#                        ^^^^^^^^^^
#                        This is your listId

Copy the numeric string after /lists/ and pass it as the listId parameter. Lists accessed from a profile page also expose the same numeric ID in the URL once you click through to the list view.

TwitterAPIs vs the official X API vs scraping

OptionPriceAuthLimitsFull list export
TwitterAPIs$0.04 / 1,000 membersBearer token, 30 s signup600 req/min per keyCursor pagination to full list
Official X API list membersGated, enterprise pricingX developer account, app approvalHard window caps on lower tiersToken-based, tier-capped
Browser scraping the list tab$0 plus proxy and compute costsSession cookies or tokensIP bans, anti-bot challengesBreaks on every X layout change

Pricing, plain and flat

$0.04

per 1,000 list members enumerated

$0.50

free credits at signup, no card required

99

endpoints on one Bearer key, same flat rate

Each call to /twitter/list/members is $0.0008. At roughly 100 to 200 members per page, enumerating 500 members costs under $0.004. No subscription, no seat fee, no minimum. See the full breakdown on the Twitter API pricing page or compare options at the pricing overview.

The whole List family, and what each endpoint returns

Member enumeration is the endpoint people arrive for, and it is one of seven. The others answer the questions that usually come next: what are these accounts posting, who else is watching this list, and can I build the list from my own pipeline instead of curating it by hand. All seven authenticate with the same Bearer key and page with the same cursor mechanic.

EndpointReturnsCost per call
GET /twitter/list/membersThe member accounts of a public list, each a full profile object, cursor paged$0.0008
GET /twitter/list/tweetsPosts from the list's members as a collection, for aggregation rather than reading$0.0008
GET /twitter/list/timelineThe list as X composes it for a reader, ranked and blended$0.0008
GET /twitter/list/followersThe accounts subscribed to a list, which is the audience rather than the membership$0.0008
POST /twitter/list/createA new list you own, public or private, with a name and description$0.0016
POST /twitter/list/add_memberAdds one account to a list you own$0.0008
POST /twitter/list/remove_memberRemoves one account from a list you own$0.0008

Only list/create sits above the standard rate, at $0.0016, and it is the one call in the family you make once rather than in a loop. Everything else, including adding and removing members, bills at the same $0.0008 as a read.

list/tweets against list/timeline: which one you want

Two endpoints read posts from a list and the names do not make the difference obvious, so it is worth stating plainly. Both take a list id, both page by cursor, and both bill $0.0008 a call.

list/timeline is the list as a reader sees it in the X client: the ranked, blended feed the platform composes from the members. Reach for it when you want the experience, for example mirroring a curated feed into a dashboard, because it reflects what a human following that list would actually encounter.

list/tweets is the posts from the list's members as a collection. Reach for it when you are building a dataset rather than a feed, because a ranked view is a poor foundation for counting: ranking is not stable between calls, so the same crawl run twice returns overlapping but different pages, and a job that treats it as a complete set will both miss posts and duplicate others.

The rule of thumb: if a person will read the output, take the timeline. If a query will aggregate the output, take the tweets. If you need genuine completeness for a specific account, enumerate the members and pull each member's own timeline, which is more calls and the only way to be sure nothing was ranked out.

Building and maintaining a list from your own pipeline

Reading somebody else's curation is half the value. The other half is treating a List as a queryable, machine-maintained object: build it from a search, keep it in step with your CRM, and let it act as a durable filter that both your pipeline and a human in the X client can read. Creating a list and changing its membership are write calls, so they need an authenticated X session rather than only an API key.

import requests

BASE = "https://api.twitterapis.com/twitter"
H = {"Authorization": "Bearer YOUR_API_KEY"}

# $0.0016. Done once, not in a loop.
new_list = requests.post(f"{BASE}/list/create", headers=H, json={
    "name": "Q3 prospects",
    "description": "Built from search, synced nightly",
    "private": True,
}).json()

list_id = new_list["list"]["id"]

# $0.0008 each. Membership changes bill at the read rate.
for user_id in shortlist_from_your_crm():
    requests.post(f"{BASE}/list/add_member", headers=H,
                  json={"list_id": list_id, "user_id": user_id})

Error responses, and which ones to retry

Errors arrive as a consistent envelope, a machine-readable error code beside a human message, so a client branches on the code and logs the message. In a paging loop the distinction that matters is which of these a retry can fix.

StatusCodeTypical cause on a list jobRetry?
400bad_requestA list id copied with the surrounding URL, or a cursor with trailing whitespaceNo. Fix the request
401unauthorizedKey missing, malformed or revokedNo. Check the header
402insufficient_creditsBalance exhausted mid-crawl, the failure mode of an unattended nightly jobNo. Top up, then resume
404not_foundThe list was deleted or made private since you last read itNo. Record it as unresolvable so tomorrow's run skips it
429rate_limitedOver 600 requests a minute on this keyYes, with exponential backoff and jitter
5xxserver_errorA failure on our sideYes. Failed calls are not billed, so a retry costs only time

One list-specific detail worth building for: hold the cursor you were on when a job dies. Resuming from the last successful cursor turns a failed crawl of a 50,000-member list into a few extra calls rather than a restart, and cursors stay usable for the length of a normal job.

What list data cannot tell you

Lists are one of the more honest signals on X, because somebody chose to put an account on one. That makes it worth being precise about what the signal does not carry, before a dashboard implies more than the data supports.

  • Private lists are private. A list marked private is readable only by its owner's authenticated session. No API returns another account's private list, and any vendor implying otherwise is describing something you should not buy.
  • Membership carries no endorsement. People list competitors, sources they distrust and accounts they are monitoring. Inclusion means attention, not agreement, which matters most when the list is titled something flattering.
  • There is no membership history. X exposes the current members, not when each was added or by whom. If you want to know that a competitor added six accounts last Tuesday, the only way is to have snapshotted the list before and after and diffed them yourself.
  • A member who left X still needs handling. Suspended and deleted accounts can persist in a list's membership and come back flagged as unavailable. Store that state rather than dropping the row, or every run re-discovers the same ghost.
  • Follower counts on the list page are a snapshot. Every count in a member profile is the value at fetch time. Store the fetch timestamp beside it, or a later comparison is measuring two different moments and calling the difference growth.

The third point is the one that turns a read endpoint into a monitoring product. Snapshot the membership on a schedule, diff consecutive runs, and the additions and removals are the story: who a newsroom started trusting, who a competitor started watching, which analyst quietly dropped off a top-voices list.

Lists against the other ways to define an audience

A list is one of four ways to answer the question of which accounts a job should watch, and it is worth knowing what the alternatives buy you before defaulting to it.

  • A keyword search defines an audience by what people say. It is the widest net and the noisiest, it finds accounts nobody has curated, and it needs an engagement floor or a language filter to stay useful. Best when you do not yet know who matters.
  • A follower graph defines an audience by who follows whom. It is exhaustive and expensive at scale, it captures genuine attention rather than a curator's judgement, and a single popular account's followers are mostly not practitioners. Best for reach analysis.
  • A community defines an audience by declared membership in a topic space. Narrower and higher-signal than a follower graph, with its own endpoints on the same key, and bounded by whether a community exists for your subject at all.
  • A list defines an audience by somebody's deliberate curation. It is the highest signal per row of the four, because a human made a judgement about every member, and the smallest and most easily stale, because that human may have stopped maintaining it two years ago.

In practice the strongest pipelines use two together rather than picking one. A list supplies the seed set, and a search or follower crawl expands outward from it, scoring candidates by how many of the seed accounts already interact with them. That gets you both the precision of curation and the coverage of a wide net, and every endpoint involved sits behind the same key at the same flat rate.

The staleness question is the one to answer first, because it is cheap. Enumerate the list once, pull each member's most recent post, and count how many have posted in the last month. A list where a third of the membership is dormant is a historical artefact rather than a live audience, and it is far better to learn that for a few cents than to build a monitor on top of it.

Five things that go wrong with list ids

Almost every 400 and 404 on this endpoint traces back to the identifier rather than the request. These are the five we see, in roughly the order they cost people time.

  • Passing the URL instead of the id. The parameter wants the bare numeric string, not x.com/i/lists/1234567890 and not a fragment of it. This is the most common 400 by a wide margin, and it usually arrives from a spreadsheet column somebody pasted links into.
  • Using the list name as if it were an identifier. A list has a display name and it is neither unique nor stable. Two people can own lists called the same thing, and an owner can rename one at any moment. The numeric id is the only durable handle.
  • Parsing the id as a number. List ids, like every other X identifier, exceed the safe integer range in JavaScript, so Number(id) silently rounds and two different lists can collide on one key. Keep it as a string end to end, and use text or bigint in the database rather than a float column.
  • Assuming an id from last year still resolves. Lists get deleted and made private. A 404 on an id that worked before is usually exactly that, not a bug in your client, so record the outcome against the id rather than retrying it nightly forever.
  • Reusing a cursor across a different list. A cursor is scoped to the enumeration it came from. Feeding one list's cursor into another list's request produces either an error or a confusing empty page, which is a fiddly bug to find because nothing about it looks wrong at the call site.

The general defence is one line of validation at the edge: strip everything but digits from whatever a human handed you, reject an empty result loudly, and keep the value a string from that point on. It removes four of the five.

Finding lists worth crawling in the first place

A list id is easy to read out of a URL. The harder question, and the one that decides whether any of this is useful, is which lists exist that are worth reading at all. There is no global list search on X, so this is a discovery problem rather than a lookup, and the routes that work are indirect.

  • Start from an account you already trust. Every profile has a Lists tab showing the public lists that account owns and subscribes to. An analyst or journalist covering your space has usually already done the curation you were about to pay someone for.
  • Use listed_count as a shortlist signal. Every profile object carries the number of public lists that account appears on. An account with a high listed count relative to its follower count is one other people consider a reference in a niche, and its own lists are usually worth opening.
  • Search for the lists people announce. Curators post about their lists. A search for url:x.com/i/lists alongside a topic term surfaces posts that link directly to a list, which is the closest thing to a list search that exists.
  • Read the followers of a list, not just its members. The subscribers to a niche list are a self-selected audience for that niche, and that is frequently the more valuable half. It is the same cursor loop against a different endpoint.
  • Walk outward from communities. Community members and moderators are a parallel curation layer with its own endpoints on the same key, and the overlap between an active community and a well-kept list is usually where the real practitioners sit.

The quality test once you have a candidate is quick and worth doing before you build anything on it: how many members, when did the owner last post, and how many of the members have posted this month. A hand-curated list of 40 active accounts beats an abandoned list of 900, and the first crawl tells you which one you have for less than a cent.

What list work costs at real sizes

A flat per-call rate makes this arithmetic rather than a quote. The numbers below are a full membership enumeration at $0.04 per 1,000 members, then the same list re-read daily for a month, then what it costs to also pull each member's recent posts.

List sizeOne membership crawlDaily crawl for a monthPlus one timeline page per member, daily for a month
50 membersUnder a centAbout $0.06About $1.26
500 membersAbout $0.02About $0.60About $12.60
5,000 membersAbout $0.20About $6About $126
50,000 membersAbout $2About $60About $1,260

The last column is where list projects actually spend, and it is the one to design around. Enumerating membership is close to free at any realistic list size; fanning out to a timeline call per member every day is 30 calls per member per month and dominates everything else. Two changes cut it hard: re-enumerate membership weekly rather than daily, because curated lists move slowly, and poll member timelines on a cadence that matches how often those accounts actually post rather than a uniform daily sweep across every member.

Turning a list into a working monitor

Most of the value in list data is not the one-off export. It is that a list is a stable, human-curated set of accounts you can watch over time, which makes it a far better filter than a keyword for anything where who said it matters as much as what was said.

The pattern is three jobs on different cadences. A weekly membership crawl that stores the full member set and diffs it against the previous run, so additions and removals are recorded as events rather than inferred later. A polling job over the members that matter, either their timelines directly or a list/tweets read when you want the whole set in one call. And a delivery step that only fires on something new, because a monitor that re-reports what it said yesterday gets muted within a week.

Two design notes that matter more than they look. Deduplicate on tweet id and not on text, because reposts and near-identical announcements will otherwise fill the feed, and hold a watermark of the newest id you have already delivered per member so a restart does not replay the backlog. And keep the membership diff separate from the content feed: the fact that a competitor added six accounts to a watchlist on Tuesday is often the more interesting signal, and it is invisible if you only ever look at posts.

If the consumer is a model rather than a person, the same endpoints are exposed as MCP tools on the same key and the same per-call rate, so an agent can enumerate a list, read what its members posted and decide what is worth surfacing without anyone writing tool definitions first.

Build further with related endpoints

Once you have a member list, you often want tweets from those accounts or their follower graphs. The Twitter followers API lets you pull follower counts and follower lists for each member on the same key. To monitor what those accounts are saying, use the Twitter search API to query by username or keyword. To wire list data into an AI agent without writing HTTP boilerplate, connect via the MCP server. Need a key first? Get a Twitter API key in 30 seconds, no developer account required.

Twitter List API FAQ

The Twitter List API is a REST endpoint that returns the member accounts of any public X (formerly Twitter) list, given its numeric list ID. TwitterAPIs exposes this as GET /twitter/list/members. Each call returns a page of member profiles as structured JSON with a next_cursor and has_more flag so you can walk the full membership without holding server-side state. Billing is $0.0008 per call (source: twitterapis pricing), which works out to roughly $0.04 per 1,000 members at typical page sizes.

The list/members endpoint returns approximately 100 to 200 member profiles per page, depending on the list size and server-side paging. Each page is one call billed at $0.0008. To get 1,000 members you make roughly 5 to 10 calls, costing $0.004 to $0.008 total. For very large lists, the cursor loop handles it automatically without any changes to your code.

No, and neither can anyone else. A private list is readable only through its owner's own authenticated session, so no third-party API returns another account's private list. If you own the list, you can read and modify it as the authenticated owner. Any vendor claiming to expose other people's private lists is describing something you should not buy.

Yes. POST /twitter/list/create makes a public or private list at $0.0016, and add_member and remove_member each bill $0.0008, the same as a read. The pattern that holds up is reconciliation rather than rebuild: enumerate the current membership, diff it against your target set, and issue only the additions and removals. That keeps the list id stable for anyone already following it. A 500-member list churning 20 accounts a night is 40 write calls a night, so about 1,200 a month, which is roughly $0.96.

On your first call, omit the cursor parameter. The response includes the first page of member profiles, a next_cursor string, and a has_more boolean. Pass next_cursor as the cursor parameter on your next call to fetch the following page. Repeat the loop until has_more is false. This stateless cursor pattern means you can pause, resume, or checkpoint a large export at any page boundary without losing your place.

TwitterAPIs charges $0.0008 per call with no subscription and no minimum. Enumerating a 500-member list costs less than $0.01. The official X API gates list member lookups behind paid developer tiers; on the free and basic tiers, access to list members is restricted or unavailable, and enterprise pricing is required for high-volume access. TwitterAPIs is pay-per-call with no approval process and no waiting period.

Open the list on twitter.com or x.com and look at the URL. It follows the pattern twitter.com/i/lists/<list_id> where list_id is a long numeric string. Copy that number and pass it as the listId parameter in your API call. For lists accessed from a profile page, the URL after clicking the list also exposes the same numeric ID.

No. TwitterAPIs uses its own authentication layer, so you never apply for an X developer account or go through app approval. You sign up at twitterapis.com, copy your Bearer token, and start making calls within 30 seconds. You receive $0.50 in free credits at signup with no card required, which is enough to enumerate several hundred thousand list members before you spend a cent.

list/timeline returns the list the way X composes it for a reader: ranked and blended, which is what a human following that list would actually see. list/tweets returns the posts from the list's members as a collection. Take the timeline when a person will read the output and you want the real experience. Take the tweets when a query will aggregate the output, because a ranked view is not stable between calls, so the same crawl run twice returns overlapping but different pages and a job treating it as a complete set will both miss and duplicate posts. If you need genuine completeness for a specific account, enumerate the members and pull that member's own timeline.

No. X exposes the current membership, not a history of who was added when or by whom. The only way to know that a competitor added six accounts last Tuesday is to have snapshotted the list before and after and diffed the two yourself. That is one cheap call per crawl, and the diff is usually the more interesting signal than the membership itself, so it is worth building from day one rather than retrofitting once someone asks.

The list/members endpoint works on any public list by its numeric ID. Private lists owned by other accounts are not accessible without authentication on behalf of the list owner. Lists you own or are subscribed to that are public are accessible with your TwitterAPIs Bearer key. Contact support if you have an authenticated-user use case that requires access to private lists.

Enumerate any X list in under a minute

$0.04 per 1,000 members. $0.50 free credits. Cursor pagination, no developer account, 600 req/min per key.