Skip to main content
import { createClient } from "@mailsai/sdk";

const client = createClient(); // reads MAILS_API_KEY

const result = await client.messages.appeal({
  agent: "hello",
  subject: "Checking in on order #10473",
  body_text: "Your order #10473 was delivered.",
});
console.log(result);
{
  "outcome": "overturned",
  "message": "<message>",
  "review_score": 0,
  "reason": "<reason>",
  "replayed": false
}

Appeal a cold-firewall refusal

Requests a second, independent review of content refused with cold_email_prohibited.
POST/v1/messages/appealscope · send
import { createClient } from "@mailsai/sdk";

const client = createClient(); // reads MAILS_API_KEY

const result = await client.messages.appeal({
  agent: "hello",
  subject: "Checking in on order #10473",
  body_text: "Your order #10473 was delivered.",
});
console.log(result);
{
  "outcome": "overturned",
  "message": "<message>",
  "review_score": 0,
  "reason": "<reason>",
  "replayed": false
}

Body Parameters

agentstring

Agent name or id the refused send used. Optional — omitted, the workspace's single agent is assumed (the refused send itself created one if none existed).

subjectstring

The refused message's subject, verbatim.

body_textstring

The refused message's body_text, verbatim.

body_htmlstring

The refused message's body_html, verbatim.

Submit the SAME subject and body the refused send used. An independent reviewer re-judges it under the identical policy: overturned clears exactly that content for 24 hours (the identical send then goes through); upheld means the refusal stands; not_appealable means the block is deterministic policy (prohibited content, bulk list language, multi-signal cold pitches) and no review exists; not_blocked means the content is not refused at all. Identical content replays its stored outcome — an appeal is never a re-roll. Limit: 10 appeals per workspace per 24 hours.

Response

outcomestring

Result of the review: overturned (the same subject and body go through for the next 24 hours), upheld (the refusal stands), not_appealable (a policy block no review can lift) or not_blocked (the content is not refused; send it as it is).

One of: overturned, upheld, not_appealable, not_blocked

messagestring

Human-readable explanation of the outcome and what to do next.

review_scorenumber

The second reviewer's cold score (0 = clearly transactional, 1 = clearly cold). Absent for not_appealable/not_blocked.

reasonstring

The reviewer's one-line reason, when a review ran.

replayedboolean

True when this outcome was served from a prior appeal of identical content.

Was this page helpful?