Preview: SendMock has no stable release yet. These docs follow develop.
SendMock

Settings

How SendMock behaves. Retention, the seed file, email and SMS outcomes, payments, notifications, chaos, OTP patterns and connection snippets.

Try it in the demo.

Settings decide how every capture menu behaves. They take effect at once, without a restart.

The Settings screen

What it solves

SectionSolves
Generalthe database growing forever; starting clean
Seedthe same setup for every teammate and every CI run
Projectsseveral apps or developers sharing one SendMock without reading each other's mail, SMS and codes
Emailbounce and complaint tests, reply domains, safe release to real SMTP
SMSfailure and delay tests, matching Twilio's test credentials
Paymentsthe merchant name, currency, automatic outcomes for automated tests, the test values to type
Notificationspop-ups while you work, or the bell only
Opened eventstesting read receipts and open tracking
Chaostesting your app when the mail server rejects, is slow or drops the connection
OTP patternsyour app's code format is not found by default
Connectionthe exact settings your app needs, per language and per place it runs
Aboutversion, listeners and updates

How it connects

Gets fromSends to
your choices, or the seed fileMail: outcome addresses, delivery profile, inbound domains, relay
SMS: simulation profile, failure rate, outcome numbers
Payments: merchant name, currency, automatic outcome
every screen: retention, notifications, opened events, OTP patterns

Use it

  1. Press G , and pick a section on the left (a picker on phones). The section is kept in the URL, for example /settings?section=sms.
  2. Change a value. Save changes turns on; Discard puts the old values back.
  3. Press Save changes. Invalid values show a message under the field.

Everything on this screen

General

Retention:

  • Keep at most a number of emails and a number of SMS (1,000 each by default). Older traffic is pruned every few seconds once a limit is reached, and open lists, their counts and the sidebar badges update as soon as it is.
  • The email count also bounds SMTP sessions, logged API requests, HTTP catcher requests and finished webhook deliveries; the SMS count bounds verifications and push notifications.
  • Delete traffic older than a number of days, or Keep forever.
  • 0 means no limit. With no age limit either, a warning shows: the database grows until the disk is full, so a fixed limit is recommended. See How much is kept.
  • Configuration (endpoints, rules, templates, variables, saved deliveries, numbers, providers), deliveries still waiting to be sent and payments are never pruned, and the database file gives the freed space back.

Danger zone: Delete all emails, Delete all SMS and Reset to seed (deletes all traffic and restores the seed file), each asking first.

Seed

The seed file (sendmock.seed.toml) is the configuration SendMock starts from and resets to, kept in your repository. The card shows its path, when it was applied, and what changed since. Export downloads the current configuration (secrets written as ${ENV_VAR} references, never in plain text). Apply a seed file takes an upload or pasted text; Validate lists errors with line numbers and a summary of the changes before you confirm. See Advanced: seed file.

Projects

A project keeps captured emails, SMS and verifications apart inside one SendMock; settings, providers, webhooks and rules stay shared. Default always exists and holds everything sent to no other project. The table shows each project's name, key and how many emails, SMS and codes it holds, with Rename (the key never changes) and Delete (its traffic goes with it, after asking). New project asks for a key (lowercase letters, digits and dashes) and a name.

Apps send to a project by its key, one of three ways, shown with copy buttons under the table:

  1. Over SMTP, use the key as the AUTH username (any password). Other usernames go to Default.
  2. On the REST or provider APIs, add the header X-SendMock-Project: <key>.
  3. For a provider SDK that takes a base URL but no extra header, put /projects/<key> after the base URL, such as http://127.0.0.1:8026/projects/shop.

A key that is not a project is refused with 404 on the APIs, so a typo shows at once. Once a second project exists, a Project picker appears in the top bar: pick one and Mail, SMS and Verify show only its traffic, and pop-ups only its events. The choice stays in the URL (?project=shop) as you move between screens. Every list in the API, CLI and MCP takes the same project filter, and webhook rules can filter on project.

Email

  • Receiving and delivery outcomes: Tag by plus address ([email protected] gets the tag invoice), the delivery profile (Off, Auto-delivered, Realistic with a Bounce rate and Complaint rate), Inbound domains (mail to them arrives as incoming, for inbound routes) and SpamAssassin address (empty means no spam score).
  • Magic addresses: the switch, and the reference table of the SES simulator and SendMock addresses (Outcomes).
  • Custom outcome addresses: your own rules, with Test an address (Advanced: email outcome addresses).
  • Release to real SMTP: Relay SMTP URL (password masked) and Allowed recipients; release stays off until the list has an entry (Release).
  • Tag rules: add a tag to arriving emails that match a filter (the webhook rule filter builder, with a preview of the last 50 emails), in order; each can be switched off, moved and deleted.
  • Auto-forward rules: release a real copy of matching arriving emails to fixed addresses, through the relay and only to allowed recipients; the email's Timeline says where it went, or why not.

