---
title: "Email Simulate"
method: POST
path: "/v1/admin/email-simulate"
tags: ["admin"]
---

# Email Simulate

`POST /v1/admin/email-simulate`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/admin/email-simulate`
- Auth: HTTP bearer

Dry-run the REAL two-phase evaluator for one (tenant, recipient, email): the explainability
surface for everything that never entered the pipeline (persisted decisions cover everything that did).

Read-only by construction: it evaluates predicates, consent, caps, and quiet hours against current
state and reports every blocker; nothing is enqueued, sent, or recorded.

## Request body

- EmailSimulateRequest: A hypothetical to explain: would ``email_id`` send to this recipient right now?
  - `tenant_id` string, uuid, required
  - `email_id` string, required
  - `recipient_actor_id` string, uuid, nullable
  - `recipient_email` string, email, nullable

## Response `200`

Successful Response

- EmailSimulateResult: The same decision trace the engine would produce, without sending or persisting anything.
  - `email_id` string, required
  - `has_rule` boolean, required
  - `would_send` boolean, required
  - `blockers` string[], required
  - `entry_evaluated` object, required
  - `send_evaluated` object, required
  - `frequency_snapshot` object, required
  - `quiet_hours_deferred_until` string, date-time, nullable, required
  - `email_provenance` string, nullable

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `409`: Conflict
- `422`: Validation error

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/0dfb44495ea1?raw)
