---
title: "Send one real test email"
method: POST
path: "/stats/admin-emails/test-send"
tags: ["Admin Emails"]
---

# Send one real test email

`POST /stats/admin-emails/test-send`

## Request

- Base URL: `https://api.nippy.host`
- URL: `https://api.nippy.host/stats/admin-emails/test-send`
- Auth: `bearer` (a scheme the document does not define)

Sends the rendered template to a single address from the real sender, on the template's real message stream, with the subject unmodified. It is a real email: use an address you control. Nothing is written to the send log, no activity event is emitted, and no account's once-per-template slot is consumed — so this can never stop a real recipient from receiving the genuine email later.

## Request body

- SendTestLifecycleEmailDto
  - `template` 'welcome' | 'agent_welcome' | 'unblock' | 'update_lesson' | 'trial_tips' | 'activation_ask' | 'paid_activation' | 'first_visitors' | 'preview_expiring' | 'payment_failed' | 'plan_ended_unpaid', required: Which lifecycle template to render. Retired keys are rejected — they have no template function.
  - `context` LifecycleContextDto
    - `productUrl` string: Marketing/dashboard origin every link is built from.
    - `siteId` string, nullable: Id of the live site the email links to.
    - `siteContent` 'pdf' | 'html' | 'generic': What the live site is, from its upload manifest: a single PDF, a website, or neither.
    - `siteUrl` string, nullable: Public URL of the account's oldest live site. Null when nothing is live.
    - `siteHost` string, nullable: Display host of that site.
    - `paid` boolean: Account holds an entitled paid subscription (trial included).
    - `trial` boolean: That subscription is specifically in its trial period.
    - `planName` string, nullable: Paid plan display name.
    - `viewCount` number, nullable: Recorded views on the live site over the activity period.
    - `activityFrom` string, nullable: First day of the activity period, as printed.
    - `activityTo` string, nullable: Last day of the activity period, as printed.
    - `previewHost` string, nullable: Display host of the expiring preview.
    - `previewUrl` string, nullable: Public URL of that preview.
    - `publishesProgrammatically` boolean: Account publishes through an agent or the CLI rather than the dashboard.
    - `chargeAmount` string, nullable: The failed charge as the recipient sees it. Billing notices only.
    - `invoiceUrl` string, nullable: Stripe's hosted page for the unpaid invoice.
    - `sitesAffected` number: Live sites over the Free cap that a lapse takes, or has taken, offline.
    - `firstCharge` boolean: The failed charge was the first one after a free trial.
    - `unsubscribeUrl` string: Public opt-out link.
    - `companyName` string: Legal entity shown in the footer.
    - `companyAddress` string: Postal address shown in the footer of marketing mail.
  - `to` string, email, required: Recipient of the single test email. Any address — the send is real, from the real sender, on the real message stream.

## Response `201`

- APILifecycleTestSendResult
  - `template` 'welcome' | 'agent_welcome' | 'unblock' | 'make_it_yours' | 'update_lesson' | 'trial_tips' | 'trial_ending' | 'activation_ask' | 'feedback_ask' | 'week_one_upsell' | 'paid_activation' | 'first_visitors' | 'preview_expiring' | 'payment_failed' | 'plan_ended_unpaid', required
  - `to` string, required
  - `subject` string, required
  - `stream` 'broadcast' | 'transactional', required
  - `messageId` string, required: Postmark's message id for the send.

## Other responses

- `403`: Admin access required

---

[API](https://skmtc.dev/nippy/apis/nippy-backend-api.md) · [All operations](https://skmtc.dev/nippy/apis/nippy-backend-api/llms.txt) · [OpenAPI document](https://skmtc.dev/nippy/apis/nippy-backend-api/revisions/7ab23f040a55?raw)
