X shows the follower count of an account today, but not how it got there. There is no growth chart in the app, and the numbers on third-party tracking sites are mostly estimates. If you want to know how your account or a competitor's grows, you have to write the number down yourself, regularly. This guide does that with a short script: one call a day for up to 500 accounts, a CSV with the history, a chart, and an alert when a count moves more than normal.

We run TwittrAPI, which the script uses. It needs an API key from us and no X login. For a one-off look at a single account, the free follower count checker is quicker.

What you can and cannot track

You can trackYou cannot get from X
Follower, following and post counts over timeWho followed or unfollowed on a given day, unless you compare full follower lists
Any public account, yours or a competitor'sThe follower history from before you started logging
Listed counts and verification changesPrivate (protected) accounts' details

The profile gives you the current numbers only, so the history starts the day you run the script. If you also need to know who the followers are, export the follower list to CSV and compare two exports.

Step 1: Get an API key

Create a key on /start. New accounts get $0.50 of test credit for 7 days. Keep it in an environment variable:

export TWITTRAPI_API_KEY="your-key"

Step 2: Look up the accounts

Numeric IDs do not change when someone renames their handle, so resolve each handle once and track by ID. GET /user/users/by/ids returns up to 500 profiles in one call:

import os
 
import requests
 
API = "https://api.twittrapi.com"
HEADERS = {"X-API-KEY": os.environ["TWITTRAPI_API_KEY"]}
 
 
def get(path, **params):
    r = requests.get(f"{API}{path}", headers=HEADERS, params={"format": "simple", **params}, timeout=30)
    r.raise_for_status()
    return r.json()["data"]
 
 
handles = ["NASA", "X", "yourname"]
ids = [get(f"/user/by/username/{h}")["id"] for h in handles]
print(",".join(ids))

Save the printed IDs in a config file. After that, you need one call per run, not one per account.

Step 3: Save a snapshot

Each run asks for all profiles at once and appends one row per account to a CSV:

import csv
from datetime import datetime, timezone
from pathlib import Path
 
IDS = ["11348282", "783214"]  # from step 2
FILE = Path("followers.csv")
 
profiles = get("/user/users/by/ids", ids=",".join(IDS))
today = datetime.now(timezone.utc).date().isoformat()
 
new_file = not FILE.exists()
with FILE.open("a", newline="") as f:
    w = csv.writer(f)
    if new_file:
        w.writerow(["date", "id", "username", "followers", "following", "posts"])
    for u in profiles:
        c = u["counts"]
        w.writerow([today, u["id"], u["username"], c["followers"], c["following"], c["tweets"]])

The response has counts.followers, counts.following and counts.tweets for each profile. Run the script once a day from cron or a GitHub Action. Running it more often than once an hour only fills the file with the same numbers.

Step 4: Chart the growth

With pandas and matplotlib, one line per account:

import matplotlib.pyplot as plt
import pandas as pd
 
df = pd.read_csv("followers.csv", parse_dates=["date"])
wide = df.pivot_table(index="date", columns="username", values="followers")
 
# Growth since the first day, so a large and a small account share one axis
(wide / wide.iloc[0] * 100 - 100).plot(figsize=(9, 4), ylabel="Growth since start (%)")
plt.tight_layout()
plt.savefig("growth.png", dpi=150)

Showing the change in percent instead of the raw count lets you compare an account with 5,000 followers and one with 5 million on the same chart.

Step 5: Get an alert on a jump or drop

Compare today with the last seven days. A jump can be a viral post, a giveaway or bought followers; a drop can be a purge of inactive accounts:

daily = wide.diff().dropna()
latest = daily.iloc[-1]
normal = daily.iloc[:-1].tail(7).abs().mean()
 
for name in wide.columns:
    if abs(latest[name]) > 5 * max(normal[name], 1) and abs(latest[name]) >= 50:
        print(f"@{name}: {latest[name]:+,.0f} followers since yesterday (usually {normal[name]:,.0f} a day)")

Send the line to Slack or Telegram instead of printing it, as shown in tweet alerts in Discord, Telegram or Slack. The two conditions matter: the multiple avoids false alarms on tiny accounts and the minimum of 50 avoids alerts on days when 3 followers became 18.

Node.js version

npm install twittrapi
import { TwittrAPI } from "twittrapi";
import { appendFileSync } from "node:fs";
 
const client = new TwittrAPI({ format: "simple" }); // key from TWITTRAPI_API_KEY
 
const page = await client.users.getMany(["11348282", "783214"]);
const today = new Date().toISOString().slice(0, 10);
 
for (const u of page.data) {
  appendFileSync("followers.csv", `${today},${u.id},${u.username},${u.counts.followers},${u.counts.following},${u.counts.tweets}\n`);
}

The Python SDK has the same call, client.users.get_many([...]). See the endpoint reference and the SDK page.

What it costs

A run is one call, whether it covers 3 accounts or 500. Once a day that is about 30 calls a month. At $0.10 per 1,000 calls on Standard, the whole tracker costs well under a cent a month. Tracking 500 competitors costs the same as tracking one, which is the main reason to use the batch endpoint.

Ideas that use it

  • Competitor benchmark. Put your three closest competitors next to your own account and review the chart monthly.
  • Campaign effect. Mark the date of a launch or a giveaway and see what stayed after a week.
  • Influencer vetting. An account whose count climbs in steps, with no matching rise in likes, is worth a second look. Fetch a few posts with Get an account's tweets with Python and compare likes to followers.
  • Public dashboards. Write the CSV to a sheet with Apps Script and share it with the team.

Frequently asked questions

How can I track my follower growth on Twitter/X?

Save the follower count once a day and chart the numbers. X has no growth history in the app. A script that reads the profile and appends a row to a CSV does it, and the history starts the day you begin.

Can I see how many followers an account had last month?

Not from X. The profile shows only the current number, so past values come from your own log or a service that has been logging. Start logging now and the history builds from today.

Can I track competitors' followers?

Yes, for any public account. You only need the handle, and the account does not see that you check it.

How many accounts can I track in one call?

Up to 500 profiles per call with the batch endpoint, with IDs separated by commas.

Can I find out who unfollowed me?

Only by comparing two complete follower lists. Export the list on two days and compare the IDs. The count alone tells you how many, not who.

How much does a follower tracker cost?

One call per run. With one run a day that is about 30 calls a month, which is under a cent on TwittrAPI.

Sources

TwittrAPI is not affiliated with X Corp. It reads only public data.