How to Export Your Bluesky Followers and Following List — The Official Export Has Zero Followers In It

Bluesky's official export — Settings → Account → Export my data — hands you a repo.car file holding every record currently in your account: your posts, your likes, your blocks, and every follow you've made and not undone. It contains none of your followers, and it never will, because a follower is a record that lives in someone else's account, not yours. To get a followers list you have to page a public API, and across 34 accounts I paged until the cursor ran out, that API returned a median of 84.5% of the followers the profile claimed. Nothing you export is wrong, exactly — it's just three different lists, and nobody says which one you're getting.

The pages ranking for this today are mostly tool landing pages, and none of them name the endpoint they're calling. Comment Picker's is typical — "export any Bluesky user's followers and followings" to CSV, free tier capped at 50 rows — and it's a perfectly decent wrapper on something free. The one real tutorial in the set, Android Police's, walks you through the in-app CAR download correctly and stops there. Nobody quantifies what any of it actually returns, and the gaps turn out to be big enough to matter.

So I measured all of it: 45 real repository exports downloaded on September 7, 2026, plus a followers pull on 34 accounts and a three-way comparison of the following list on 30 more.


What Does Bluesky's Official Data Export Actually Contain?

Every public record still in your account, in one archive, weighing a median of 10.74 MB. The button in the app calls exactly one endpoint — com.atproto.sync.getRepo, whose own lexicon describes it as "Download a repository export as CAR file" and adds "Does not require auth." You can skip the app entirely — but you have to send the request to the right server, which is the one thing every guide to this gets wrong:

# 1. which server actually stores this account?
curl -s 'https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=bsky.app' \
  | jq -r '.didDoc.service[].serviceEndpoint'
# -> https://puffball.us-east.host.bsky.network

# 2. ask that server, not bsky.social
curl -s 'https://puffball.us-east.host.bsky.network/xrpc/com.atproto.sync.getRepo?did=did:plc:z72i7hdynmk6r22z27h6tvur' -o repo.car

Send that second request to bsky.social and you get {"error":"AuthMissing"} — which is exactly the copy-pasteable URL Bluesky's own 2023 export post tells you to use. They know: the post now carries an "Update, August 2026" note saying bsky.social used to be one PDS hosting every account and is now only an auth entryway, so "Sync requests such as com.atproto.sync.getRepo sent to https://bsky.social do not return a repository." Every Bluesky account now sits on a shard like puffball.us-east.host.bsky.network, and step 1 is how you find out which one. (If you'd rather not touch a terminal at all, Bluesky's goat CLI wraps the whole thing as goat repo export <handle>.)

A CAR file is a content-addressed archive — a bag of hash-linked blocks, signed at the root, holding your repository's key-value tree. It's the format Bluesky uses to move an account between servers (fetch with getRepo, load with com.atproto.repo.importRepo), which is why you get it rather than a friendly CSV.

Here's what was actually inside the 45 exports I read, 2,606,268 records in all:

Record type Share of all records What it is
app.bsky.feed.like 60.16% every like you've ever tapped
app.bsky.feed.post 23.47% posts and replies
app.bsky.feed.repost 6.62% reposts
app.bsky.graph.follow 6.40% your following list
app.bsky.feed.threadgate 2.66% reply controls on your threads
app.bsky.graph.block 0.51% who you've blocked
lists, listitems, starter packs, feed generators, profile <0.2% combined the long tail
followers 0.00% not a record type at all — a follower is a record in their repo, not yours

Two things fall straight out of that table. Your export is mostly likes — which surprises people who think of it as a post archive, and which is worth knowing before you assume the file is safe to hand to anyone. And your entire following list is 6.4% of it.

What's missing is stated plainly in the app's own dialog, which I'd trust over any third-party write-up: "Your account repository, containing all public data records, can be downloaded as a 'CAR' file. This file does not include media embeds, such as images, or your private data, which must be fetched separately." Images live in a separate blob store on the same host, which you page with com.atproto.sync.listBlobs and then fetch one at a time with com.atproto.sync.getBlob?did=…&cid=…. It is not a small omission: theverge.com's 11.61 MB export left out 12,810 blobs when I checked it on September 7, 2026.