SMS

  • Delivery simulation: the profile (Instant, Realistic, Manual), the Failure rate, Strict Twilio test mode (reject From numbers that are not Twilio test numbers with 21606).
  • Verify defaults: the Code length and Code lifetime new Verify services start with (including services your app creates through Twilio's API without a CodeLength), and a Fixed code for every service that has none of its own; empty means random codes.
  • Magic numbers: the switch, and the reference table of Twilio's test numbers and SendMock's after-send numbers (Delivery and test numbers).
  • Custom outcome numbers: your own rules, with Test a number, which says whether a rule, a magic number or the profile applies (Advanced: SMS outcome numbers).

Payments

Checkout: Merchant name (shown on checkout pages and in the {merchant} label), Default currency, and Automatic outcome for new hosted checkouts: Interactive (wait for the checkout page), Always succeed, Always decline, or Random with a Success rate. Test values: every enabled method's test cards, numbers, OTP, PIN or account, with the gateways offering it.

Notifications

Show pop-up toasts for new emails, SMS and failed webhook deliveries, and where they appear (top or bottom; left, center or right), with a preview. Off, the bell still counts and lists everything. Saved in this browser only.

Opened events

Fire opened events when I view messages: opening an email, or scrolling an SMS into view, counts as the recipient reading it and fires email.opened or sms.opened. Choose first open only or every open.

Chaos

Make SMTP fail on purpose: Reject the next N messages With code 421, 450, 550 or 552; Reject recipients matching a pattern with 550; Latency per SMTP command; Drop the connection during DATA. While any is on, the section list shows "Chaos on". SMS failures use the failure rate above. See Advanced: chaos.

OTP patterns

OTP patterns are regular expressions tried in order on every new email and SMS; the first capture group of the first match is the code. Add, remove, Restore defaults, and Try a message to see which pattern matched and the code it found. See Advanced: OTP patterns.

Connection

Connect your app: copy-ready settings for SMTP, the email API, SMS and the HTTP Catcher. Pick a Language (Laravel and PHP, Node.js, Python, Go, Java, Ruby, .NET, cURL) and Where does your app run? (this machine 127.0.0.1, a container talking to the host host.docker.internal, or the same Docker Compose project sendmock). Edit the request headers and the email and SMS bodies; every snippet follows as you type, and a value "{{file:invoice.pdf}}" is read and base64-encoded the way each language does it. Send this request under each body runs that email or SMS call against this SendMock, with your headers, so you see exactly what your app's call will do. The same content is in Connect your app.

AI agents (its own card): pick Claude Code, Codex, Cursor, Gemini CLI or VS Code to see the install command, the MCP configuration and where it goes, and Download the skill. See AI.

About

Version and channel, uptime, listeners (SMTP, HTTP and API, provider port), the database path and size, links to the changelog and docs, the help and feedback links, and Updates:

  • Check GitHub Releases for updates has three modes. Off (the default) never calls out. Manual checks only when you press Check for updates. Daily checks on start and once a day, and a new version shows once in the notification bell.
  • Stable installs are offered stable releases; beta installs the newer of the newest beta and the newest stable. Edge and development builds are offered nothing.
  • A found version shows its release date, its release notes and the upgrade command for how you installed SendMock (Homebrew, Scoop, Docker, the install script or npm), with a copy button. When SendMock does not know how it was installed, use the release page link.
  • A check is kept for 24 hours. When GitHub cannot be reached, it says "Could not check for updates" and tries again on the next check.

Every control and text, one by one: Settings in depth.

Customize

Settings are part of the seed file, so a team shares them: Advanced: seed file and Recipe: share your setup. To check a whole flow on every run, write a scenario.

From your code

Change a setting for one test, for example a 10% random SMS failure rate.

The examples call SendMock's REST API with each language's usual HTTP client and test framework. JavaScript, Go, Java, Rust, Ruby and C# use the small call helper shown under Test helper on their page in Connect your app.

settings=$(sendmock settings set --sms-failure-rate-percent 10 --json)

jq -e '.sms_failure_rate_percent == 10' <<<"$settings" >/dev/null

From the CLI, API and AI

Do thisCLIAPIMCP tool
readsendmock settings getGET /api/v1/settingssendmock_settings_get
change, chaos toosendmock settings setPATCH /api/v1/settingssendmock_settings_update
reset to seedsendmock reset --yesPOST /api/v1/resetsendmock_reset
seed statussendmock seed statusGET /api/v1/seed/statussendmock_seed_status
export the seedsendmock seed exportGET /api/v1/seed/exportsendmock_seed_export
validate a seed filesendmock seed validate <file>POST /api/v1/seed/validatesendmock_seed_validate
apply a seed filesendmock seed apply <file>POST /api/v1/seed/applysendmock_seed_apply
list projectssendmock projects listGET /api/v1/projectssendmock_project_list
add a projectsendmock projects createPOST /api/v1/projectssendmock_project_create
rename a projectsendmock projects update <projectKey>PATCH /api/v1/projects/{projectKey}sendmock_project_update
delete a project and its trafficsendmock projects delete <projectKey>DELETE /api/v1/projects/{projectKey}sendmock_project_delete
tag rulessendmock email tag-rules listGET /api/v1/tag-rulessendmock_tag_rule_list
add a tag rulesendmock email tag-rules createPOST /api/v1/tag-rulessendmock_tag_rule_create
auto-forward rulessendmock email forward-rules listGET /api/v1/forward-rulessendmock_forward_rule_list
add an auto-forward rulesendmock email forward-rules createPOST /api/v1/forward-rulessendmock_forward_rule_create
connection snippet for a stacksendmock integrate <stack>GET /api/v1/integrations/{stack}sendmock_integration_snippet
AI agent setupsendmock ai install --target <agent>GET /api/v1/ai/agentssendmock_ai_agents
the agent skillsendmock ai skillGET /api/v1/ai/skillsendmock://docs/skill
send a samplesendmock sample <kind>POST /api/v1/samples/{kind}sendmock_sample_send
check for updatessendmock update checkGET /api/v1/updatessendmock_update_check

On this page