Microsoft 365 spam headers explained: how to read SFV, CAT, BCL and compauth
Microsoft 365 records its filtering decisions in three headers. X-Forefront-Antispam-Report holds the verdict (SFV), category (CAT), direction (DIR) and connecting IP (CIP). X-Microsoft-Antispam holds the bulk complaint level (BCL). Authentication-Results holds SPF, DKIM, DMARC and compauth. Read SFV and CAT first; Microsoft says SCL no longer decides the verdict.
On this page 10 sections
Every message that reaches a Microsoft 365 mailbox carries a record of what the filter decided and why. It sits in the message headers, written as short codes such as SFV:SKA or CAT:BULK. Once you can read those codes, most "why did this land in Junk?" and "why did this spam get through?" questions take a couple of minutes.
This guide lists the fields Microsoft documents, what each value means, and the order to read them in. For headers in general, including the Received chain, start with how to read email headers.
How do you see message headers in Outlook?
Microsoft's Outlook support article gives these steps:
| Client | Steps |
|---|---|
| New Outlook for Windows | Select More actions at the top of the message, then View > View message details |
| Outlook on the web and Outlook.com | Select More actions, then View > View message details |
| Classic Outlook for Windows | Double-click to open the message in its own window, then File > Properties. Headers are in the Internet headers box |
Copy the whole block. Then paste it into our Email Header Analyzer, which splits the fields out and runs in your browser, so the headers aren't uploaded.
If a user forwards you a message, the headers belong to the forward. Ask for it as an attachment instead.
Which headers does Microsoft 365 add?
Microsoft 365 scans all incoming mail and writes its results into three headers (Microsoft Learn):
| Header | What it records |
|---|---|
X-Forefront-Antispam-Report |
The verdict and how the message was processed: SFV, CAT, DIR, CIP and more |
X-Microsoft-Antispam |
Bulk mail information, chiefly the bulk complaint level (BCL) |
Authentication-Results |
SPF, DKIM, DMARC and Microsoft's composite authentication result (compauth) |
A fourth, X-CustomSpam, appears only when an Advanced Spam Filter setting flags the message. More on that below.
Microsoft notes that the antispam report contains many fields it doesn't document. Those are "used exclusively by the Microsoft anti-spam team for diagnostic purposes," so don't try to interpret them.
What does each X-Forefront-Antispam-Report field mean?
The header is a list of FIELD:value pairs separated by semicolons. A real one looks like Microsoft's example:
X-Forefront-Antispam-Report: CIP:198.51.100.50;CTRY:US;LANG:en;
SFV:SPM;IPV:NLI;SRV:;H:mail.adatum.com;PTR:mail.adatum.com;
CAT:SPM;SFTY:;DIR:INB;
These are the documented fields:
| Field | Meaning |
|---|---|
CIP |
Connecting IP address |
CTRY |
Country or region of the connecting IP, which may differ from the original sender's |
H |
The HELO or EHLO name the connecting server used |
PTR |
Reverse DNS (PTR record) of the source IP |
LANG |
Language the message was written in |
DIR |
Direction: INB inbound, OUT outbound, INT internal |
IPV |
IP verdict: CAL means the IP is in your IP Allow List; NLI means it wasn't on any IP reputation list |
SFV |
Spam filtering verdict (see the next table) |
CAT |
The category of protection applied (see below) |
SRV:BULK |
Identified as bulk mail at your BCL threshold |
SFTY |
Phishing safety markers: 9.19 domain impersonation, 9.20 user impersonation, 9.25 first contact safety tip |
SCL |
Spam confidence level; not the verdict in cloud organizations |
ARC |
Authenticated Received Chain details, including the chain validation result (cv=) |
Watch CIP if your MX points to a filtering gateway. If it shows the gateway's IP rather than the original sender's, Microsoft is judging the gateway. Enhanced Filtering for Connectors fixes that.
What do the SFV values mean?
SFV is the field that tells you which component decided the message's fate. Microsoft's troubleshooting guide maps each value to its source:
| Value | Decided by | Meaning |
|---|---|---|
SFV:NSPM |
Spam filter | Not spam; delivered to the intended recipients |
SFV:SPM |
Spam filter | Marked as spam |
SFV:SKA |
Anti-spam policy allow list | Skipped filtering: allowed sender or domain |
SFV:SKB |
Anti-spam policy block list | Marked as spam: blocked sender or domain |
SFV:SKI |
Connection filter | Skipped filtering: source IP in the IP Allow List (look for IPV:CAL too) |
SFV:SKN |
Mail flow rule | Skipped spam filtering because a rule set SCL to -1 |
SFV:SKS |
Mail flow rule or on-premises Exchange | Marked as spam before filtering, and the request was honored |
SFV:SFE |
User's Safe Senders list | Skipped filtering |
SFV:BLK |
User's Blocked Senders list | Blocked |
SFV:SKQ |
Quarantine | Released from quarantine |
The "skipped" values (SKA, SKI, SKN, SFE) are the ones to look for when spam reaches the inbox. Our guide to spam getting through Microsoft 365 shows how to remove each kind of allow.
What do the CAT values mean?
CAT names the type of protection that applied. When several detections fire, the highest-priority policy wins (Microsoft Learn).
| CAT | Category | CAT | Category |
|---|---|---|---|
SPM |
Spam | MALW |
Malware |
HSPM |
High confidence spam | AMP |
Anti-malware |
PHSH |
Phishing | FTBP |
Common attachments filter |
HPHSH or HPHISH |
High confidence phishing | SAP |
Safe Attachments* |
SPOOF |
Spoofing | UIMP |
User impersonation* |
BULK |
Bulk | DIMP |
Domain impersonation* |
INTOS |
Intra-organization phishing | GIMP |
Mailbox intelligence impersonation* |
OSPM |
Outbound spam | BIMP |
Brand impersonation* |
* Defender for Office 365 only.
Why shouldn't you trust the SCL number?
SCL (spam confidence level) runs from -1 to 9, and older advice says 5 or above means spam. Microsoft now says the value "doesn't determine whether spam filtering identifies a message as Spam or High confidence spam, and it doesn't determine the action taken on the message" (Microsoft Learn). The same SCL can appear on messages with different verdicts. Use CAT and DIR instead.
SCL still matters in two places: mail flow rules that request a bypass (-1) or a spam verdict (5, 6 or 9), and on-premises or hybrid Exchange, where Junk Email thresholds use it. Even when a rule requests -1, the stamped value may be 0 or 1.
What do BCL and SRV:BULK mean?
The bulk complaint level, in X-Microsoft-Antispam, rates how likely a bulk sender's mail is to draw complaints (Microsoft Learn):
| BCL | Meaning |
|---|---|
| 0 | Not from a bulk sender |
| 1 to 3 | Bulk sender with few complaints |
| 4 to 7 | Bulk sender with a mixed number of complaints |
| 8 or 9 | Bulk sender with a high number of complaints |
Mail at or above your policy's threshold gets SRV:BULK and the bulk action. The threshold is 7 in the default policy, 6 in the Standard preset and 5 in Strict. If newsletters people want keep landing in Junk, a BCL just over your threshold is the usual reason.
What does an X-CustomSpam header mean?
X-CustomSpam means one of the Advanced Spam Filter (ASF) settings in your anti-spam policy matched. The value names it: Web bug, SPF Record Fail, Image links to remote sites and so on (Microsoft Learn).
These settings are off by default, and Microsoft calls them "an aggressive approach to spam filtering." Its troubleshooting guide adds that Microsoft "no longer recommends enabling ASF settings." Two practical limits: ASF detections can't be reported to Microsoft as false positives, and the header is added after mail flow rules run, so a rule can't act on it. If a legitimate message carries X-CustomSpam, turn that setting off. To see which ones are on:
Get-HostedContentFilterPolicy `
| Format-Table Identity, MarkAsSpam*, IncreaseScoreWith* -AutoSize
How do you read Authentication-Results and compauth?
Microsoft writes SPF, DKIM and DMARC results into Authentication-Results, the header defined in RFC 8601. A typical failure:
Authentication-Results: spf=fail (sender IP is 198.51.100.77)
smtp.mailfrom=fabrikam.com; dkim=none;
dmarc=fail action=quarantine header.from=fabrikam.com;
compauth=fail reason=000
Compare the three domains: smtp.mailfrom (checked by SPF), header.d (the DKIM signer) and header.from (what the reader sees). DMARC passes when SPF or DKIM passes for a domain aligned with header.from. Our SPF vs DKIM vs DMARC guide explains alignment.
Two Microsoft-specific values matter here. dmarc=bestguesspass means the domain has no DMARC record, but would pass if it had one. In action, oreject means the sender published p=reject. Whether Microsoft then rejected the message or sent it to Junk depends on the recipient's Honor DMARC record policy setting in its anti-phishing policy (Microsoft Learn).
compauth is Microsoft's composite verdict: pass, fail, softpass or none. It uses the From domain and blends SPF, DKIM, DMARC and other signals. Microsoft notes that a message can be allowed "despite a compauth failure" if nothing else looks suspicious. The reason code tells you why:
| Reason | Result | Meaning |
|---|---|---|
000 |
fail | Explicit DMARC failure; the sender's policy is quarantine or reject |
001 |
fail | Implicit failure: no records, or weak ones (~all, ?all, p=none) |
002 |
fail | Your organization explicitly prohibits this sender/domain pair from spoofing |
010 |
fail | DMARC failure on one of your own accepted domains |
100 to 104 |
pass | Aligned SPF or DKIM, or PTR alignment |
130 |
pass | A trusted ARC sealer overrode the DMARC failure |
2xx |
softpass | Implicit soft pass |
601 |
fail | The sending domain is one of your accepted domains (self-to-self spoofing) |
701 to 704 |
pass | DMARC not enforced because of a history of legitimate mail from that infrastructure |
905 |
none | DMARC not enforced because of complex routing, such as mail passing through a non-Microsoft service first |
If 905 appears on all your inbound mail, look at your routing before you look at the senders. And if the failing domain is your own, our guide to why DMARC fails covers the common causes.
How do you find out what filtered a message?
Microsoft's troubleshooting guide suggests this order:
- Get the full headers from the original message, using the steps above.
- Read SFV. It names the component: spam filter, an allow or block list, a mail flow rule or quarantine.
- Check IPV.
IPV:CALalongsideSFV:SKIconfirms the IP Allow List skipped filtering. - Look for X-CustomSpam. If present, an ASF setting triggered.
- Read CAT. It tells you whether spam, bulk, phishing, spoofing or malware protection acted.
CAT:HPHSHcan't be overridden by allow lists. - Check compauth.
compauth=failwithCAT:SPOOFpoints at sender authentication, not content. - Check BCL. If
SRV:BULKis present, compare the BCL with your policy threshold. - Confirm the user-level lists if SFV shows
SFEorBLK:
Get-MailboxJunkEmailConfiguration -Identity "user@example.com" `
| Select-Object TrustedSendersAndDomains, BlockedSendersAndDomains
Microsoft also offers a built-in diagnostic, Run Tests: Email Threat Policies (https://aka.ms/mdopolicy), which lists the policies that apply to a recipient and the inbound connector used.
What do common header combinations tell you?
| You see | Most likely cause | What to do |
|---|---|---|
SFV:SKA on spam |
Allowed sender or domain in an anti-spam policy | Remove it; use the Tenant Allow/Block List for narrow exceptions |
SFV:SKN on spam |
A mail flow rule sets SCL -1 too broadly | Narrow or remove the rule (see security mail flow rules) |
SFV:SFE on spam |
The user added the sender to Safe Senders | Clean up the user's list |
SFV:SPM with X-CustomSpam on good mail |
An ASF setting | Turn that ASF setting off |
SRV:BULK on a wanted newsletter |
BCL at or above your threshold | Allow the sender narrowly, or accept Junk delivery |
CAT:SPOOF with compauth=fail reason=000 |
The sender's DMARC failed with an enforcing policy | Ask the sender to fix authentication |
SFV:SKB or SFV:BLK on good mail |
A block list entry | Review admin and user block lists (see blocking senders) |
For good mail landing in Junk without any of these signs, our guide to Microsoft 365 emails going to Junk goes further. Don't respond to SKA or SFE problems by adding more allows. Our guide to whitelisting senders safely explains narrower options.
Next steps
- Pull the headers from one message you know is fine and one that was misfiled, and compare their SFV, CAT and compauth values.
- Paste both into the free Email Header Analyzer. It runs in your browser.
- If you see
X-CustomSpamon legitimate mail, list your ASF settings with the PowerShell above and turn off the ones you don't need. - If inbound mail passes through a gateway (iBlockSpam or another), check that
CIPshows the real sender and that compauth isn't905on everything. - Check your own domain's records with the DMARC Checker, so mail you send reads
compauth=passat the other end.
Browse more guides on running email day to day.
Frequently asked questions
What does CAT:SPOOF mean in a Microsoft 365 header?
CAT:SPOOF means anti-spoofing protection, not the content filter, decided what happened to the message. It usually appears with a compauth failure in Authentication-Results, for example reason 000 when the sender's DMARC policy is quarantine or reject. Check the sender's SPF, DKIM and DMARC before you allow anything.
What do BCL values mean in Microsoft 365?
BCL is the bulk complaint level in the X-Microsoft-Antispam header. 0 means the message isn't from a bulk sender, 1 to 3 means few complaints, 4 to 7 a mixed number and 8 or 9 a high number. Mail at or above your policy's threshold, 7 by default, is treated as bulk.
What does X-CustomSpam mean in an email header?
It means an Advanced Spam Filter setting in your anti-spam policy flagged the message, and the value names the setting, such as Web bug. These settings are off by default, Microsoft no longer recommends them, and ASF detections can't be reported to Microsoft as false positives. Turn off the setting that caused the problem.
Is compauth=fail the same as dmarc=fail?
No. dmarc is the result of the sender's own DMARC check. compauth is Microsoft's composite result, which combines SPF, DKIM, DMARC and other signals about the From domain. A message can get compauth=fail with no DMARC record at all, and Microsoft says a compauth failure doesn't always mean the message is blocked.
Can a mail flow rule skip high confidence phishing filtering?
No. Microsoft says a rule that sets SCL to -1 overrides spam filtering only. Malware is always quarantined, and high confidence phishing is too, unless your MX records don't point to Microsoft 365 and an SCL -1 rule is in place. Allow lists can't override a CAT:HPHSH verdict either.
Sources
- Microsoft Learn: Anti-spam message headers
- Microsoft Learn: Troubleshoot anti-spam policies
- Microsoft Learn: Spam confidence level (SCL)
- Microsoft Learn: Bulk email detection and the bulk complaint level (BCL)
- Microsoft Learn: ASF settings in anti-spam policies
- Microsoft Support: View internet message headers in Outlook
- RFC 8601: Message Header Field for Indicating Message Authentication Status
See how your domain measures up
Run a free Email Health Check: MX, SPF, DKIM, DMARC and transport security in one scan, with the raw records shown. No sign-up.
Keep reading
How to read email headers
Read email headers step by step: the Received chain from the bottom up, Authentication-Results, ARC, Return-Path, Message-ID and Microsoft 365 anti-spam fields.
10 min read Running email day to dayWhy are legitimate emails going to Junk in Microsoft 365, and how do you fix it?
Why legitimate email lands in Junk in Outlook and Microsoft 365: user lists, bulk scores, spoof checks and sender authentication. Diagnose from headers and fix.
9 min read Running email day to dayHow do you safely whitelist a sender in Microsoft 365 and Google Workspace?
Safely allow (whitelist) a sender in Microsoft 365 and Google Workspace without opening a spoofing hole: Tenant Allow/Block List, approved senders and gateways.
9 min read