And here's the bit none of the guides mention. Everyone says the export excludes your DMs, and the CAR file does — but scroll down inside that same dialog and there's a second section, "Export my chat data," whose Download chat data button calls chat.bsky.actor.exportAccountData and saves a chat.jsonl. Its description is exact about the catch: "This file only includes chat messages that you have sent and does not include chat messages that you have received." You can export your half of every conversation. (The dialog labels the whole feature as being in beta, and it shows.)


How Do I Export My Bluesky Following List?

Three routes, and they don't agree with each other. Ranked by completeness, most complete first:

  1. The official CAR export. Settings → Account → Export my data → Download profile data. Complete by construction — it is your repository. Costs you a CAR parser.
  2. com.atproto.repo.listRecords. One unauthenticated request per 100 follows, returning the same records as ordinary JSON — no CAR parser needed. This is the sweet spot for most people, and it's a one-liner:
    curl -s 'https://bsky.social/xrpc/com.atproto.repo.listRecords?repo=<your-handle>&collection=app.bsky.graph.follow&limit=100'
    
    Each record gives you the followed account's DID and a createdAt timestamp — the follow date, which the app never shows you (more on what that exposes). Two gotchas: bsky.social proxies this one (unlike getRepo), but only for accounts it fronts — a self-hosted handle comes back Could not find repo, so send it to that account's own host. And don't try it against public.api.bsky.app, which answers MethodNotImplemented; that's an AppView, not a repo.
  3. app.bsky.graph.getFollows — the endpoint behind the Following tab, and near-certainly the one your browser extension or export site is calling. Convenient, returns handles and display names instead of bare DIDs, and incomplete.

I checked routes 1 and 2 against each other on four accounts and they agreed to within a single record: 717/717, 1,023/1,023, 652/652, and 4,762 against 4,761 for an account that gained a follow between the two reads. listRecords is the CAR export without the CAR.

Route 3 is where it comes apart. Across 30 accounts, 49,205 follow records, on September 7, 2026:

View of the same following list Records returned Share of what's in the repository
Repository (CAR export / listRecords) 49,205 100%
app.bsky.graph.getFollows (third-party tools) 45,425 92.3%
followsCount on the profile 49,184 99.96%

Per account the median shortfall was smaller but never in the other direction: getFollows returned a median 94.7% of the repository (worst case 75.4%), it came up short on 27 of 30 accounts, matched on 3, and exceeded the repository on none. If you export your following list with a browser extension, you're quietly dropping a few percent of it. I didn't diff the two lists name by name, so I can't tell you exactly who goes missing — but the same index-side filtering that shrinks the followers list, below, is the obvious candidate.


How Do I Export My Bluesky Followers?

You can't, in the sense people mean. There is no follower record to export — and the best available substitute is missing about 15% of your followers.

This is structural, not a missing feature. When someone follows you, the record is written into their repository with your DID as the subject. Nothing at all lands in yours. That's the same reason there's no remove-follower button. Across my 45 exports the accounts had 2,331,062 followers between them and the exports contained 0 records about any of them.

So an "export your Bluesky followers" tool is almost certainly doing one thing: paging app.bsky.graph.getFollowers until the cursor runs out. That works, it needs no login, and — this is why the extensions advertise "works with any public profile" — it works just as well on somebody else's account as on yours. You can also just do it yourself. On September 7, 2026 I did exactly that for 34 accounts, paging each one logged out until its cursor came back empty:

What I measured (n = 34 accounts, each paged until its cursor ran out) Result
Followers actually returned 103,560
Followers the profiles claimed 125,225
Median per-account coverage 84.5% (min 53.8%, max 100.0%)
Pooled coverage across the sample 82.7%
Accounts returning fewer than displayed 33 of 34
Accounts returning more than displayed 0 of 34
Duplicate rows served across pages 0
Throughput, unauthenticated, home broadband 504 followers/second

