---
title: "Send one email through the standard api-side pipeline"
method: POST
path: "/internal/email/send"
tags: ["internal"]
---

# Send one email through the standard api-side pipeline

`POST /internal/email/send`

Dispatch via `send_email`. Errors short-circuit with 502 so the
Next caller can decide whether to surface or swallow. Welcome sends
from provision-org are fire-and-forget on the Next side — a 502
from here becomes a Sentry breadcrumb, not a user-visible failure.

## Headers

- `x-internal-secret` string, nullable

## Request body

- SendEmailRequest — Shape accepted by POST /internal/email/send. `variables` is opaque at this layer — the template decides which `{placeholder}` keys it needs and render.py raises TemplateRenderError if any required key is missing.
  - `to` string, email, required — Recipient email address
  - `template` 'subscription-confirmed' | 'monthly-usage-summary' | 'welcome' | 'quota-80' | 'quota-100' | 'win-back' | 'activation-first-call', required — Template slug
  - `subject` string, required — Subject line
  - `tag_class` 'transactional' | 'marketing', required — transactional | marketing
  - `variables` object — Template-specific {placeholder} substitutions
  - `organization_id` string, nullable — Supabase org uuid. When present, send.py applies frequency caps and appends to org_email_log.

## Response `200`

Successful Response

- object

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/goldprice/apis/gold-api.md) · [All operations](https://skmtc.net/goldprice/apis/gold-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/goldprice/gold-api/versions/7885a141754c/schema)
