# send_test_site_email

Source: https://modulify.ai/docs/api/emails/send-test-site-email

Sends one free test email from a site to the email address of the connected account, and to no other address.

- Title: Send a test email from a site
- Scope: `config:write`
- Access: Makes changes
- Endpoint: `POST /v1/send_test_site_email`

That address is the only one it can reach: it takes no recipient and cannot be pointed anywhere else. It proves that sending works and shows how the sender name and the sending address look once they land in an inbox. The tool tells the client to run it only when you ask for a test, never to check its own work, and never twice for one request.

It goes out through exactly the same path as the site's own mail and shows up in `list_site_email_sends` marked as a test, but a test is free. It uses none of the site's monthly sends, never buys an extra block, does not count toward the per minute limit, still goes out on a free plan whose 50 included sends are used up, and is left out of `get_site_email_stats`.

The one limit is 10 seconds between two tests from the same site. A test asked for sooner is refused with `429`, a `Retry-After` header and the wait in the message, for example `Wait 7 seconds before sending another test email!` It is also refused while sending is off or not available, while the site's own `EMAIL_URL` or `EMAIL_PRIVATE_KEY` secret keeps its email off, and when the account's own address, or its domain, is on the site's blocked list.

The answer has the same shape as the one `send_site_email` gives: the `id` and the `accepted` and `suppressed` recipients, or `code` and the reason it was refused, and a refusal for the pause between tests or a busy mail provider carries `Retry-After`. See [Send a test email](https://modulify.ai/docs/automations/emails#send-a-test-email).

## Request

Call it with a `POST` to `https://api.modulify.ai/v1/send_test_site_email`, sending the inputs below as a JSON object. The token needs the `config:write` scope.

It makes changes, so send an [Idempotency-Key](https://modulify.ai/docs/api/idempotency) header whenever you might retry it. A retry with the same key gets the first answer back instead of running again.

```bash
curl -X POST https://api.modulify.ai/v1/send_test_site_email \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"PROJECT_ID"}'
```

Over MCP, the same method is the [send_test_site_email tool](https://modulify.ai/docs/mcp/emails/send-test-site-email).

## Inputs

| Input | Type | Required | Description |
| --- | --- | --- | --- |
| `projectId` | string | Yes | The site id. |

## Response

Every call answers with the [JSON envelope](https://modulify.ai/docs/api/requests-and-responses#the-response) of `success`, `message`, `data`, `code` and `version`. `data` holds the result described above, and on a method that returns a total, `count` carries it. The [response headers](https://modulify.ai/docs/api/requests-and-responses#headers-on-every-method-call) carry the call's `X-Request-Id` and what is left of your per-minute budget in `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`. [Errors](https://modulify.ai/docs/api/errors) explains every status code a call can answer with.