CI 与端到端测试
为每条测试创建隔离地址,不再依赖脆弱的固定等待,并直接断言真实验证结果。
- 幂等创建
- 长轮询领取
- 稳定 Request ID
创建短生命周期收件箱,描述期待的发件人或验证结果,SpotMail 会返回匹配到的验证码或链接及其证据;邮箱仍会按时到期。
任务已创建
checkout-smoke-1842
等待收件
verify-7f2c@spotmail.app
匹配邮件
auth@sample.test
返回结果
验证码 · 482 901
邮箱到期
最长 24 小时
一个原语,三类任务
为每条测试创建隔离地址,不再依赖脆弱的固定等待,并直接断言真实验证结果。
每把 Key 只冻结一项由人批准的验证 Profile;Agent 只能引用它,不能改写发件人或结果策略。
通过签名 Webhook 接收事件、重放失败投递,并从账号侧查看当前用量。
接口契约
Project Key 负责创建与查看任务;任务级令牌只能领取、完成或取消这一项任务。所有接口都只收不发。
/api/verification-runs/usage
确认能力与当前余量
/api/verification-runs
创建或幂等恢复任务
/api/verification-runs/{id}
查看任务状态
/api/verification-runs/{id}/claim
等待匹配的验证结果
/api/verification-runs/{id}/complete
记录调用方结论
/api/verification-runs/{id}
提前结束任务
TypeScript SDK
Preflight 会在分配资源前发现拿错 Key、Profile 漂移或凭证寿命不足;同一指纹会保留到 Run 与 Activity。
BETA 包契约 · REST 仍是事实来源
import { SpotMailClient } from '@spotmail/sdk';
const spotmail = new SpotMailClient({
apiKey: process.env.SPOTMAIL_API_KEY!,
environment: 'staging',
});
await spotmail.verificationRuns.preflight({
profile: 'signup-code',
contractFingerprint: process.env.SPOTMAIL_PROFILE_FINGERPRINT,
});
const run = await spotmail.verificationRuns.create(
{
profile: 'signup-code',
context: { clientReference: 'signup-e2e-1842' },
},
{ idempotencyKey: 'signup-e2e-1842' },
);
const claim = await run.wait({ maxWaitSeconds: 120 });
if (claim.result?.artifact.kind === 'code') {
console.log(claim.result.artifact.value);
}BETA 边界
SpotMail 不发送邮件、不管理会话,也不充当 Agent 的永久身份。
每账号每分钟最多创建 6 个资源、UTC 每日最多 50 个 Verification Run,并可为每把 Key 单独设置日预算。
七天传输记录只保留 Request ID、操作、标准化客户端、状态、耗时和稳定错误,不保存邮件正文或凭据。
任务邮箱在 24 小时内到期;幂等墓碑只在内容删除后短暂保留,用于保证网络重试安全。
从真实接口开始
从 REST 契约开始,或创建 Project Key,在测试套件和 Agent 中运行第一项验证任务。