---
title: "Send email"
method: POST
path: "/v1/email-users/{user_id}/inbox/send"
tags: ["Inbox"]
---

# Send email

`POST /v1/email-users/{user_id}/inbox/send`

## Request

- Base URL: `https://api.winnr.app`
- URL: `https://api.winnr.app/v1/email-users/{user_id}/inbox/send`
- Auth: HTTP bearer

Send an email from this user's account.

## Path parameters

- `user_id` string, required

## Request body

- SendEmailRequest
  - `to` string, email, required
  - `subject` string, required
  - `body` string
  - `cc` string
  - `bcc` string
  - `html` boolean
  - `attachments` object[]: File attachments (max 3)
    - `key` string, required: The `key` returned by `POST /v1/upload/presign`. Single use — the stored file is deleted after a successful send.
    - `filename` string, required
    - `content_type` string, required
  - `in_reply_to` string: Message-ID of the email being replied to (for threading)
  - `references` string: Space-separated Message-IDs for the thread (RFC 2822)
  - `calendar_invite` object: Attach a real calendar invite. We generate the iCalendar document server-side and place it as a text/calendar part with the method parameter, so Gmail and Outlook render their native invite / RSVP card rather than a file to download. ORGANIZER is set to the sending mailbox and ATTENDEE to the recipient automatically. No upload or presign step is involved.
    - `summary` string, required: Event title shown in the calendar
    - `start` string, required: ISO-8601 start. Either carries a UTC offset (2026-08-12T15:00:00Z / 2026-08-12T15:00:00+02:00), or is naive and accompanied by `timezone`.
    - `end` string: ISO-8601 end. Required unless duration_minutes is given.
    - `duration_minutes` integer: Alternative to `end`.
    - `timezone` string: IANA timezone, required only when start/end have no UTC offset.
    - `location` string: Physical address or a join URL
    - `description` string
    - `method` 'REQUEST' | 'CANCEL' | 'PUBLISH': REQUEST sends an invitation with RSVP buttons. PUBLISH is add-to-calendar only, with no RSVP and no attendee tracking. CANCEL withdraws a previously sent invite; it must reuse the original `uid` with a higher `sequence`.
    - `uid` string: Omit on first send and store the `calendar_uid` we return. To reschedule or cancel that same event, send the SAME uid with a higher `sequence` — a new uid creates a second, unrelated event in the recipient's calendar instead of updating the first.
    - `sequence` integer: Increment on every update or cancellation of the same uid.

## Response `200`

Email sent

- object
  - `meta` Meta
    - `request_id` string
    - `timestamp` string, date-time
  - `data` SendEmailResponse
    - `success` boolean
    - `from` string
    - `to` string
    - `subject` string
    - `message_id` string: Message-ID of the sent email (use for threading subsequent replies)
    - `calendar_uid` string: Present only when calendar_invite was sent. Store this — rescheduling or cancelling the same event requires this uid with a higher sequence.
    - `calendar_sequence` integer: Sequence number used for this invite.

## Other responses

- `400`: Validation error
- `401`: Authentication required or token invalid
- `404`: Resource not found

---

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