Bluesky Shadowban: It's Called needs-review, and It Usually Expires in 7 Days

A Bluesky shadowban is the needs-review label: an account-level moderation label that hides your replies, quotes and mentions from non-followers, stays invisible to you, and in most cases expires on its own after seven days.

It is real, it has a name, and you can check yours in one request from a browser address bar. Bluesky's own 2025 transparency report says needs-review is "applied automatically to combat large-scale spam attacks and bulk abuse patterns" and that it reached 370.14K accounts in 2025. What the report doesn't tell you — and what nothing else written about Bluesky shadowbans tells you — is how long one lasts. It's seven days, 83.5% of the time, written into the label as an expiry timestamp.

The pages ranking for this mostly can't get there because they don't think the answer exists. Circleboom's shadowban checker states flatly that "Bluesky does not provide public 'ban' labels; results are based on algorithmic engagement probability" — it's inferring from engagement, because it believes the real thing is unavailable. It isn't. PostGun's guide never names a label, an endpoint or a mechanism, and lands on a posting mix of "40% useful commentary or insight, 30% conversation starters, 20% proof or examples, 10% direct promotion." Credit where it's due on the third one: amishadowbannedonbluesky.com queries the right endpoint and even filters out expired labels correctly — it just tells you nothing about what the label does, how often it's applied, or when it lifts.

So I pulled the log. Everything below is checked against the atproto source, Bluesky's 2025 transparency report, and 57,566 live moderation labels I paged out of mod.bsky.app covering all of 2026-09-16 UTC, on September 18, 2026.


What Is a Bluesky Shadowban, and What Does It Actually Do?

It makes you invisible to strangers and to nobody else. That behaviour isn't inference — it's pinned down by a test file in Bluesky's own repository, packages/bsky/tests/views/labels-needs-review.test.ts, which asserts each of the following:

Where What happens while you carry needs-review
Your replies in a thread Removed from the thread for logged-out viewers and non-followers
Your quote posts Removed from the post's quote list
Reply, quote and mention notifications Never delivered to the person you replied to, quoted or mentioned
Your own view Unchanged — your reply is still sitting there in the thread
Your followers' view Unchanged — they still see everything

Those last two rows are the entire problem. The test names are literally does not apply to self. and does not apply to followers. You keep talking, your regulars keep replying, and the room quietly stops growing.

It is an account label, never a post label. Bluesky puts it plainly — "our operational label (needs-review) works exclusively at the account level by design" — and the log agrees: all 2,790 of the needs-review labels applied in my sample day were account-level. Not one was applied to an individual post.


How Do I Check If My Bluesky Account Is Shadowbanned?

I tested it on 30 accounts I knew were labeled: the moderation labeler reported needs-review for 30 of 30, and Bluesky's normal app API reported it for 0 of 21. The check works, and the obvious place to look is the one place that will never tell you.

