---
title: "Send the coach-authored recap email to session participants (MED-901 / AC12-AC15)"
method: POST
path: "/api/coach/sessions/{sessionId}/post-session/recap-email/send"
tags: ["Coach Post-Session"]
---

# Send the coach-authored recap email to session participants (MED-901 / AC12-AC15)

`POST /api/coach/sessions/{sessionId}/post-session/recap-email/send`

## Request

- Base URL: `https://api.production.yourmedley.com`
- URL: `https://api.production.yourmedley.com/api/coach/sessions/{sessionId}/post-session/recap-email/send`
- Auth: HTTP bearer

Sends a recap email to the listed session participants. The coach
composes Subject + Body HTML in the "Send Recap Email" modal and may
include any of the seven recap-email merge tags
(`{{first_name}}`, `{{cohort_name}}`, `{{session_number}}`,
`{{session_date}}`, `{{group_name}}`, `{{topic_name}}`,
`{{coach_name}}`). Tags are resolved **server-side** per recipient —
null values become empty strings, so the literal tag text never reaches
a participant (AC15).

Recipients are intersected with the session's group membership before
sending — IDs not in the group are silently dropped and reported in
`skipped_not_in_session`.

Authorization: only the coach assigned to the session's group can call
this endpoint. Calls from other coaches receive 403. 1:1 sessions
(no group) also receive 403 — recap email is group-only this story.

MED-893 (post-session AI features) flows the AI-generated body through
this same endpoint without changes.

## Path parameters

- `sessionId` string, uuid, required

## Request body

- object
  - `recipient_user_ids` string[], required: User IDs of session participants to send to. Filtered to current group membership.
  - `subject` string, required: Coach-authored subject line. May include merge tags — resolved server-side per recipient.
  - `body_html` string, required: Coach-authored body HTML from the RichTextEditor. May include merge tags — resolved server-side per recipient.

## Response `200`

Send completed. Returns counts.

- object
  - `success` boolean
  - `data` object
    - `sent` integer: Successful queue publishes
    - `failed` integer: Failed queue publishes
    - `skipped_not_in_session` integer: Recipient IDs that were not current members of the session's group

## Other responses

- `401`: Unauthorized
- `403`: Caller is not the coach assigned to this session
- `404`: Session not found OR live_session_delivery flag off
- `422`: Validation failed

---

[API](https://skmtc.dev/withmedley/apis/medley-api.md) - [All operations](https://skmtc.dev/withmedley/apis/medley-api/llms.txt) - [OpenAPI document](https://skmtc.dev/withmedley/apis/medley-api/revisions/40aaac5ca6bd?raw)
