X Under the Hood Decoder
X hands you a .json file full of label names and no explanation. Drop it here and get every label and account state in plain English, what triggered it, and what to do about it.
What is the X Under the Hood file?
Under the Hood is an X pilot that lets eligible accounts download a .json listing the visibility labels applied to their posts and the states applied to their account. X gives you the raw file with no explanation. This decoder reads it in your browser and explains every label, what triggered it, and how to fix it.
Drop your .json file here
Or choose it below. On a phone, use the button, dragging is not available there.
Parsed with client-side JavaScript. No upload, no server request, no X API call. Disconnect from the network after this page loads and the decoder still works.
How to get the file from X
On x.com, open Settings and privacy, then Your account. If your account is in the pilot, Under the Hood appears in the account information area with a download that produces a .json file. The download is not on mobile for every account, so try the web app first.
Who can download it
X opened the pilot on 2026-08-13 to accounts that are at least one year old and have posted at least 10 times in the last month. It is a pilot, so meeting both conditions does not guarantee access, and there is no waitlist or request form. If the entry is not in your settings, your account is not in it yet.
If you do not have a file, the reference table below still applies. It is the same label set, and knowing which ones limit reach is useful whether or not you can see your own. If you suspect filtering and cannot get the export, the shadowban check tests the visible symptoms directly.
Every label in our reference
Post labels first, then account states. Entries marked inferred are ones X has not documented by name, where we are reading the key and X stated policy and telling you that is what we are doing.
Post labels
NSFW_HIGH_PRECISIONmoderateAdult content, high confidence
An automated classifier is confident the post contains adult nudity or sexual content. The post stays up, but it is held back from For You, search and trends for anyone who has not opted into sensitive media.
Fix: If the post really is adult content, mark your media as sensitive by default in Settings, Privacy and safety, Your posts. That keeps the label from being read as an attempt to evade filtering. If the call is wrong, use the appeal link on the post, since a manual review is the only route that removes an automated adult-content label.
NSFW_HIGH_RECALLmoderateAdult content, wide net
The same adult-content question asked with a much lower bar for saying yes. High recall means X would rather catch everything and be wrong sometimes, so this label carries far more false positives than the high precision one.
Fix: This is the label most worth appealing, because the false-positive rate is the whole point of the high recall setting. If several of your posts carry it and none are adult, appeal them individually rather than assuming the account is done for.
NSFW_REPORTED_HEURISTICSmoderateAdult content, from reports
Applied because people reported the post as adult content and a heuristic agreed, rather than because a model flagged it on its own.
Fix: Appeal it, and look at whether the post reached an audience it was not written for. Posts that land in front of people with no context attract reports that the same post inside your normal audience would never get.
NSFW_TEXTmoderateSexually explicit text
The text of the post was read as sexually explicit. No image is required. A text-only post can carry this.
Fix: Rewrite the wording if the flag is fair. If it is not, appeal. Deleting and reposting the same text usually gets the same label back and adds a duplicate-content signal on top.
NSFW_CARD_IMAGEmoderateAdult content in the link preview
The flagged image is the link preview card, not anything you uploaded. X pulled the og:image from the page you linked to and that image tripped the adult-content classifier.
Fix: Change the og:image on the destination page if it is yours, then repost so X fetches a fresh card. If the page is not yours, post the link without the card, or link to a different page on the same site.
NSFW_MEDIAlowinferredMedia marked sensitive
Reads as the ordinary sensitive-media marker: the media is behind a click-through warning. That is a filtering state, not a strike.
Fix: If you set it yourself, nothing to fix, this is the system working as intended. If you did not, check Settings, Privacy and safety, Your posts, and turn off the default sensitive marker if it is on.
GORE_AND_VIOLENCE_HIGH_PRECISIONhighGraphic violence, high confidence
The media was classified as graphic violence or gore. Recommendation surfaces drop the post.
Fix: For newsworthy footage, mark it sensitive yourself and say in the post what it shows. That is the treatment X asks for, and it is the strongest position to appeal from.
GORE_AND_VIOLENCE_REPORTED_HEURISTICShighinferredGraphic violence, from reports
Reads as the reports-driven twin of the graphic violence label, applied after users reported the post rather than from the model alone.
Fix: Appeal, and add context to the post. Graphic media with no explanation attracts reports even when it is legitimate.
SPAM_HIGH_RECALLhighSpam, wide net
A broad spam classifier matched the post. High recall again means a low bar, so ordinary posting patterns can produce it. This is the label most often behind a sudden unexplained drop in reach.
Fix: Stop the pattern before you appeal, because the classifier scores behaviour over a window rather than one post. Space posts out, vary the wording rather than reposting the same text, use one link per post, and drop link shorteners for a direct domain.
DUPLICATE_CONTENTmoderateDuplicate content
The post is the same as, or very close to, something already on the platform. That can be your own earlier post or someone else, and the label lands on the copy either way.
Fix: Rewrite rather than repost. Change the opening line, the framing, or the example, so the recycled post is a variant instead of a copy. If you recycle on a schedule, put a real gap between runs and vary the text each time.
AUTOMATION_HIGH_RECALLhighinferredAutomated behaviour suspected
Reads as X flagging the posting behaviour, not the content. Scheduling is allowed, so this is about the shape of the activity looking machine-generated.
Fix: Add jitter to the schedule so posts do not land on the exact minute every time, break up long automated runs, and never send the same reply text to more than a handful of accounts. If you post through an API or an agent, throttle it.
HIGH_TOXICITY_MODEL_SCOREmoderateinferredHigh toxicity score
Reads as a toxicity classifier scoring the text above a threshold. It is a score, not a policy finding, so it can land on heated but rule-abiding posts.
Fix: Look at whether the post attacks a person or an argument. Rewriting toward the argument usually clears the score. Quoting someone else abusive language can also trigger this, so paraphrase instead of quoting verbatim.
UNTRUSTED_URLhighinferredUntrusted link
Reads as a link in the post pointing at a domain X does not trust. The post is held back, and in some cases the link is interstitialed.
Fix: Link the destination domain directly instead of a shortener. If your own domain is flagged, that is a domain-level problem and needs an appeal through X support, not a repost.
DO_NOT_AMPLIFYcriticalDo not amplify
A blanket instruction to the recommendation systems to leave the post out. It is not a takedown, the post is visible to anyone who goes looking, and it is the heaviest of the reach-limiting labels.
Fix: Appeal it, and treat it as the top priority in this file. There is no posting-pattern change that clears it, because a decision produced it rather than a threshold.
LOW_QUALITYmoderateinferredLow quality content score
Reads as a quality score rather than a rule violation. Low quality posts are ranked down instead of removed.
Fix: Put the substance in the post rather than behind a link, and cut hashtags to one or two. This is the label that clears on its own fastest once the pattern changes.
ENGAGEMENT_FARMINGhighinferredEngagement farming
Reads as the label behind X public enforcement against posts that ask for the engagement directly rather than earning it.
Fix: Remove the ask. Ask a question people want to answer instead. This one compounds, since the same behaviour also drives the not-interested signal that costs 43.2 points in the ranking weights X published.
DMCA_WITHHELDcriticalWithheld for copyright
A copyright holder filed a DMCA notice and the post or its media was withheld. This is a legal process, not an algorithmic one.
Fix: X emails the account when a notice lands. A counter-notice is the only route, and it is a legal filing with real consequences. Repeated notices lead to account-level action, so do not repost the media in the meantime.
FOSNR_*highfamily documented, names inferredFreedom of Speech, Not Reach
The FOSNR prefix is X public enforcement approach: instead of removing a post that breaks a rule, X restricts how far it travels and leaves it up behind a notice. The post is excluded from For You, search, trends and recommended notifications, and replies to it are usually collapsed.
Fix: Every FOSNR label has an appeal on the post itself, and the appeal is worth filing because a human review is the only thing that lifts it. While it is applied, do not delete and repost the same content, since that reads as evasion and escalates to account-level action.
X has documented the Freedom of Speech Not Reach approach. It has not published the list of per-policy label names in this export, so the suffix below is read from the key itself rather than from documentation.
Account states
ReadOnlycriticalRead only
The account can read, but cannot post, reply, like or repost. It is a temporary lock applied after a policy strike or an automated abuse detection.
Fix: Open x.com while logged in. A read-only lock almost always has a challenge attached, usually a phone or email verification, and completing it lifts the state. If there is no challenge, the lock is timed and there is an appeal form on the notice.
CompromisedcriticalCompromised
X believes the account credentials leaked or someone else got in. Access is restricted until you prove otherwise.
Fix: Change the password to one you have never used anywhere else, revoke every third-party app under Settings, Security and account access, Apps and sessions, then turn on two-factor authentication. Do that before appealing, because the appeal asks whether you have.
NsfwHighRecallhighAccount marked adult, wide net
The whole account, not one post, is treated as an adult-content account. Everything you post gets filtered out of search and recommendations for people who have not opted in, which is what most people mean when they say they have been shadowbanned.
Fix: Check the avatar, banner and bio first, since account-level signals come from the profile as often as from posts. If you do post adult content, set the account-level sensitive-media flag in Settings, which is the supported way to do it and stops the state reading as evasion. Otherwise appeal, and expect it to take longer to clear than a per-post label.
NsfwHighPrecisionhighinferredAccount marked adult, high confidence
Reads as the account-level version of the confident adult-content classification. Same effect as the wide-net state, applied on stronger evidence.
Fix: Same route as the wide-net state. Clean the profile first, then appeal.
BouncedcriticalinferredBounced
Reads as the state where X is holding the account until you do something specific: delete a flagged post, verify a phone number, or acknowledge a policy notice.
Fix: Log in on the web rather than a third-party client. The required action is shown on the interstitial, and third-party clients often cannot render it, which is why accounts sit in this state for weeks without the owner seeing why.
LockedcriticalinferredLocked
Reads as a lock pending verification. Similar effect to read only, usually cleared by a challenge.
Fix: Complete the verification prompt at x.com. If none appears, use the account access help form.
SuspendedcriticalSuspended
The account has been suspended and is not visible publicly.
Fix: Appeal through the suspension notice or the help form. Nothing else changes a suspension, and creating a replacement account while suspended is itself a violation.
DeactivatedlowDeactivated
The account was deactivated by its owner. This is not an enforcement state.
Fix: Log in within the reactivation window to restore the account. Nothing to appeal.
Where we are honest about not knowing
X published the Under the Hood pilot with the label names in the file but without a dictionary explaining them. Some names map to safety labels X has described elsewhere. Others do not, and the only truthful thing to say about those is that the name is suggestive and the definition is not published.
So the decoder marks every entry. Documented means the label is named in material X has published. Inferred means we are reading the key and X stated policy. A key we have never seen is shown with its raw name and an explicit statement that we cannot explain it, because a made-up definition on a page like this would cost you an appeal.
The pilot schema can also change without notice. The parser is written to survive that: it walks whatever structure it is given, handles an object or an array at the root, tolerates missing fields, and tells you what it saw rather than showing an empty screen.
Most reach problems are not labels
If your file came back clean, the usual cause is posting that stopped being consistent. OpenTweet schedules your posts, recycles the ones that worked, and lets an AI agent post through the API or MCP.
7-day free trial, then $11.99/mo. Cancel anytime.
Under the Hood FAQ
What is X Under the Hood?
It is a pilot X started on 2026-08-13 that lets an eligible account download a .json file listing the visibility labels applied to its posts and the states applied to the account itself. Eligibility in the pilot is an account at least one year old with at least 10 posts in the last month, and the pilot is not open to every account.
How do I download my Under the Hood file?
On x.com, open Settings and privacy, then Your account, then look for Under the Hood in the account information area. If your account is in the pilot there is a download control there that produces a .json file. If you do not see the entry, your account is not in the pilot yet, and there is no way to request it.
Is my file uploaded anywhere?
No. The decoder parses the JSON in your own browser using client-side JavaScript. There is no upload, no server request, no logging and no X API call. You can turn off your network connection after the page loads and it still works.
What does NSFW_HIGH_PRECISION mean?
An automated classifier is confident the post contains adult nudity or sexual content. The post stays up but is held back from For You, search and trends for anyone who has not opted into sensitive media. The high recall variant is the same question with a much lower bar, so it produces far more false positives and is the one most worth appealing.
What does a FOSNR label mean?
FOSNR stands for Freedom of Speech, Not Reach, which is X public approach of restricting a rule-breaking post rather than removing it. The post stays up behind a notice, and it is excluded from For You, search, trends and recommended notifications. X has documented the approach but has not published the list of per-policy label names, so the decoder reads the suffix from the key and says so.
What does the ReadOnly account state mean?
The account can read but cannot post, reply, like or repost. It is a temporary lock, usually applied after a policy strike or an automated abuse detection, and it normally has a challenge attached such as a phone verification. Completing the challenge at x.com lifts it. Compromised means X believes your credentials leaked and needs a password reset plus revoked app access before it clears.
What if the decoder does not recognise a label in my file?
It shows the raw key exactly as it appears in your file and says plainly that there is no explanation for it yet, rather than hiding it or inventing a meaning. This is a pilot export and the schema is expected to change, so an unknown key is a normal outcome and not a sign the file is broken.
Related free tools
Shadowban Check
Test the symptoms directly if you cannot get the export.
X Algorithm Score Calculator
Score a post with the weights X open-sourced on 2026-08-13.
Tweet Algorithm Scorer
Check a draft for the wording that draws spam labels.
Character Counter
Count a post the way X counts it, links included.
Best Time to Post
Space posts out instead of bunching them into a spam-shaped burst.
How to grow on X
What to do once the labels are cleared.