Outbound sending
Sending covers the other half of email testing: exercising the code that receives mail, checking a reply flow, or driving a mail client with realistic traffic.
Before the first send
Section titled “Before the first send”- Business plan. Outbound is off on the Free plan.
- Enable it on the mailbox under Settings → Outbound.
- A verified sending identity. The
fromaddress must use a domain verified in the workspace. Ask support to verify yours. - Recipient allowlist. Each mailbox keeps a list of addresses and
*.domainpatterns it may send to. Anything else is refused with422. This is what stops a test suite emailing real customers. - Wallet balance. Sends cost $0.50 per 1,000 emails, debited from the prepaid wallet under Workspace settings → Billing.
Sending
Section titled “Sending”POST /v1/mailboxes/{mailboxId}/sendconst result = await mc.send(mailboxId, { from: "noreply@acme.send.mailcatchr.com", to: "qa@acme-ci.mailcatchr.com", subject: "Welcome", textBody: "Hi there",});// result.status === "queued"; result.messageId is the message's id in the mailboxcurl -X POST -H "Authorization: Bearer $MAILCATCHR_API_KEY" \ -H "Content-Type: application/json" -H "Idempotency-Key: $(uuidgen)" \ -d '{"from":"noreply@acme.send.mailcatchr.com","to":"qa@acme-ci.mailcatchr.com","subject":"Welcome","textBody":"Hi there"}' \ "https://api.mailcatchr.com/v1/mailboxes/$MAILBOX_ID/send"The API answers 202 as soon as the send is queued. Delivery is asynchronous; bounces and complaints arrive as mail notifications. Send an Idempotency-Key so a retried request does not send twice.
Suppression list
Section titled “Suppression list”Addresses that bounced or complained are added to a workspace-wide suppression list and refused on later sends with 422 suppressed_recipients. List and clear entries over the API:
GET /v1/workspaces/{workspaceId}/suppressionDELETE /v1/workspaces/{workspaceId}/suppression/{id}Errors
Section titled “Errors”See Errors for the full list. The ones a new setup hits first are 403 outbound_disabled, 422 invalid_from_domain and 402 insufficient_funds.