Check before you send
Run the pre-send check on a message: a score, a verdict and the fix for each finding.
One call checks a message before you send it. Notix renders it the way a recipient would get it, runs a real spam filter over it, opens up to 20 of its links, and answers with a verdict, a score out of 100 and a list of findings with the fix for each.
The check is a request, not a send. It costs nothing.
Run the check
Send the From address, the subject, and either html or a templateId. Set marketing to true for newsletters and broadcasts.
curl -X POST https://app.usenotix.dev/api/v1/deliverability/check \
-H "Authorization: Bearer $NOTIX_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "news@acme.com",
"subject": "Your September update",
"html": "<p>Read the update.</p>",
"marketing": true
}'
import { Notix } from "notix-js";
const notix = new Notix(process.env.NOTIX_API_KEY);
const { data: report, error } = await notix.deliverability.check({
from: "news@acme.com",
subject: "Your September update",
html: "<p>Read the update.</p>",
marketing: true,
});
if (report?.verdict === "BLOCK") {
for (const finding of report.findings) {
console.error(`${finding.title}: ${finding.fix}`);
}
}
from notix import Notix
notix = Notix() # reads NOTIX_API_KEY
report, error = notix.deliverability.check({
"from": "news@acme.com",
"subject": "Your September update",
"html": "<p>Read the update.</p>",
"marketing": True,
})
use Notix\Notix;
$notix = new Notix(getenv('NOTIX_API_KEY'));
$report = $notix->deliverability->check([
'from' => 'news@acme.com',
'subject' => 'Your September update',
'html' => '<p>Read the update.</p>',
'marketing' => true,
]);
Send exactly one of html or templateId. With a template, pass its variables too.
Read the report
{
"verdict": "BLOCK",
"score": 40,
"findings": [
{
"id": "unsubscribe_missing",
"severity": "block",
"title": "The email has no unsubscribe link",
"detail": "Marketing email must give every recipient a way to unsubscribe.",
"fix": "Add the unsubscribe link block to the footer of this email."
}
],
"spam": { "available": true, "score": 2.4, "symbols": [] },
"checkedAt": "2026-10-05T12:00:00.000Z",
"budgetExceeded": []
}
| Field | Meaning |
|---|---|
verdict | BLOCK if any finding blocks, else WARN if any finding warns, else PASS. |
score | 0 to 100. Higher is better. |
findings | Block findings first, then warnings, then notes. Each has a fix. |
spam | The spam filter's score and the rules that matched. Higher is worse. |
budgetExceeded | Checks that did not finish in time. They neither block nor warn. |
If the spam filter cannot be reached, spam.available is false. A filter outage never blocks a send.
What blocks a send
Four findings block:
- Marketing content with no unsubscribe link anywhere in the body.
- A From address on a domain your team has not verified.
- A link whose host is a raw IP address instead of a name.
- A spam filter score of 10 or more, which means the message would be rejected.
Everything else warns or informs. Fix the warnings when you can, because they lower your score.
Broadcast sends and automation activations run this same check. They refuse anything it blocks, and a deliverability.blocked webhook event names the findings. Running the check yourself first gives you the answer before you get the error.
Check from the console
When you edit a template, a broadcast or an automation email, the console runs the same check and shows the findings next to the email. See Templates and library, Broadcasts and Automations.
The full field list is in the Check a message before sending reference.