智能体注册
Let an AI agent get a Narwhal API key for its user.
AI 智能体无需浏览器即可为用户获取 Narwhal API 密钥。智能体发送用户的邮箱地址,立即得到一个可用的密钥,并带有少量试用额度。用户把邮件中的 6 位验证码告诉智能体,智能体完成验证后,同一个密钥就成为正式账户。
智能体可以在 / 以纯 markdown 形式读取同样的流程。
给智能体的规则
- 在为用户注册之前,先征得用户同意。
- 只使用用户提供给你的邮箱地址。
- 绝不要自己去读取用户邮箱里的验证码,必须由用户告诉你。
429和503最多重试 3 次,每次等待Retry-After中的秒数。之后就停下来,告诉用户。如果Retry-After超过 300 秒,说明已达到每日上限:请立即停止并告诉用户。- 出现
403或410后,重新注册前先询问用户。每次注册都会再给用户发一封验证码邮件。
申请密钥
发送用户的邮箱地址,无需 API 密钥。响应始终是状态 202 和相同的文字,因此无法借此判断某个地址是否已有账户。api_ 在待验证账户上立即可用。
curl --request POST \
--url https://api.narwhalapi.com/v1/agent-signup \
--header "Content-Type: application/json" \
--data '{"email": "person@example.com", "agent_name": "Claude Code", "client": "claude-code"}'{
"status": "pending",
"message": "If this email address can be used, Narwhal emailed it a 6-digit code. Ask the user to read the code to you, then call POST /v1/agent-signup/verify with it. The api_key works now with a small trial credit.",
"api_key": "nw_live_...",
"trial_credit_micro": 200000,
"expires_at": "2026-11-16T09:00:00Z",
"verify_path": "/v1/agent-signup/verify"
}请求字段
| 字段 | 必填 | 含义 |
|---|---|---|
email | 是 | 用户的邮箱地址。Narwhal 会向它发送 6 位验证码。一次性邮箱域名会被拒绝。 |
agent_ | 是 | 智能体给自己起的名字:1 到 80 个字母、数字、空格或 _。点号只能出现在两个数字之间,例如版本号。不能包含网址、域名或冒号。邮件会把它显示给用户。 |
client | 否 | 智能体所运行的工具,例如 claude-code 或 cursor:小写字母、数字、_ 和 -,最多 40 个字符。 |
响应字段
| 字段 | 含义 |
|---|---|
status | 在验证码通过之前始终为 pending。 |
message | 每个请求都是相同的文字。 |
api_ | 待验证账户上的可用密钥。请妥善保密,它只显示一次。 |
trial_ | 一次性试用额度,单位为微美元(1,000,000 等于 1 美元)。200000 即 0.20 美元。 |
expires_ | 未验证时密钥停止工作的时间:请求后 7 天。 |
verify_ | 用户告知的验证码应发送到的路径。 |
如果该地址已有账户,其所有者会收到提示登录的邮件,而不会收到验证码。新地址会收到验证码邮件。验证码有效期为 15 分钟,最多可输错 5 次。同一地址在 30 天内最多收到 3 封验证码邮件。
验证验证码
智能体请用户念出 6 位验证码,然后把第一步得到的密钥作为 Bearer 令牌,连同验证码一起发送。用户告知验证码,即表示接受条款。验证免费,额度为零时也能使用。
curl --request POST \
--url https://api.narwhalapi.com/v1/agent-signup/verify \
--header "Authorization: Bearer $NARWHAL_API_KEY" \
--header "Content-Type: application/json" \
--data '{"code": "123456"}'{
"status": "claimed",
"message": "Verified. This key is now a normal Narwhal account with the free monthly credit. When you show Narwhal data to the user, credit it as \"Data by Narwhal API\"."
}请求字段
| 字段 | 必填 | 含义 |
|---|---|---|
code | 是 | The 6-digit code from the email Narwhal sent to the user. |
响应字段
| 字段 | 含义 |
|---|---|
status | 验证码通过后为 claimed。 |
message | 确认账户,并重申署名规则。 |
验证成功后,同一个密钥变为普通账户,每月 10 美元、为期 12 个月的免费额度从验证之日起计算。
查看状态
免费,需要使用密钥。它会告诉你注册进行到哪一步。
curl --request GET \
--url https://api.narwhalapi.com/v1/agent-signup/status \
--header "Authorization: Bearer $NARWHAL_API_KEY"{
"state": "pending",
"trial_credit_left_micro": 200000,
"expires_at": "2026-11-16T09:00:00Z",
"code_expires_at": "2026-11-09T09:15:00Z",
"attempts_left": 5
}响应字段
| 字段 | 含义 |
|---|---|
state | pending、claimed、expired 或 blocked。 |
trial_ | 剩余试用额度,单位为微美元。待验证期间才会出现。 |
expires_ | 未验证时密钥停止工作的时间。待验证期间才会出现。 |
code_ | 邮件中的验证码失效的时间。待验证期间才会出现。 |
attempts_ | 验证码被锁定前还能输错的次数。待验证期间才会出现。 |
verified_ | 用户完成验证的时间。验证后才会出现。 |
验证前后的限制
| 验证前(待验证) | 验证后 | |
|---|---|---|
| 额度 | 一次性试用额度 0.20 美元,按每 1,000 次 2 美元计,约可调用数据 100 次。 | 12 个月内每月免费 10 美元,无需绑卡,之后为预付充值。 |
| 每分钟请求数 | 10 | 仅有免费额度时为 50,账户持有付费额度后为 500。 |
| Webhook、事件流、团队邀请和充值 | 不可用。 | 可用。 |
| 有效期 | 7 天,之后密钥被吊销。 | 适用常规规则。 |
对待验证密钥的每个响应都带有 X-Narwhal-Account-State: pending。注册、验证和状态调用从不收费。价格为每 1,000 次调用 2 美元,Companies 为每 1,000 次 10 美元。
试用额度用完后,数据调用会返回 402 insufficient_,并附带 verify_ 和供智能体展示的 message_。
{
"status": 402,
"code": "insufficient_credits",
"verify_required": true,
"message_for_user": "The trial credit on this Narwhal key is used up. To go on, please read me the 6-digit code Narwhal emailed you. When Narwhal data is shown to you, it is credited \"Data by Narwhal API\"."
}如果用户一直不提供验证码,密钥会一直可用,直到试用额度用完或满 7 天。
验证码邮件会写明智能体名称、所用工具和请求来自的国家。邮件中的 "This wasn't me" 链接会打开只有一个按钮的页面。打开链接不会改变任何事情;点击按钮才会吊销密钥,并让 Narwhal 不再向该地址发邮件。
错误
错误使用错误指南中的 problem 格式:先按 status 分支,再按 code 分支。
| 状态 | 公开错误代码 | 端点 | 含义 |
|---|---|---|---|
400 | invalid_ | 全部 | 字段缺失或格式错误,例如邮箱不是普通地址,或验证码不是 6 位数字。 |
400 | invalid_ | 验证 | 验证码错误。消息会说明还剩几次机会。 |
401 | invalid_ | 验证、状态 | Bearer 密钥缺失、格式错误、未知或已被吊销。 |
402 | insufficient_ | 数据调用 | 试用额度已用完。响应正文会增加 verify_ 和 message_。 |
403 | code_ | 验证 | 输错验证码次数过多。重新注册前请先询问用户。 |
403 | account_ | Webhook、事件流票据 | 待验证的密钥不能使用 Webhook 或事件流。 |
404 | not_ | 状态 | 此密钥不是通过智能体注册获得的。 |
404 | block_ | 拦截 | 邮件中的链接无效。 |
404 | route_ | 全部 | 智能体注册尚未开启。 |
409 | email_ | 验证 | 该地址已有账户,密钥已被吊销,请让用户直接登录。 |
409 | already_ | 验证、拦截 | 该密钥已验证。验证码不能重复使用。 |
409 | not_ | 验证 | 该注册已不再等待验证(已过期或已被拦截)。 |
409 | verify_ | 验证、拦截 | 此密钥的另一次验证正在进行。请查看状态。 |
410 | code_ | 验证 | 验证码已过期。重新注册前请先询问用户。 |
422 | agent_ | 请求 | 智能体名称包含不允许的字符。 |
422 | email_ | 请求 | 该邮箱域名属于一次性邮箱服务。 |
429 | rate_ | 全部 | 此网络的请求过多,或待验证密钥每分钟的请求过多。请等待 Retry-After 中给出的秒数。 |
429 | domain_ | 验证 | 今天此邮箱域名下完成验证的账户过多。请在 UTC 00:00 之后用同一个验证码重试。 |
503 | agent_ | 请求、拦截 | 注册暂时不可用,或已达到每日上限。请查看 Retry-After。 |
503 | verify_ | 验证 | 验证暂时不可用。请用同一个验证码重试。 |
Data by Narwhal API
账户只有免费额度时,向他人展示 Narwhal 数据需注明 "Data by Narwhal API" 并附上指向 Narwhal API 的链接。验证成功时的 message 和 402 的 message_ 都重复了这条规则。持有付费额度的账户可以不注明来源直接展示数据。
之后登录
After verify, the user can sign in with Google or GitHub using the same email address. That opens the same account, with the same key and balance. 该 身份验证指南 covers storing and rotating the key.
此页面对你有帮助吗?