# Send email and keep the proof

> An email platform for your own domains, with a chain of custody for every message you send or receive.

Canonical: https://minket.com/. Updated: 2026-10-28.

Minket is not open for sign-up yet.

- Sends: [each email once](https://minket.com/sending)
- Signs: [every webhook](https://minket.com/webhooks)
- Receives: [mail as JSON, with its verdicts](https://minket.com/inbound)
- Keeps content: [30 days, never in a log](https://minket.com/security)

*The domain seal of mail.fernbank.example.* Five rings, outside in: DKIM (3 CNAME records), MAIL FROM (an MX and an SPF record on bounce.), DMARC, Tracking (a CNAME for links.) and Receiving (an MX). Every record is verified, so every ring is whole.

## Written

*18:00:00, UTC*

One call, from the SDK or curl. [Sending](https://minket.com/sending)

**Send one email, TypeScript SDK**

```ts
const minket = new Minket({
  apiKey: process.env.MINKET_API_KEY,
});

const email = await minket.emails.send({
  from: "receipts@mail.fernbank.example",
  to: "rui.okafor@example.com",
  subject: "Your receipt for order 10452",
  html: "<p>Thanks, Rui.</p>",
}, { idempotencyKey: "receipt-10452" });
```

**Send one email, curl**

```sh
curl https://api.minket.com/v1/emails \
  -H "Authorization: Bearer $MINKET_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: receipt-10452" \
  -d '{
    "from": "receipts@mail.fernbank.example",
    "to": "rui.okafor@example.com",
    "subject": "Your receipt for order 10452",
    "text": "Thanks, Rui."
  }'
```

**The answer**

```json
{
  "id": "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5c",
  "object": "email",
  "status": "queued",
  "scheduled_at": null,
  "idempotent_replay": false
}
```

## Accepted

*18:00:00, +0 s*

An id to look up, and the same answer for a retried key. [Retries](https://minket.com/sending#retries)

*An email's page in the console.* The receipt for order 10452 right after it was accepted: queued, live, with its id, its addresses and its idempotency key. Its chain of custody shows Accepted, with Sent next.

## Checked

*before any live send*

Live mail goes out only from a domain whose records check out. [Domains](https://minket.com/domains)

**The records of mail.fernbank.example**

| Record | Name | Value | Status |
| --- | --- | --- | --- |
| DKIM `CNAME` | `7f3a9c._domainkey.mail.fernbank.example` | `7f3a9c.dkim.amazonses.com` | Verified |
| DKIM `CNAME` | `b21e04._domainkey.mail.fernbank.example` | `b21e04.dkim.amazonses.com` | Verified |
| DKIM `CNAME` | `c9d811._domainkey.mail.fernbank.example` | `c9d811.dkim.amazonses.com` | Verified |
| MAIL FROM `MX` | `bounce.mail.fernbank.example` | `10 feedback-smtp.<region>.amazonses.com` | Verified |
| SPF `TXT` | `bounce.mail.fernbank.example` | `v=spf1 include:amazonses.com ~all` | Verified |
| DMARC `TXT` | `_dmarc.mail.fernbank.example` | `v=DMARC1; p=none; rua=mailto:dmarc@fernbank.example` | Verified |
| Tracking `CNAME` | `links.mail.fernbank.example` | `links.minket.com` | Verified |
| Receiving `MX` | `mail.fernbank.example` | `10 inbound-smtp.<region>.amazonaws.com` | Verified |

## Sent

*18:00:02, +2 s*

Every message carries its id, so a reply finds the email it answers.

**A header on every message**

```http
X-Minket-Email-Id: 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5c
```

## Delivered

*18:00:04, +4 s*

Pick a test recipient and the chain plays its outcome. [Test mode](https://minket.com/sending#test)

**Test recipients and what each plays after Sent**

| Recipient | Events, with seconds after the email was accepted |
| --- | --- |
| `delivered@minket.test` | Delivered (+4 s) |
| `bounced@minket.test` | Bounced (+4 s) |
| `complained@minket.test` | Delivered (+4 s), Complained (+6 s) |
| `delayed@minket.test` | Delayed (+4 s), Delivered (+6 s) |

## Signed

*18:00:04, +4 s*

Each event reaches your endpoint signed, as it happens. [Webhooks](https://minket.com/webhooks)

**The endpoint**

- Endpoint: `fernbank.example/api/minket`
- Secret: `whsec_<shown once>`
- Tolerance: 5 minutes

**What the endpoint receives**

```http
POST /api/minket HTTP/1.1
svix-id: msg_019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a60
svix-timestamp: 1761328804
svix-signature: v1,K1lQb2w3YnE1Y0F0ZE5hV1J2VHdxaXZlSHk0dz0=

{
  "type": "email.delivered",
  "created_at": "2026-10-24T18:00:04.000Z",
  "data": {
    "email_id": "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5c",
    "to": ["rui.okafor@example.com"],
    "subject": "Your receipt for order 10452"
  }
}
```

## Answered

*09:14:37, +2 d*

The reply arrives as `email.received`, tied to the email it answers. [Inbound](https://minket.com/inbound)

**The reply**

- From: `rui.okafor@example.com`
- Subject: Re: Your receipt for order 10452
- Answers: the receipt, by its id

## Sealed

*23 Nov, +30 d*

The content is deleted; what happened to the email stays. [Security](https://minket.com/security)

*What is left of a message.* After 30 days the content is gone; the addresses and events stay.

## Purged

*23 Nov 2027, +13 months*

Then the addresses and the events go too.

## The rest of Minket

- **[Mailboxes](https://minket.com/mailboxes)**: Send from a person's own account, with their name on it.
- **[Audience](https://minket.com/audience)**: Contacts, topics and their consent; broadcasts and automations.
- **[Developers](https://minket.com/developers)**: SDKs for TypeScript, Python and Go, a command line and an MCP server.
- **Built on**: Amazon SES, in two regions.

## Questions

### Can I sign up today?

Not yet. The [quickstart](https://docs.minket.com/start/) shows a first request, errors and test mode.

### Can I send over SMTP?

Yes, with SMTP credentials made in the console. SMTP mail skips the suppression check, the automatic pause and the content checks.

### Do I need an SDK?

No. The API is HTTPS and JSON, so curl is enough.

More: Read the quickstart, https://docs.minket.com/start/
