Twitter (X) Creator Subscriptions API: see which creators an account subscribes to

By TwitterAPI.io Team•13 min read
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.
Which way the list points, and the two calls behind every lookup. The example numbers were measured in 2026.

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.

01 — Section

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.

QuestionAnswered by /twitter/user/subscriptions?
Which creators does @someone pay to support?Yes, up to 20 per page, all pages via next_cursor
Who pays @creator a monthly subscription?No
How much does a subscription cost, or when did it start?No: the response has no price or date fields
Does @someone subscribe to anyone at all?Yes: an empty users list with status: success means no
Subscriptions that are hidden or have endedNo: only what the profile's Subscriptions tab shows publicly

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.

02 — Section

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.

03 — Section

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.

python
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}")
04 — Section

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.

FieldTypeNotes
id, userName, namestringNumeric id as a string; handle without @
followers, followingintegerCounts at the time of the call
verifiedbooleanVerification flag on the creator's profile
statusesCount, mediaCount, favouritesCountintegerPosts, media posts, likes
description, location, urlstringBio, free-text location, profile link (often a t.co URL)
createdAtstringISO 8601 here, for example 2015-08-14T17:16:01.000000Z
profilePicture, coverPicturestringImage URLs
protected, canDmbooleanPrivate account flag; whether the creator accepts DMs

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.

05 — Section

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.

Group (collected in 2026)Accounts checkedSubscribe to 1+ creatorShare
Our pool, 100k-1M followers4436.8%
Our pool, 1M+ followers3100%
Team sample, random active accounts under 100k90110.11%
Team sample, 100k-1M followers61030.49%
Team sample, 1M+ followers38151.31%

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.

Horizontal bar chart of the share of public accounts subscribing to at least one creator. Team sample: random active accounts under 100k followers 0.11% (1 of 901); 100k-1M 0.49% (3 of 610); 1M+ 1.31% (5 of 381). Our pool followed by YC, a16z and TechCrunch: 100k-1M 6.8% (3 of 44); 1M+ 0% (0 of 31).
Share of public accounts subscribing to any creator, collected in 2026. All 3 subscribing accounts in our 75-account pool came from one followings list, so read the bars as a range, not a rate.
06 — Section

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.

Account (collected in 2026)CreatorsPagesCredits incl. user/infoCost
@garrytan583888$0.00888
@DavidSacks71123$0.00123
@Scobleizer61108$0.00108
Any account that subscribes to nobody0133$0.00033

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.

Bar chart of the cost of one full lookup (user/info plus all subscriptions pages). @garrytan 58 creators, 3 pages, $0.00888; @DavidSacks 7 creators, 1 page, $0.00123; @Scobleizer 6 creators, 1 page, $0.00108; an account with no subscriptions, 1 page, $0.00033.
Cost of one complete lookup, measured in 2026: 18 credits to resolve the handle plus 15 credits per creator returned (15-credit minimum).
07 — Section

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.

python
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")
08 — Section

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).

09 — Section

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.

python
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}")
10 — Questions

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.

11 — Further reading

Continue

Sources & further reading
More from this series
Build it

Stop reading. Start building.

Starter credits cover real testing on real data. Google sign-in, no card, no application queue.

Get an API key

Already building with TwitterAPI.io? Publish an honest tutorial or build log about it and earn up to $200 a month in API credits.