Mailer REST API¶
The REST transport addresses a module method by HTTP method and path. It is the entry point for the CRM interface, the backoffice, mobile applications, provider event callbacks and unsubscribe links.
The same methods are available over TCP by command name — see TCP API. Request fields and results are identical; only the addressing differs.
Base URL¶
https://{broker_domain}/mailer/...
All paths of the module live under mailer/. The prefix is what keeps the module apart from
the other modules sharing the same host — including the two public paths, the provider webhook
and the unsubscribe endpoint.
Authorization¶
Every endpoint except the two public ones requires a manager JWT:
Authorization: <JWT_TOKEN>
The platform resolves the token and passes the identity to the module. The brand and the author of a record always come from the token, never from the request body.
Two endpoints are public by necessity:
| Endpoint | Why it is public | What protects it |
|---|---|---|
POST mailer/handleWebhooks/:uuid |
called by the email provider | unguessable uuid plus a signature check against the webhook secret |
POST mailer/unsubscribe |
called by the recipient or their mail client | HMAC-signed token carrying the address, brand and expiry |
Endpoints¶
| Method | Endpoint | Access |
|---|---|---|
| MailerSendEmail | POST mailer/email |
admin, leader, manager |
| MailerSendBulk | POST mailer/email/bulk |
admin, leader |
| MailerResendEmail | POST mailer/email/resend |
admin, leader, manager |
| MailerCancelEmail | POST mailer/email/cancel |
admin, leader, manager |
| MailerPreviewEmail | POST mailer/email/preview |
admin, leader, manager |
| MailerLintEmail | POST mailer/email/lint |
admin, leader |
| MailerSendTestEmail | POST mailer/email/test |
admin, leader |
| MailerFindEmail | GET mailer/email/find |
admin, leader |
| MailerGetEmail | GET mailer/email/message/:id |
admin, leader, manager |
| MailerGetEmails | GET mailer/emails/list |
admin, leader, manager |
| MailerGetStats | GET mailer/email/stats |
admin, leader |
| MailerAddCampaign | POST mailer/campaign |
admin, leader |
| MailerUpdateCampaign | PUT mailer/campaign |
admin, leader |
| MailerCancelCampaign | POST mailer/campaign/cancel |
admin, leader |
| MailerResumeCampaign | POST mailer/campaign/resume |
admin, leader |
| MailerEstimateCampaignRecipients | POST mailer/campaign/estimate-recipients |
admin, leader |
| MailerDeleteCampaign | DELETE mailer/campaign |
admin, leader |
| MailerGetCampaigns | GET mailer/campaigns/list |
admin, leader |
| MailerAddTemplate | POST mailer/template |
admin |
| MailerUpdateTemplate | PUT mailer/template |
admin |
| MailerCloneTemplate | POST mailer/template/clone |
admin |
| MailerDeleteTemplate | DELETE mailer/template |
admin |
| MailerGetTemplates | GET mailer/templates/list |
admin, leader, manager |
| MailerAddTrigger | POST mailer/trigger |
admin |
| MailerUpdateTrigger | PUT mailer/trigger |
admin |
| MailerDeleteTrigger | DELETE mailer/trigger |
admin |
| MailerFireTrigger | POST mailer/trigger/fire |
admin |
| MailerGetTriggers | GET mailer/triggers/list |
admin |
| MailerGetTriggerSubscriptions | GET mailer/triggers/subscriptions |
admin |
| MailerGetProviderAdapters | GET mailer/providers/adapters |
admin, provider |
| MailerAddProvider | POST mailer/provider |
provider |
| MailerUpdateProvider | PUT mailer/provider |
provider |
| MailerDeleteProvider | DELETE mailer/provider |
provider |
| MailerGetProviders | GET mailer/providers/list |
admin, provider |
| MailerAddProfile | POST mailer/providerProfile |
admin |
| MailerUpdateProfile | PUT mailer/providerProfile |
admin |
| MailerDeleteProfile | DELETE mailer/providerProfile |
admin |
| MailerGetProfiles | GET mailer/providerProfiles/list |
admin |
| MailerGetMyProfiles | GET mailer/providerProfile/available/me |
admin, leader, manager |
| MailerGetProfileBalance | GET mailer/providerProfiles/balance |
admin |
| MailerVerifyProfileDomain | POST mailer/providerProfile/verify-domain |
admin |
| MailerAddAgent | POST mailer/agent |
admin |
| MailerUpdateAgent | PUT mailer/agent |
admin |
| MailerDeleteAgent | DELETE mailer/agent |
admin |
| MailerGetAgents | GET mailer/agents/list |
admin |
| MailerAddSuppression | POST mailer/suppression |
admin, leader |
| MailerImportSuppressions | POST mailer/suppression/import |
admin |
| MailerDeleteSuppression | DELETE mailer/suppression |
admin |
| MailerCheckSuppression | GET mailer/suppression/check |
admin, leader, manager |
| MailerGetSuppressions | GET mailer/suppressions/list |
admin, leader |
| MailerHandleUnsubscribe | POST mailer/unsubscribe |
public |
| MailerAddSendWindow | POST mailer/sendWindow |
admin |
| MailerUpdateSendWindow | PUT mailer/sendWindow |
admin |
| MailerDeleteSendWindow | DELETE mailer/sendWindow |
admin |
| MailerCheckSendWindow | GET mailer/sendWindow/check |
admin, leader, manager |
| MailerGetSendWindows | GET mailer/sendWindows/list |
admin, leader |
| MailerAddWebhook | POST mailer/webhook |
admin |
| MailerUpdateWebhook | PUT mailer/webhook |
admin |
| MailerDeleteWebhook | DELETE mailer/webhook |
admin |
| MailerGetWebhooks | GET mailer/webhooks/list |
admin |
| MailerGetWebhookEvents | GET mailer/webhookEvents/list |
admin |
| MailerHandleWebhook | POST mailer/handleWebhooks/:uuid |
public |
| MailerPing | GET mailer/ping |
admin |
| MailerHealth | GET mailer/health |
admin |
MailerGetLastEmailsByParents has no REST route: it is an internal method for CRM lists and is
available over the bus only.
List queries¶
Every */list method accepts the same query contract:
| Field | Type | Description |
|---|---|---|
limit |
int | Page size, 1..1000, default 100 |
offset |
int | Rows to skip |
orderBy |
array | ["id", "DESC"] |
groupBy |
array | Grouping, including date grouping such as DAY({field}) |
count, sum, min, max, avg |
array | Aggregates over the listed fields |
where, whereIn, whereLike, whereBetween, … |
object | Filters, including grouped orWhere |
Filter syntax is shared with the rest of the platform and is described in Table filter syntax.
The response is the requested page in rows, plus one key per requested aggregate:
{
"rows": [],
"count": [ { "id": 42 } ]
}
A row count is an aggregate, not a default: ask for it with count: ["id"] when the UI needs
paging. For deliverability reports use MailerGetStats — it
aggregates on the server instead of paging raw rows.
Status codes¶
| Code | Meaning |
|---|---|
200 |
Method succeeded |
400 |
Validation failed, or the request contradicts itself |
401 |
Missing or invalid JWT |
403 |
The manager may not touch this record, or the address is suppressed |
404 |
Email, profile, provider, template, campaign, or adapter not found |
409 |
Sending is not allowed: unsubscribe, recipient domain, duplicate, size, attachments |
422 |
Template content uses unsupported syntax |
429 |
Provider rate limit |
500 |
Module or storage error |
502 |
Module is unreachable on the bus |
503 |
Provider is unavailable |
On success the body is the method payload itself — there is no wrapper object to unwrap:
{ "emailId": 812, "status": "PENDING", "scheduleReason": "IMMEDIATE" }
On failure the HTTP status carries the outcome and the body is the message:
HTTP/1.1 403 Forbidden
"Address [email protected] is suppressed: HARD_BOUNCE"
Branch on the status code and show the message to the operator. The error type listed on each
method page names the same condition and appears in the module log; at the HTTP boundary the
status code is the machine-readable part.