API 文档
通过 API 创建临时邮箱、长轮询新邮件、读取解析后的邮件正文、管理用户令牌和自定义域名,并通过 SSE 实时接收事件推送。
基础 URL
https://api.mail.cx/v1所有接口都位于 /v1 前缀下,必须使用 HTTPS。每个请求的基础 URL 都相同。
认证
每个请求都必须通过 x-api-token 请求头携带 API 令牌。令牌类型决定调用者的权限:
- 用户令牌(tm_live_…) — 在控制台 → 令牌中创建,用于 SDK / 自动化场景。受单用户速率限制 + 月度 Ops 配额约束。免费版 1 个,专业版 10 个。
- 网页会话(tm_live_…) — 由登录 / 注册 / OAuth 颁发,7 天 TTL。用于浏览器 UI;不占用用户令牌配额,也不扣 Ops。
- 匿名令牌(tm_anon_…) — 通过 POST /v1/sessions/anon 颁发(启用 Cloudflare Turnstile 时仅限浏览器)。默认 24 小时 TTL。仅能访问系统域名邮箱 — 无法访问自定义域名、/me、/tokens、/domains 或管理员接口。
curl https://api.mail.cx/v1/inbox \
-X POST \
-H "x-api-token: tm_live_your_token_here" \
-H "Content-Type: application/json" \
-d '{}'快速开始
1. 创建临时邮箱。请求体为空时服务器会在默认系统域名上生成随机 local_part。返回邮箱地址和以 Unix 毫秒时间戳表示的过期时间。
curl -X POST https://api.mail.cx/v1/inbox \
-H "x-api-token: tm_live_your_token_here" \
-H "Content-Type: application/json" \
-d '{}'
// → 201
{
"address": "ab12cd@qabq.com",
"expires_at": 1715706000000
}2. 使用长轮询等待邮件。服务器会保持连接最长 25 秒。200 表示有新邮件;204 表示等待超时未收到邮件,使用返回的 next_since 游标重新发起请求即可。
curl "https://api.mail.cx/v1/inbox/ab12cd@qabq.com?since=0" \
-H "x-api-token: tm_live_your_token_here"
// → 200
{
"emails": [
{ "id": "uuid", "from_email": "sender@example.com", "subject": "...", "preview_text": "...", "created_at": "2026-05-14T12:00:00Z" }
],
"next_since": "1715706012"
}3. 通过邮件 id 读取完整邮件(纯文本正文、HTML 正文、附件元数据)。
curl https://api.mail.cx/v1/email/{email_id} \
-H "x-api-token: tm_live_your_token_here"速率限制与 Ops 配额
每次已认证请求都会在一次 Redis 往返内原子地跑两层校验:单用户滑动窗口速率限制 + 月度 Ops 计数。匿名令牌没有应用层速率限制 — IP 限速在网络边缘进行。
| 限制 | Free | Pro |
|---|---|---|
| 单用户请求速率(1 秒窗口) | 8 / s | 10 / s |
| 月度 Ops 配额 | 1,500 | 200,000 |
已认证响应包含 X-Ops-Limit 与 X-Ops-Remaining 响应头。响应体为 {"error":"rate_limit_exceeded"} 的 429 同时附带 Retry-After(秒);响应体为 {"error":"ops_quota_exceeded"} 的 429 在 UTC 次月 1 日重置。
什么算作一个 Op?
只有控制台创建的用户令牌(kind=user)会扣 Ops。网页会话令牌(UI 登录用)和匿名令牌不计入月度配额。
- POST /v1/inbox 和 POST /v1/mailboxes — 创建地址
- GET /v1/email/:id 和 GET /v1/emails/:id — 读取解析后的邮件
- GET /v1/emails/:id/raw 与 /attachments/:index — 下载原始 EML 或附件
- 列表收件、SSE 推送、/me、/ops、/config、登录注册和管理员接口均不计入 Ops
接口列表
Inbox(v1 AI 友好接口)
为 AI Agent 和 SDK 设计的简洁资源结构。GET 接口采用长轮询 — 服务器保持连接最长 25 秒(config wait_seconds,由服务端固定,客户端无法修改)。新邮件到达或等待结束时返回。204 = 等待超时无新邮件;200 = 至少匹配到一封;429 = 触发并发上限(响应中带 Retry-After 头)。
/v1/inbox创建临时邮箱(不分配任何后端状态 — SMTP 网关本身就会接受系统域名下任意地址的邮件)。
任意令牌(匿名 / 网页会话 / 用户)/v1/inbox/:address对单个地址长轮询。查询参数:since、count(默认 1,最大 50)、limit(默认 20,最大 50)、from、subject。
任意令牌(匿名 / 网页会话 / 用户)/v1/inbox/:address销毁邮箱(删除该地址下的所有邮件与索引)。
任意令牌(匿名 / 网页会话 / 用户)/v1/email/:id读取完整邮件(纯文本正文、HTML 正文、附件元数据、邮件头)。
任意令牌(匿名 / 网页会话 / 用户)/v1/domain/:domain对一个已验证的自定义域名下所有地址长轮询。查询参数与 /v1/inbox/:address 相同。
需要专业版/v1/me对当前用户所有拥有的地址长轮询(专业版自定义域名等)。游标是 Redis Stream ID。
非匿名令牌(网页会话或用户)POST /v1/inbox 接受可选 JSON 请求体。所有字段均为可选。
| Parameter | Rules |
|---|---|
| local_part | 2–20 个字符,仅限小写 a–z 0–9 . _ -。不能以 . _ 或 - 开头或结尾。保留名(admin、postmaster、abuse、support、noreply、root、webmaster、hostmaster、mail、ftp、www)会被拒绝。省略时生成随机 6 位地址。 |
| domain | 默认使用系统默认域名。可设为你已验证且拥有的自定义域名(需非匿名令牌)。 |
| ttl | 单位秒。默认值为服务端 mailbox.default_ttl(3600 秒 / 1 小时)。设置了 mailbox.max_ttl 时会被上限截断。注意:TTL 仅在 POST /v1/inbox 中作为参考值 — 实际邮件留存由服务端决定(免费/系统域名 1 小时热存储,专业版自定义域名 7 天归档)。 |
Mailboxes(按地址访问的兼容接口)
Web UI 使用的原始按地址寻址接口。数据模型与 v1 完全一致,区别在于返回分页列表而非长轮询。
/v1/mailboxes校验并回显一个地址。不分配状态。请求体:{ local_part?, domain? }。返回 { address, expires_at(RFC3339)}。
任意令牌(匿名 / 网页会话 / 用户)/v1/inbox/:address/emails按地址分页列出邮件。查询参数:offset、limit(默认 20,最大 50)。返回 { emails, total, offset, limit }。
任意令牌(匿名 / 网页会话 / 用户)/v1/inbox/:address/emails删除指定地址下所有当前已索引的邮件。返回 { deleted: <count> }。
任意令牌(匿名 / 网页会话 / 用户)邮件内容
/v1/emails/:id读取完整邮件 — /v1/email/:id 的别名。
任意令牌(匿名 / 网页会话 / 用户)/v1/emails/:id/raw流式返回原始 .eml。Content-Type 为 message/rfc822,附带 Content-Disposition: attachment。若底层对象已被 TTL 清理则返回 410。
任意令牌(匿名 / 网页会话 / 用户)/v1/emails/:id/attachments/:index按零起索引下载单个附件。返回邮件中原始 Content-Type。
任意令牌(匿名 / 网页会话 / 用户)/v1/emails/:id删除单封邮件,并从所有按地址/按域名的索引中移除。成功时返回 204 No Content。
任意令牌(匿名 / 网页会话 / 用户)API 令牌
管理用户令牌(kind=user)。网页会话令牌(登录产生)不会出现在列表中也无法在此接口吊销 — 退出登录即可。免费版 1 个;专业版 10 个。
/v1/tokens创建新的用户令牌。请求体:{ name? }。返回 { id, name, token, created_at }。明文 token 只在创建时返回一次。
非匿名令牌(网页会话或用户)/v1/tokens列出你的用户令牌。创建后无法再获取明文 — 只能拿到 id、name、prefix、created_at、last_used_at。
非匿名令牌(网页会话或用户)/v1/tokens/:id吊销用户令牌。成功时返回 204 No Content,缓存立即失效。
非匿名令牌(网页会话或用户)自定义域名(专业版)
添加你拥有的域名,即可在该域名下任意地址收信。验证需要两条 DNS 记录:TXT 记录 _tempmail.<domain> 值为 tempmail-verify=<token>,MX 记录指向 smtp.mail.cx。后台校验每 5 分钟轮询一次;72 小时未验证将标记为失败。
/v1/domains添加自定义域名。请求体:{ domain }。返回需要配置的 DNS 记录。配额:10 个。
需要专业版/v1/domains列出你的自定义域名及 verify_status(pending / verified / failed)和 verified_at。
非匿名令牌(网页会话或用户)/v1/domains/:id移除自定义域名。同时清除 Redis 路由条目,SMTP 立即停止接受该域名邮件。
非匿名令牌(网页会话或用户)账户与用量
/v1/config服务端配置:系统域名列表、local-part 规则、默认 TTL、OAuth 客户端 ID、Turnstile 开关。响应缓存 5 分钟。
公开 — 无需认证/v1/sessions/anon颁发匿名令牌(仅限浏览器;启用 Cloudflare Turnstile 时需通过校验)。返回 { token, expires_at, kind: "anon" }。
公开 — 无需认证/v1/ops当月 Ops 用量:{ plan, limit, used, remaining, resets_at }。
非匿名令牌(网页会话或用户)/v1/me/usage近 7 天滚动存储字节用量与配额(专业版 5 GiB;免费版 0)。
非匿名令牌(网页会话或用户)/v1/me/messages跨地址的分页历史。?cursor=<stream-id> 读热数据;默认 ?before=<unix-ms> 读 PG 冷归档。
非匿名令牌(网页会话或用户)实时推送(SSE)
实时邮件事件使用 HTTP 上的 Server-Sent Events(SSE)。浏览器的 EventSource API 会自动带 Last-Event-ID 头重连,服务端用它作为 Redis Stream 游标回放断连期间丢失的事件。由于 EventSource 不支持自定义请求头,令牌通过查询参数传递。
/v1/sse/addr?address=<addr>&token=<token>推送单个地址的事件流。系统域名地址对任意令牌开放;自定义域名地址需提供拥有者用户令牌。
任意令牌(匿名 / 网页会话 / 用户)/v1/sse/user?token=<token>汇总推送当前用户所有拥有的地址,仅限非匿名令牌。
非匿名令牌(网页会话或用户)每封新邮件以 SSE 事件形式推送。每 30 秒发送一次心跳注释行(:ka <id>),防止反向代理断开连接。
const es = new EventSource(
"https://api.mail.cx/v1/sse/user?token=tm_live_your_token_here"
);
es.addEventListener("email", (e) => {
const data = JSON.parse(e.data);
// { id, address, from, subject, preview }
});
// Heartbeat lines (":ka <last-id>") are surfaced as comments — no handler needed.
// On disconnect EventSource auto-reconnects and sends Last-Event-ID;
// the server replays any missed events from the Redis Stream.错误处理
错误返回 JSON 对象,包含机器可读的 "error" 字段。HTTP 状态码表示错误类别。
{ "error": "rate_limit_exceeded" }| 状态码 | 说明 |
|---|---|
| 400 | 请求错误 — 参数或请求体无效。 |
| 401 | x-api-token 缺失或无效。 |
| 403 | 禁止 — 匿名令牌访问需要非匿名的接口、非 Pro 用户访问 Pro 接口、账户已禁用,或 Turnstile 校验未通过。 |
| 404 | 资源不存在,或你不是该自定义域名 / 地址的拥有者。 |
| 409 | 冲突 — 域名已被注册。 |
| 410 | 已过期 — 邮件正文已被 TTL 清理(error: email_expired)。 |
| 429 | 速率限制(rate_limit_exceeded,带 Retry-After)、Ops 配额(ops_quota_exceeded,按月重置)或并发上限(带 Retry-After)。 |
| 503 | 实时推送通道不可用(NATS 故障)或验证码服务离线。 |
安全性
- 所有流量仅通过 HTTPS。明文 HTTP 请求会在边缘被升级。
- 令牌以 SHA-256 哈希存储,创建后服务端不再保留明文。吊销时立即清除 Redis 令牌缓存。
- 自定义域名邮箱仅对注册的拥有者可见。系统域名邮箱按设计是公开的 — 任何知道地址的匿名调用方都可读取,请勿用于敏感信息。