Exactly one account of the 34 handed back its full follower count. The worst handed back barely half.

That gap isn't a bug in the pull, and it isn't Bluesky hiding anything from you — it's two different numbers behaving as documented. Bluesky maintainer bnewbold's summary is that getFollowers "does filtering to remove muted, blocked, takendown, and deactivated accounts" while the profile total counts graph relationships "which are no longer valid"; the full explanation lives in why your Bluesky follower count looks wrong. What that post doesn't have is the size of it. Reading logged out takes your mutes and blocks out of the picture, so most of what's being subtracted here is taken-down and deactivated accounts — and it's a median 15% of a typical follower count, an order of magnitude wider than the rounding-error framing that question usually gets.

The same effect shows up from the other side, and this is the detail I'd flag if you're auditing your own numbers: in 8 of my 45 exports the repository held more follow records than the profile's followsCount, never fewer. Your own file remembers follows the network has stopped counting.


How Do I Export My Bluesky Followers to CSV?

Two curl calls and a jq filter — and the version you build yourself has a column the export sites can't give you. This walks your own follow records and writes real CSV, paging until the cursor runs out:

HANDLE=your-handle.bsky.social
DID=$(curl -s "https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=$HANDLE" | jq -r .did)
PDS=$(curl -s "https://plc.directory/$DID" | jq -r '.service[]|select(.id=="#atproto_pds")|.serviceEndpoint')

echo "followed_did,followed_at"
CURSOR=""
while :; do
  R=$(curl -s "$PDS/xrpc/com.atproto.repo.listRecords?repo=$DID&collection=app.bsky.graph.follow&limit=100&cursor=$CURSOR")
  echo "$R" | jq -r '.records[] | [.value.subject, .value.createdAt] | @csv'
  CURSOR=$(echo "$R" | jq -r '.cursor // empty')
  [ -z "$CURSOR" ] && break
done

Swap app.bsky.graph.follow for app.bsky.feed.post or app.bsky.feed.like and the same loop exports those instead.

The second column is the point. followed_at is the date you followed that account, and no export site can hand it to you, because getFollows doesn't return it — a gap I went into in can you hide who you follow on Bluesky. If you want handles rather than DIDs you'll need a second lookup (app.bsky.actor.getProfiles takes 25 DIDs a call), which is the one thing the paid tools genuinely save you.

For followers there's no repository to walk, so the same loop runs against app.bsky.graph.getFollowers on public.api.bsky.app instead — with the ~15% shortfall above baked in, and no follow dates at all, because those records aren't yours to read from your own account.


Which Bluesky Export Method Should You Use?

If you can run one curl command, use listRecords. If you can't, an export site is fine — it just isn't more complete than the free endpoint it's calling.

Method Gets your follows Gets your followers Completeness Needs login Cost
Official CAR export Yes No 100%, by construction In-app yes, endpoint no Free
listRecords (JSON) Yes No matched the CAR on 4/4 accounts, to within one live write No Free
getFollows / getFollowers Yes Yes median 94.7% / 84.5%, measured No Free
Export sites & extensions Yes Yes same as the row above — same endpoints No varies

On that last row: they're a convenience wrapper on a free public endpoint, and they price accordingly. Comment Picker's Bluesky export, one of the tools ranking for this query, gives free users 1 export a day and 3 a month, capped at 50 rows each, with unlimited exports at $9.99/month. (Both figures as of September 2026 — pricing pages move.) That's a fine deal if you want a spreadsheet and never want to see a terminal. What it isn't is more complete than the free endpoint underneath it, because for followers there's no more complete public source to call.

