Twitter (X) Creator Subscriptions API: see which creators an account subscribes to
![Dark diagram of the Twitter (X) Creator Subscriptions API. Top row: fans who pay a creator are out of scope; the account you query (numeric userId 11768582, public profile) pays the creators it subscribes to, which the API returns as users[] up to 20 per page with has_next_page and next_cursor. Bottom row: step 1 GET /twitter/user/info?userName=garrytan returns data.id for 18 credits; step 2 GET /twitter/user/subscriptions?userId=<id>&cursor= loops on has_next_page at 15 credits per creator; measured example 58 creators over 3 pages (20 / 20 / 18), 888 credits total, $0.00888.](/blog/twitter-creator-subscriptions-api/hero.png)
This guide is about one narrow question: which creators does a given X account pay to support through Creator Subscriptions, and how do you read that from code. It is not our follower tracking guide (/blog/twitter-follower-tracking-api-guide), which watches who follows an account over time; a subscription is a paid monthly relationship, a follow is free. Here you get the endpoint, the exact response shape we saw, working Python, the real cost per lookup, and a measurement of how often accounts subscribe to anyone at all.
Creator Subscriptions is the X feature that lets a creator charge followers a monthly fee for extra posts and perks; press coverage in April 2023 reported that X renamed its earlier Super Follows product to Subscriptions. Profiles that subscribe to creators show them on a Subscriptions tab. GET /twitter/user/subscriptions returns what that tab shows publicly, as structured JSON you can page, count, diff and enrich.
Everything below was checked against the live endpoint and the documentation in this session. Every count on this page comes from our own 2026 study, described in full in the "How we collected this" section, plus one clearly labeled aggregate from a larger sample our team ran on the same endpoint.
What the Creator Subscriptions endpoint returns, and what it does not
The endpoint answers one direction of the relationship. You give it account A; it returns the creators A subscribes to. It never returns the people who pay A. If you are a creator and want a list of your own paying fans, this is the wrong tool: no endpoint here exposes that list.
Request. GET https://api.twitterapi.io/twitter/user/subscriptions with header X-API-Key. Two query parameters: userId (required, numeric, for example 11768582) and cursor (optional, the next_cursor from the previous page; leave it empty for page one). The documentation is explicit that usernames are not accepted.
Response. Top-level keys users, has_next_page, next_cursor, status and msg. users holds up to 20 creator profiles. has_next_page is false on the last page, and next_cursor is then null or empty. An id that does not resolve comes back as HTTP 200 with status: "error" and msg: "user not found", so always check status, not only the HTTP code.
Scope. The endpoint works for public profiles. It reads with your TwitterAPI.io API key, so no X account, OAuth app or login session is needed on your side.
Does the official X API have a Creator Subscriptions endpoint?
We read the X API v2 documentation index (docs.x.com/x-api/llms.txt) in this session to check. Every page in it with "subscription" in the title belongs to webhooks: Account Activity (Create, Delete, Get, Validate Subscription, Get Subscription Count) and X Activity (Create, Get, Update, Delete X Activity Subscription). For example, Get Subscriptions is GET /2/account_activity/webhooks/{webhook_id}/subscriptions/all/list and "retrieves a list of all active subscriptions for a given webhook". That is a webhook concept, unrelated to paying a creator.
The closest trace is in X's TypeScript SDK reference: a schema named AudiencePolicy with two properties, creatorSubscriptions and xSubscriptions, both typed only as arrays of Any. That reads like a field that marks which audience can see a post, not an endpoint that lists who subscribes to whom, and the docs give no method that returns it for a user. We found no documented official endpoint that lists a user's Creator Subscriptions; if X adds one, the v2 index is where it will appear.
For a price reference, X's pay-per-usage rate card (docs.x.com/x-api/getting-started/pricing) charges $0.010 per resource for User: Read and $0.005 per resource for Posts: Read, with pay-per-usage capped at 3 million post reads a month and Enterprise above that. On TwitterAPI.io each creator profile returned by this endpoint costs 15 credits ($0.00015), and tweets cost $0.15 per 1,000 against X's $5 per 1,000 post reads on the same rate card, about 33x apart.
Step by step: from a username to a full creator list
Step 1, resolve the id. Call /twitter/user/info with userName. The id is at data.id (a string; keep it as a string). An unknown handle returns HTTP 200 with status: "error", msg: "user not found" and data: null, so test status before reading data. This call costs 18 credits. If you only need the id once, the free /tools/twitter-id-finder page does the same conversion in a browser.
Step 2, page the list. Call /twitter/user/subscriptions with that userId and an empty cursor. Append users, and while has_next_page is true, call again with cursor set to the returned next_cursor. In our run, @garrytan needed three pages, sized 20, 20 and 18, so the page size really is 20 and the last page is partial.
Step 3, handle the edges. An empty list with status: success means the account subscribes to nobody; it is billed the 15-credit minimum. HTTP 502 means the upstream is temporarily unavailable; the documentation says it is not charged, so back off and retry. HTTP 400 means a malformed userId or cursor. Before your first payment the API allows 0.2 requests per second, so a script that checks many accounts should pace itself or top up first (20 requests per second once paid).
The code below is a complete, runnable client for both steps, with the cost math built in. The same client is repeated in the code example at the bottom of the page for copying.
import time
import requests
API_KEY = "YOUR_TWITTERAPI_IO_KEY"
BASE = "https://api.twitterapi.io"
HEADERS = {"X-API-Key": API_KEY}
def user_id_for(username: str) -> str | None:
"""Resolve a username to the numeric id the subscriptions endpoint needs."""
r = requests.get(f"{BASE}/twitter/user/info",
params={"userName": username}, headers=HEADERS, timeout=30)
r.raise_for_status()
body = r.json()
if body.get("status") != "success" or not body.get("data"):
print(f"@{username}: {body.get('msg')}") # e.g. "user not found"
return None
return body["data"]["id"]
def creator_subscriptions(user_id: str, max_pages: int = 50) -> list[dict]:
"""Return every creator this account subscribes to (20 per page)."""
creators, cursor = [], ""
for _ in range(max_pages):
r = requests.get(f"{BASE}/twitter/user/subscriptions",
params={"userId": user_id, "cursor": cursor},
headers=HEADERS, timeout=30)
if r.status_code == 502: # upstream busy: not charged, retry later
time.sleep(5)
continue
r.raise_for_status()
body = r.json()
if body.get("status") != "success":
print("error:", body.get("msg"))
break
creators.extend(body.get("users") or [])
if not body.get("has_next_page"):
break
cursor = body.get("next_cursor") or ""
return creators
def lookup_cost_usd(n_creators: int, pages: int) -> float:
# 18 credits for user/info, then 15 credits per creator returned
# (15-credit minimum per request). $1 = 100,000 credits.
sub_credits = max(15 * n_creators, 15 * pages)
return (18 + sub_credits) / 100_000
if __name__ == "__main__":
for handle in ["garrytan", "DavidSacks"]:
uid = user_id_for(handle)
if not uid:
continue
subs = creator_subscriptions(uid)
pages = max(1, -(-len(subs) // 20))
verified = sum(1 for c in subs if c.get("verified"))
big = sum(1 for c in subs if (c.get("followers") or 0) >= 100_000)
print(f"@{handle} (id {uid}) subscribes to {len(subs)} creators "
f"({verified} verified, {big} with 100k+ followers); "
f"lookup cost about ${lookup_cost_usd(len(subs), pages):.5f}")
The response fields, as returned in our calls
Every creator in users arrives as a full profile. Across the 82 creator profiles our study received, each carried the same 17 fields. The documentation describes a longer UserInfo schema (with fields such as isBlueVerified, pinnedTweetIds and profile_bio), but what this endpoint actually returned to us was the compact set below. Code against the fields you see, and treat anything else as optional.
Date format. createdAt on this endpoint is ISO 8601, not the classic Thu Oct 16 12:34:56 +0000 format that tweet author objects use. Parse it with datetime.fromisoformat after trimming the trailing Z, or with dateutil.
What the creators look like. Across all 82 creator profiles we received (68 unique accounts), 22 had 1M+ followers, 42 had 100k to 1M, 17 had 10k to 100k and 1 had fewer than 10k. The verified flag was true on 81 of 82 (98.8%). That fits a feature people use to back established voices, though our sample is small and skewed to tech.
How rare are Creator Subscriptions? Our 2026 measurement
We checked 75 large public accounts (100k+ followers, drawn from the public followings of Y Combinator, a16z and TechCrunch). 3 of them subscribed to at least one creator (4%); the other 72 returned an empty list. Among the 3 that did, the counts were 1, a number between 2 and 5, and 6, a median of 4. No account in the pool needed a second page.
The 3 subscribing accounts all came from a16z's followings list (3 of 8), none from Y Combinator's (14 accounts) or TechCrunch's (53). That clustering is the honest headline: subscriptions concentrate in particular circles, and a handful of accounts decides the percentage. By follower size, 3 of 44 accounts with 100k to 1M followers subscribed (6.8%) and 0 of 31 with 1M+ did.
Our team ran a much larger aggregate sample on the same endpoint in 2026, which is the better guide to the base rate. In a 2026 sample of about 1,900 public accounts, fewer than 1 in 100 subscribed to any creator, and among accounts with 1M+ followers it was about 1 in 75. Treat the rate as under about 1 to 1.5 percent, not as a precise figure: that sample had only nine subscribing accounts, and its large-account group came from the followings of big brand accounts, so it leans toward entertainment, sports and tech in the US.
What this means for your code. Design for empty results. If you sweep a list of accounts, almost every call will return users: [], billed at the 15-credit minimum, and only a few will need pagination. Budget by account count, not by expected creators.

What a lookup costs, one account and at scale
The price rule is simple: 15 credits per creator returned, with a minimum of 15 credits per request ($1 = 100,000 credits). Resolving a handle with /twitter/user/info adds 18 credits. Empty results and "user not found" answers bill the 15-credit minimum; a 502 is not charged.
At scale. Our 75-account sweep (ids already known from the followings lists, so no user/info calls) took 75 requests and 1,245 credits: 72 empty results at the 15-credit minimum (1,080) plus 11 creators returned by the 3 subscribing accounts at 15 each (165). That is $0.01245 in total, or about $0.000166 per account. Because most accounts return nothing, the 15-credit minimum dominates: checking 10,000 accounts by id costs roughly $1.50 in minimums plus 15 credits for each creator found. If you start from handles, add 18 credits per account for the id lookup, or batch ids you already hold.
Re-checking over time. Subscriptions change slowly, so a daily or weekly re-check is plenty. A weekly check of 1,000 accounts that subscribe to nobody costs 1,000 x $0.00015 = $0.15 a week. Plans start at Starter $29 a month if you prefer a subscription over pay-as-you-go credits; see /pricing.

Use cases: research, monitoring and enrichment
Creator research. Which voices do the founders, investors or analysts in your market pay to read? A subscription is a stronger signal than a follow, because it costs money every month. Sweep a list of accounts you already track, then rank creators by how many of them subscribe. Keep the output aggregate: count creators across many accounts rather than publishing any one person's list.
Change monitoring. Store each account's creator ids and compare on a schedule. A new id means a new subscription became visible; a missing id means one ended or was hidden. The function below keeps one JSON snapshot per account and returns the difference. It reuses creator_subscriptions() from the previous section.
Enrichment. Each creator comes back with a handle, so you can fetch their recent posts with /twitter/user/last_tweets (15 credits per tweet returned, 20 per page) and measure what subscribed-to creators actually publish, how often, and with what reach. For follow-side changes, pair this with the follower tracking approach in /blog/twitter-follower-tracking-api-guide.
Agents. If you work in Claude, Cursor or another MCP client, the hosted TwitterAPI.io MCP server (/twitter-mcp-server) exposes the API to the agent with your key as the Bearer token (Authorization: Bearer <key>), so you can ask for an account's id and creator list in plain language and keep the same per-result pricing.
import json
import pathlib
SNAP = pathlib.Path("subs_snapshots")
SNAP.mkdir(exist_ok=True)
def diff_subscriptions(user_id: str) -> dict:
"""Compare today's creator list with the last saved snapshot (ids only)."""
now = {c["id"]: c["userName"] for c in creator_subscriptions(user_id)}
path = SNAP / f"{user_id}.json"
before = json.loads(path.read_text()) if path.exists() else {}
path.write_text(json.dumps(now))
return {
"added": sorted(set(now) - set(before)),
"removed": sorted(set(before) - set(now)),
"total": len(now),
}
def recent_posts(username: str, pages: int = 1) -> list[dict]:
"""Pull a creator's latest posts: 15 credits per tweet returned."""
tweets, cursor = [], ""
for _ in range(pages):
r = requests.get(f"{BASE}/twitter/user/last_tweets",
params={"userName": username, "cursor": cursor},
headers=HEADERS, timeout=30)
r.raise_for_status()
body = r.json()
data = body.get("data") or {}
tweets.extend(data.get("tweets") or [])
if not body.get("has_next_page"):
break
cursor = body.get("next_cursor") or ""
return tweets
for c in creator_subscriptions(user_id_for("garrytan"))[:3]:
posts = recent_posts(c["userName"])
views = sum(t.get("viewCount") or 0 for t in posts)
print(c["userName"], len(posts), "posts,", views, "views on the latest page")
How we collected this
Question. How often do large public X accounts subscribe to any creator, how many creators do they back, how many pages does a lookup need, and what does it cost?
Accounts. A worked example of three public figures, @garrytan, @DavidSacks and @Scobleizer (counts only; we do not publish their lists). A pool of 75 public accounts with 100k+ followers, picked at random from the 136 such accounts on one page each of the public followings lists of @ycombinator, @a16z and @TechCrunch.
Method and window. One snapshot, collected in 2026: /twitter/user/info for the three named ids, /twitter/user/followings once per seed list, then /twitter/user/subscriptions for every account, following next_cursor when has_next_page was true. Every call returned status: success. 86 requests in total, 80 of them to the subscriptions endpoint, costing 2,364 credits for the subscriptions and user/info calls.
Reference sample. The "team sample" rows are aggregates from a separate 2026 run by our team on about 1,900 public accounts (random active accounts under 100k followers, and large accounts from the followings of big brand accounts). We quote only its aggregate shares.
What the sample cannot show. It is small and clustered: all three subscribing accounts in our pool came from one followings list, so the pool percentage is not a population rate. It sees only subscriptions a profile shows publicly, nothing hidden or ended, and nothing about the reverse direction. It says nothing about prices or revenue.
Privacy. Aggregates only. The three named accounts are public figures and appear with counts only; no creator is named and no account's list is published. Raw responses were kept out of the repository; the committed sample contains de-identified rows (follower bucket, creator count, pages).
Pitfalls to avoid, and how to start building
Passing a handle. userId=garrytan is rejected: the endpoint takes the numeric id only. Resolve it first, and cache ids, since they never change even when a handle does.
Treating empty as failure. users: [] with status: success is the common case, not an error. Retrying it only spends another 15-credit minimum.
Checking only the HTTP code. A bad id comes back as HTTP 200 with status: "error" and msg: "user not found". Read status on every response.
Stopping after page one. Twenty creators per page means an account with 58 needs three requests. Loop on has_next_page, and cap the loop so a cursor bug cannot spin forever.
Expecting history. The response is a snapshot of what the profile shows publicly now: no start date, no price tier, no record of ended subscriptions. If you need history, keep your own snapshots as in the diff example.
Over-reading small samples. With a base rate under about 1 to 1.5 percent, a sweep of a few hundred accounts can swing widely depending on which circle you sample, as our own pool showed. Report counts with the sample size next to them.
Rate limits. Before your first payment the limit is 0.2 requests per second, 20 once paid, 50 on Scale and 500 on Business. A sweep of thousands of accounts on an unpaid key will take hours; top up first.
Sign in at /dashboard to get an API key; new accounts that pass the automatic bot check receive up to $1 of free credits (at most 100,000 credits, no card, one per person or network, expiring after 31 days). At 15 credits per creator returned, that covers thousands of lookups on accounts with no subscriptions. Purchased credits never expire.
The full parameter reference for this endpoint is at docs.twitterapi.io/api-reference/endpoint/get_user_subscriptions, and the id lookup is at docs.twitterapi.io/api-reference/endpoint/get_user_by_username. Copy the code example below, replace the key, and run it against any public handle.
import time
import requests
API_KEY = "YOUR_TWITTERAPI_IO_KEY"
BASE = "https://api.twitterapi.io"
HEADERS = {"X-API-Key": API_KEY}
def user_id_for(username: str) -> str | None:
"""Resolve a username to the numeric id the subscriptions endpoint needs."""
r = requests.get(f"{BASE}/twitter/user/info",
params={"userName": username}, headers=HEADERS, timeout=30)
r.raise_for_status()
body = r.json()
if body.get("status") != "success" or not body.get("data"):
print(f"@{username}: {body.get('msg')}") # e.g. "user not found"
return None
return body["data"]["id"]
def creator_subscriptions(user_id: str, max_pages: int = 50) -> list[dict]:
"""Return every creator this account subscribes to (20 per page)."""
creators, cursor = [], ""
for _ in range(max_pages):
r = requests.get(f"{BASE}/twitter/user/subscriptions",
params={"userId": user_id, "cursor": cursor},
headers=HEADERS, timeout=30)
if r.status_code == 502: # upstream busy: not charged, retry later
time.sleep(5)
continue
r.raise_for_status()
body = r.json()
if body.get("status") != "success":
print("error:", body.get("msg"))
break
creators.extend(body.get("users") or [])
if not body.get("has_next_page"):
break
cursor = body.get("next_cursor") or ""
return creators
def lookup_cost_usd(n_creators: int, pages: int) -> float:
# 18 credits for user/info, then 15 credits per creator returned
# (15-credit minimum per request). $1 = 100,000 credits.
sub_credits = max(15 * n_creators, 15 * pages)
return (18 + sub_credits) / 100_000
if __name__ == "__main__":
for handle in ["garrytan", "DavidSacks"]:
uid = user_id_for(handle)
if not uid:
continue
subs = creator_subscriptions(uid)
pages = max(1, -(-len(subs) // 20))
verified = sum(1 for c in subs if c.get("verified"))
big = sum(1 for c in subs if (c.get("followers") or 0) >= 100_000)
print(f"@{handle} (id {uid}) subscribes to {len(subs)} creators "
f"({verified} verified, {big} with 100k+ followers); "
f"lookup cost about ${lookup_cost_usd(len(subs), pages):.5f}")
Questions readers ask
Is there an API to see who someone subscribes to on Twitter (X)?
Yes. TwitterAPI.io's GET /twitter/user/subscriptions takes a numeric userId and returns the creators that account subscribes to through Creator Subscriptions, 20 per page with next_cursor. Resolve a handle to an id first with /twitter/user/info. It works for public profiles and reads with an API key, no X account needed.
Can I get the list of people who subscribe to my account?
Not with this endpoint. It returns only the creators an account pays to support, never the fans who pay that account.
Does the official X API have a Creator Subscriptions endpoint?
We found none documented. In the X API v2 documentation index, the endpoints named "subscriptions" belong to Account Activity and X Activity webhooks. X's TypeScript SDK reference has an AudiencePolicy schema with a creatorSubscriptions property typed as an array of Any, but no method that lists a user's subscriptions.
How much does the Creator Subscriptions API cost?
15 credits per creator returned ($0.15 per 1,000 creators), with a 15-credit ($0.00015) minimum per request; $1 = 100,000 credits. An account that subscribes to nobody costs the minimum. In our 2026 measurement a full lookup for an account with 58 creators, including the 18-credit id lookup, cost 888 credits ($0.00888).
Why does the endpoint return an empty list?
Usually because the account subscribes to nobody, which is the normal case: 72 of 75 large public accounts in our 2026 pool returned an empty users list with status: success. If status is error with msg: "user not found", check the id.
Can I pass a username instead of a user id?
No. The endpoint accepts the numeric userId only. Call /twitter/user/info?userName=<handle> and read data.id, or use the free Twitter ID finder tool for a one-off conversion.
Is this the same as Super Follows?
Creator Subscriptions is the current name; press coverage in April 2023 reported that X renamed Super Follows to Subscriptions. The endpoint returns what a profile's Subscriptions tab shows publicly.
Does the response say when a subscription started or what it costs?
No. Each item is the creator's profile (id, handle, followers, verification flag, bio and similar fields). There is no start date, price tier or history, so keep your own snapshots if you need to track changes.
Continue
- TwitterAPI.io docs: Get User Subscriptions (userId, cursor, 20 per page, 15 credits per creator)
- TwitterAPI.io docs: Get User Info (username to numeric id)
- X API pay-per-usage pricing and credits (official rate card)
- X API docs: Account Activity Get Subscriptions (webhook subscriptions)
- X TypeScript SDK reference: AudiencePolicy (creatorSubscriptions property)
- X API v2 documentation index
- X (Twitter) API overview: every endpoint and how pricing works
- Track Twitter (X) followers over time with the API
- Hosted Twitter (X) MCP server for Claude, Cursor and other agents
- Twitter (X) username lookup API reference
- Free Twitter ID finder: convert a handle to a numeric user id
- Twitter (X) profile analytics with the API
- TwitterAPI.io pricing: credits, plans and rate limits
- Get your TwitterAPI.io API key
- 01Google AI Studio Free Tier Limits: What the Gemini API Allows in 2026
- 02Best Claude Model for Coding in 2026: Opus vs Sonnet vs Haiku vs Fable, Priced on Real Twitter (X) Data
- 03Zapier Alternatives in 2026: Prices, Self-Hosting and Which Ones Still Connect to Twitter (X)
- 04Antigravity vs Cursor: Plans, Models and a Twitter (X) MCP Setup in Both
- 05Claude Code Alternatives: Seven Coding Agents Checked for License, Free Use and MCP (Twitter/X Data Included)
- 06How to Search and Track Mentions on Twitter (X), Including Someone Else's
- 07How to Track Andrew Tate's Tweets Using the Twitter (X) API
- 08How to Clear Your Twitter (X) History: Searches, Watch History, and Posts
Stop reading. Start building.
Starter credits cover real testing on real data. Google sign-in, no card, no application queue.
Get an API keyAlready building with TwitterAPI.io? Publish an honest tutorial or build log about it and earn up to $200 a month in API credits.