Two public GET requests, no login and no app password — both go in a browser address bar.

  1. Turn your handle into a DID. Open https://public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=yourhandle.bsky.social and you get back something like {"did":"did:plc:z72i7hdynmk6r22z27h6tvur"}.
  2. Ask the moderation labeler directly. Open https://mod.bsky.app/xrpc/com.atproto.label.queryLabels?uriPatterns=did:plc:yourdid. That host is the #atproto_labeler endpoint in the Bluesky Moderation Service's DID document, it takes no authentication, and it returns cryptographically signed labels.
  3. Read the result properly, because three fields matter and only one is obvious. You have a live shadowban if a label has "val":"needs-review", has "src":"did:plc:ar7c4by46qjdydhdevvrndac" (Bluesky's own labeler, not a third-party one you subscribed to), has no "neg":true, and has an exp timestamp still in the future. {"labels":[]} means the official moderation service holds nothing on you at all.

That expiry check is not optional. Most needs-review labels are issued pre-expired in the sense that they will lapse in a week, and they stay in the log afterwards — so reading val alone will tell people they're shadowbanned long after the hold ended.

The reason this isn't common knowledge is that the normal API deliberately hides it. Labels usually ride along inside ordinary API responses; a profile fetch hands you a labels array, which is the whole basis of Bluesky's public moderation design and of how labelers work. needs-review is carved out. In packages/bsky/src/hydration/label.ts the appview checks each label and skips this one, with the explanation left in the source:

// we action needs review labels on backend for now so don't send to client until client has proper logic for them

There is a header, atproto-accept-labelers, that in principle lets a client ask for labels without that redaction. On the production appview it doesn't help: I sent the same request three ways — no header, the labeler DID plain, and the labeler DID with ;redact — and all three came back with an identical atproto-content-labelers: did:plc:ar7c4by46qjdydhdevvrndac;redact response header. Redaction of Bluesky's own moderation labeler is forced server-side. There's no client-side opt-out.

Which is what that 30/30 versus 0/21 result is: every labeled account that still resolved returned a flat "labels":[] from the profile endpoint while the labeler openly served a signed needs-review for the same DID. (21 rather than 30 because nine of the thirty had stopped resolving entirely by the time I checked two days later — deleted, deactivated or taken down. More on that below, because it matters.)

There's a zero-tooling version of the same test: reply to a stranger's post, then open that thread in a logged-out private window. If it's there for you and missing there, you have your answer.


How Long Does a Bluesky Shadowban Last?

Seven days, usually, and it clears itself. This is the part no one has published, and it's sitting in plain sight in the label records.

Bluesky attaches an explicit exp timestamp to most needs-review labels. Of the 2,790 applied on 2026-09-16:

Expiry written into the label Count Share
Exactly 7 days after issue 2,329 83.5%
Exactly 1 day after issue 121 4.3%
No expiry at all 340 12.2%

needs-review was the only label type in the entire day's log — out of 55,646 applications across fourteen label values — that carried an expiry field at all. Everything else Bluesky applied that day, from porn to !takedown, was open-ended.

Moderators also lift them early. In the same 24 hours that 2,790 accounts picked one up, 527 needs-review labels were removed from accounts flagged earlier. Removal is a negation — a second label record with neg set — so the check above works as a monitor, not just a one-shot test. Re-run it and you'll see the state flip.

All of which supports Bluesky's own framing, which I think is fairer than the word "shadowban" implies. The sentence right after the one everybody quotes reads: needs-review "acts as a temporary holding measure that minimizes user impact while giving moderators time for assessment and enforcement decisions." A week-long automatic hold on an account that tripped a spam heuristic is a triage queue, not a secret punishment. There's no self-serve way to clear one early; if you think yours is wrong, the appeal path is the ordinary in-app moderation appeal.


What Actually Gets You Shadowbanned on Bluesky?

Here is every label Bluesky's moderation service applied in one UTC day, 2026-09-16 — 57,566 label events, 55,646 applications and 1,920 removals, paged out of queryLabels with uriPatterns=* and a cursor:

Label Applied Account-level Removed that day
porn 38,695 0 866
sexual 9,799 1 214
!takedown 2,836 2,686 97
needs-review 2,790 2,790 527
nudity 895 0 118
graphic-media 272 0 16
sexual-figurative 211 0 16
intolerant 41 0 2
spam 36 34 13
self-harm 27 0 3
!suspend 26 26 47
!hide 14 6 0
rude 3 0 1
!warn 1 1 0

Three things fall out of that, and the third is the one worth changing your mind about.

Almost all Bluesky moderation is adult-content tagging. The five adult and graphic labels — porn, sexual, nudity, graphic-media, sexual-figurative — are 49,872 applications, or 89.6% of everything applied, and essentially all of it lands on individual posts rather than accounts. That squares with Bluesky's report that "the majority of labels applied (95.34%) come from automated systems," against 16.49M labels and 9.97M user reports in 2025.

Account-level enforcement is small and concentrated. Of 5,544 account-level applications in the day, 5,476 of them — 98.8% — are just two labels: !takedown and needs-review, split almost evenly between "you're gone" and "you're on hold."

The labels people actually fear are dead letters. Bluesky's labeler declares 24 label values, including engagement-farming and inauthentic. Thirteen of those 24 were applied zero times in a full day — among them engagement-farming, inauthentic, scam, impersonation, misleading and misinformation. If you've been scanning your profile for a visible "engagement farming" flag, you're checking a box Bluesky has effectively stopped ticking. Enforcement runs through the label you can't see.

Honest limits on all of this. It's a single day — a Wednesday, and a busy one. At 2,790 labels it runs about 2.7x the daily average implied by Bluesky's own 370.14K-per-year figure, so read it as a snapshot of a spam wave rather than a steady rate. More important, the labeled population is not people like you: 529 of those 2,790 accounts, 19%, were hit with !takedown or !suspend the same day, and by two days later nine of my thirty-account sample had stopped resolving altogether. needs-review is mostly landing on spam, and mostly on its way to a takedown. And the label carries no reason field, so nobody outside Bluesky can tell you why a specific account got one — including me. The log tells you whether, not why.


Can Following Too Fast Get You Shadowbanned?

Bulk behaviour is what the label is built to catch — "large-scale spam attacks and bulk abuse patterns" is Bluesky's phrase — but what it's pattern-matching is shape, not raw volume.

Two things get conflated here that shouldn't be. Hitting Bluesky's rate limits is a technical wall — 5,000 points an hour and 35,000 a day, where a CREATE action costs 3 — and it is not a moderation event at all. There's no hard follow cap, and automation is explicitly permitted; Bluesky publishes a bot tutorial. The community guidelines prohibit manipulating engagement metrics and follower counts, not tools. What gets an account into the triage queue is looking like a spam wave: mass follows unrelated to anything you post, follow-then-unfollow churn against people who never followed back, replies fired at strangers at machine speed. If your reach has fallen off and queryLabels shows nothing on your DID, the cause is something else — possibly a spam flag on a specific post rather than on your account.

This is the part where I have an interest, so weigh it accordingly: Agent Sky is a growth tool, which means the churn signature described in the paragraph above is precisely the failure mode we have to design against. We follow accounts genuinely active in your niche rather than everyone reachable, on a paced schedule rather than in bursts, and we verify a live follow-back before unfollowing anyone — so the account never generates the pattern "bulk abuse" is looking for. $9 a month, free to start.

Whatever you use, including nothing at all: the two requests at the top of this page take about ten seconds, and they beat a checker inferring your fate from "algorithmic engagement probability."


Quick FAQ

Does Bluesky shadowban accounts? Yes, and unusually, Bluesky names the mechanism in its own transparency report. The moderation service applies an account-level label called needs-review, which Bluesky describes as "applied automatically to combat large-scale spam attacks and bulk abuse patterns" and which reached 370.14K accounts in 2025. The effect matches the textbook definition of a shadowban: your replies are dropped from threads for people who don't follow you, your quote posts disappear from quote lists, and the person you replied to, quoted or mentioned never gets the notification — while you and your existing followers see everything as normal. Bluesky calls it a "temporary holding measure," not a punishment.

How do I check if my Bluesky account is shadowbanned? Two public GET requests, no login required. First turn your handle into a DID: public.api.bsky.app/xrpc/com.atproto.identity.resolveHandle?handle=yourhandle.bsky.social. Then ask Bluesky's moderation labeler what it holds on that DID: mod.bsky.app/xrpc/com.atproto.label.queryLabels?uriPatterns=did:plc:yourdid. Look for a label whose val is needs-review, whose src is did:plc:ar7c4by46qjdydhdevvrndac, which has no neg flag, and whose exp date is still in the future — an expired label is no longer in force. An empty result means the official moderation service holds nothing on you. The normal app API will not tell you any of this; it strips the label before the response reaches a client.

How long does a Bluesky shadowban last? Usually exactly seven days, and it clears itself. Bluesky attaches an explicit expiry to most needs-review labels: of the 2,790 applied in a full day of the moderation log I pulled, 2,329 (83.5%) expire seven days after they were applied, 121 (4.3%) expire after one day, and only 340 (12.2%) carry no expiry at all. It is the only label type in that entire day's log that carries an expiry field. Moderators also lift them early — 527 needs-review labels were removed that same day from accounts flagged earlier. So the honest answer is that most Bluesky shadowbans are a one-week automatic hold that ends without you doing anything.

Can I get shadowbanned on Bluesky for following too many people? Bulk behaviour is what the label is built to catch — Bluesky applies needs-review for "large-scale spam attacks and bulk abuse patterns" — so acting like a spam wave is the risk, not the raw follow count. There is no hard follow cap on Bluesky and automation is explicitly permitted; the rate limit of 5,000 points an hour and 35,000 a day is a technical wall, not a moderation event. Be aware that the label carries no reason field, so nobody outside Bluesky can say which action triggered any given one. Worth knowing: the scary-sounding public labels are not the enforcement route. In a full day of moderation, engagement-farming and inauthentic were each applied exactly zero times.

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.