Honest limits on my numbers. All three samples are accounts posting into Bluesky's Discover feed, so they skew toward people actively using the network rather than a random slice of it. The followers pull only covered accounts with 25–12,000 followers, and any account whose cursor didn't close — or whose pull hit a failed request — was dropped rather than counted (one was), so the coverage figure is computed only over the 34 pulls I know ran to the end. The following comparison only covered accounts with 25–6,000 follows. Everything was read logged out on September 7, 2026 with bsky_stats.py export, followercoverage and followsgap, plus two ad-hoc checks for the listRecords-versus-CAR comparison and the blob count.


Should You Export Your Following List Regularly?

Yes, and for a reason most people don't expect: almost everyone exporting a following list is trying to prune it, and a single snapshot is the wrong tool for that job. The file is the easy part. An export doesn't tell you which of those follows ever followed you back, which have gone quiet, or which went inactive six months ago; only two exports a month apart tell you that, and diffing them by hand is how the project usually dies.

That diff is the job Agent Sky does continuously — this is the sales pitch, so read it that way. $9 a month, free to start. It keeps the before-and-after for you, so who unfollowed you is answered without an archive of your own, and it re-checks for a live follow-back before it unfollows anybody. That check is why our own unfollow rate is so low: of 58,334 follows we've made, only 4.7% were ever reverted, and the median wait before an unfollow was 7 days (method and spread here) — which is the opposite of the churn unfollowing people who don't follow back turns into when it's automated carelessly.

And keep exporting anyway. It's free, it takes seconds, and your repository is the only copy of your history that remembers the accounts everyone else's index has forgotten.


Quick FAQ

Can you export your Bluesky followers? Not from Bluesky. The official export in Settings → Account → Export my data downloads your account repository, and a repository only holds records you wrote — your follows, posts, likes, blocks. A follower is a record in someone else's repository pointing at you, so there is nothing of theirs in your file. I downloaded 45 real repository exports on September 7, 2026: between them the accounts had 2,331,062 followers and the exports contained 0 follower records. The only route Bluesky offers is to page app.bsky.graph.getFollowers, which is near-certainly what a third-party "export followers" tool is doing — and across 34 accounts I paged until the cursor ran out, that returned a median of 84.5% of the follower count shown on the profile, short on 33 of 34.

How do I export my Bluesky following list to CSV? Two ways, and the unofficial one is easier. The official route is Settings → Account → Export my data → Download profile data, which saves a repo.car file you then have to parse. The simpler route is one unauthenticated request per 100 follows to com.atproto.repo.listRecords with collection=app.bsky.graph.follow, which returns the same records as plain JSON, ready to pipe through jq into a CSV — I checked the two against each other on four accounts and they agreed to within a single record. Both beat the API that third-party tools use: across 30 accounts, app.bsky.graph.getFollows returned a median of 94.7% of the follow records actually in the repository, and it does not return the date you followed anyone. listRecords does.

What is in a Bluesky CAR file? Every public record currently in your repository, and nothing else. Across 45 exports I read on September 7, 2026 — 2,606,268 records — the mix was 60.2% likes, 23.5% posts, 6.6% reposts, 6.4% follows, 2.7% threadgates and 0.5% blocks, plus a long tail of lists, starter packs, feed generators and chat declarations. It is current state, not history: anything you deleted, unliked or unfollowed is simply gone. Media is not in there either — the app's own dialog says the file "does not include media embeds, such as images, or your private data, which must be fetched separately," and the images sit in a separate blob store (theverge.com's 11.61 MB export left out 12,810 blobs on September 7, 2026). Median export size in my sample was 10.74 MB and the largest was 185.60 MB.

Does the Bluesky data export include your DMs? The CAR file does not, but there is a second section of the same dialog that exports some of them, and the guides miss it. Under "Export my chat data," a Download chat data button saves a chat.jsonl file, and its own description is precise about the catch: "This file only includes chat messages that you have sent and does not include chat messages that you have received." So you can export half of every conversation. Bluesky labels the whole export feature as being in beta.

Grow your Bluesky audience on autopilot

Agent Sky finds accounts in your niche, follows them at a safe pace, and unfollows the ones who never follow back. $9/month, free to start.