Hi ServiceM8 team,
I’m developing an add-on that sends outbound emails on behalf of accounts via POST /platform_service_email. During testing today my account was placed into a quarantine state and I’d appreciate some help understanding why, how long it lasts, and what I should design my add-on to do about it.
The rejection I’m seeing
Every send is now returning:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"errorCode": 440,
"message": "Sending Email rejected due to Account in Quarantine",
"messageID": "4766022f-43c3-4688-ab58-241e000c197b",
"submittedAt": "2026-04-26T08:12:15+00:00"
}
Note this is HTTP 400 + errorCode 440 — distinct from the 429 rate-limit / quota path that’s documented in the Messaging Overview.
What I was doing when it triggered
Full transparency so you can see whether my pattern matches the trigger:
- Roughly a dozen sends over ~10 minutes
- Same recipient most of the time (my own personal address)
- Very short / repetitive subjects + bodies (
"test","sdf", occasional gibberish I was using to test how my add-on classifies spam-like content) - A few of the sends had attachments
I’m guessing it’s the combination of repeat recipient + repetitive content + burst rate from a freshly-active sender, but that’s purely a guess — and I clearly didn’t hit the documented 429 path, so this is something separate.
What I’d like to ask
About the quarantine itself
- Could you release the quarantine on my account so I can continue development? The
messageIDabove should let you find the exact rejection in your logs. - What actually triggered it? Was it the repeat recipient, the content similarity, the burst rate, the gibberish content being flagged as spam, or some combination? Even a rough description would let me adjust my testing approach and pre-empt it for customers.
- What’s the duration? Is
errorCode 440a rolling time window (like the documented Sending Quota), or does it require manual release every time? - Is there a soft signal before the hard block? Something my add-on could detect (“you’re approaching the quarantine threshold”) so I can warn the customer pre-emptively rather than just failing their send.
- What is the complete list of
errorCodevaluesplatform_service_emailcan return? I’m pretty sure I saw a different rejection earlier today that read like a content/spam flag rather than a quarantine, but I didn’t capture the body. A complete list would let me build proper error-handling and customer-facing messages instead of a generic “send failed”.
About sending quotas (the documented path)
The Messaging Overview describes the Sending Quota as a rolling 24-hour cap, with the example “if your email sending quota is 500…” — which leads to a few practical questions:
- Is 500/day the actual starting quota for new add-on installs, or just an illustrative figure in the docs? Knowing the real default would let me set sensible expectations with customers on day one.
- Is the quota per-add-on, per-account, or per-add-on-per-account? i.e. if my add-on is installed on 100 customer accounts, does each installation get its own 500/day, or is it shared across the add-on?
- Can my add-on read the current quota and remaining headroom? Right now I have no programmatic way to know how close a customer is to their cap until they get the
429. Two suggestions, easiest first:a. Return quota headers on every successfulplatform_service_emailresponse, e.g.
X-SM8-Quota-Limit: 500
X-SM8-Quota-Remaining: 347
X-SM8-Quota-Reset: 2026-04-27T08:12:15Z
This is the standard pattern (GitHub, Stripe, AWS API Gateway all do this) and would let add-ons surface a “you have 153 sends left today” indicator without a separate API call.b. Return the quota numbers in the 429 response body too, so add-ons can give customers a precise “your 500/day cap will reset in 6 hours” message instead of a generic “rate-limited” toast.Would either of these be considered for a future API revision? Even just (a) on success responses would dramatically improve add-on UX.
9. Are there per-account daily caps distinct from the per-add-on quota? Specifically for platform_service_email?
Documentation feedback
Just to flag the gap I ran into — neither /reference/send_email nor /docs/http-response-codes currently mention errorCode 440, “Account in Quarantine”, or any anti-spam hold. The send_email reference only documents 200, 400, and 429. Adding 440 (and any other codes from question 5) to the public docs would let add-on developers like me build sensible UX around them.
Why this matters for my add-on
When my add-on ships to customers, they’ll occasionally hit both paths — quotas from heavy legitimate usage, and quarantine if their content/sending pattern looks suspicious. If I can’t translate errorCode 440 (or even a 429) into a meaningful, actionable message — “your ServiceM8 account is temporarily restricted; here’s why, here’s when it clears” — they’ll blame my add-on for what’s actually a platform-level block. Clarity on items 2–9 above lets me get that customer experience right.
Thanks!
Dave