Docs

Using Sendlet

Sendlet gives an AI agent a private link that emails one approved recipient or group, and nobody else. This page covers setting it up and everything an agent can send.

Get started

  1. Sign in at sendlet.email with your email address. A new account comes with one recipient already accepted: you.
  2. Add the people your agents may email. Each gets an invitation and must accept before anything reaches them.
  3. Create an endpoint on a recipient or group: a private URL for one agent, with its own daily limit. Copy it when it's shown; for safety it's shown only once.
  4. Give the URL to your agent, or add its MCP address to Claude. Every send appears in your send log.

Endpoint URLs look like https://sendlet.email/to/sam-k7F2x9Qa4mB8nR1vT6yZ3c. Anyone with the URL can send to that recipient, within its limits, so treat it like a password: you can pause, rotate or revoke it at any time.

Sending over HTTP

POST JSON to the endpoint URL:

POST https://sendlet.email/to/sam-k7F2x9Qa4mB8nR1vT6yZ3c
Content-Type: application/json

{"subject": "Short summary", "body": "Message text. **Markdown** is supported."}
subject
Required. One line, up to 200 characters. Also accepted as title.
body
Required. Plain text or Markdown, up to 50,000 characters. Also accepted as message, text or content.
idempotency_key
Optional. Up to 100 of A-Z a-z 0-9 _ . : -. The same key within 10 minutes sends only once, so retries are safe. Also accepted as an Idempotency-Key header.
attachments
Optional, if your plan includes attachments. See below.

Form posts (application/x-www-form-urlencoded) take the same fields. With text/plain or text/markdown, the first line is the subject and the rest is the body.

Files and images

Add an attachments array with each file's name and base64 content, or POST multipart/form-data:

curl -F subject="Floor plan" -F body="![Floor plan](plan.png)" -F [email protected] \
     https://sendlet.email/to/sam-k7F2x9Qa4mB8nR1vT6yZ3c
  • Up to 10 files per email. The size allowance depends on your plan; the endpoint's GET description says what's available.
  • Allowed types: png, jpg, jpeg, gif, webp, pdf, txt, csv, md, json, ics, docx, xlsx, pptx, odt and ods. The content must match the extension.
  • To show an attached image inside the message, reference it as a Markdown image: ![Description](plan.png). Images from web addresses aren't loaded.

Before sending

GET the endpoint URL to see who it emails, how many emails are left today and what it accepts: Markdown by default, or JSON with Accept: application/json. A GET never sends.

After sending

GET …/to/{address}/sends/{id} with the snd_ id from the response to see what happened: queued, sent, bounced, awaiting approval and so on, per recipient by label. Addresses are never shown.

MCP and Claude

Every endpoint is also an MCP server (Streamable HTTP). Replace /to/ with /mcp/:

https://sendlet.email/mcp/sam-k7F2x9Qa4mB8nR1vT6yZ3c
  • Claude: Settings, Connectors, add a custom connector, and paste the MCP URL. Each endpoint page has a Copy MCP URL button.
  • Claude Code: claude mcp add --transport http sendlet https://sendlet.email/mcp/…
  • Tools: send_email (subject, body, optional attachments and idempotency key), endpoint_info (who it emails and what's left today) and get_send_status.

Staying in control

  • Daily limits on each endpoint and on your account. A group send needs room for every member's copy.
  • Approval: an endpoint can hold every email until you approve it. You're emailed straight away; anything undecided for 3 days is rejected.
  • Groups: one endpoint can email several recipients, each getting their own copy. Only members who've accepted receive it.
  • Alerts: you're emailed when a send fails, a recipient bounces or complains, or an endpoint reaches its daily limit.
  • Recipients stay in charge: every email has a one-click unsubscribe, and a hard bounce or complaint unsubscribes automatically.

Responses

202
Queued, or held for approval ("awaiting_approval": true). Includes the send's id and how many emails are left today.
200
A repeat of a send from the last 10 minutes; nothing new was sent ("duplicate": true).
400
A field is missing or invalid. The hint shows a corrected request.
404, 410
Unknown URL, or the endpoint was revoked.
409
The recipient hasn't accepted, declined or unsubscribed. Don't retry these in a loop.
429, 503
A rate or daily limit was reached, or the service is busy. Wait for Retry-After seconds.

Errors are RFC 9457 problem details with an extra hint.

For agents and tools

  • llms.txt: these instructions in a form written for language models.
  • openapi.json: the OpenAPI description of the send API.