开发者
API 参考文档。
只需四次 HTTP 调用,即可订购一个真实电话号码、读取收到的验证码并作出回复。使用条件与控制面板相同:无需身份信息、无需合约,费用从您的加密货币余额中扣除。
- 基础 URL
- https://api.nokycphone.com/v1
- 版本
- v1 — 仅作向后兼容的增量变更
- 身份验证
- Authorization: Bearer nkp_live_…
- 内容类型
- application/json 或表单编码
快速入门
只需四次调用,便可从零开始获得一个带收件箱的可用号码。以下内容均可直接复制粘贴;替换密钥后即可使用。
- 在控制面板中创建账户,然后前往 API 密钥生成密钥。密钥以
nkp_live_开头,并且只显示一次。 - 使用加密货币为余额充值。号码费用从余额中扣除,绝不会从银行卡扣款。
- 订购一条线路。调用返回后,线路通常会在约一分钟内开通。
- 读取收件箱;也可以将 Webhook 指向您自己的端点,从而不再轮询。
# order a French mobile line for one month
curl -X POST https://api.nokycphone.com/v1/numbers \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…" \
-H "Idempotency-Key: 7d1e4c22-90aa-4d1f-8b0e-1c2f9a55b311" \
-H "Content-Type: application/json" \
-d '{"country":"fr","type":"mobile","period":1,"label":"signups"}'
# 201 Created
{
"id": "num_8f2c1a94",
"e164": "+33647189022",
"country": "fr",
"type": "mobile",
"status": "active",
"label": "signups",
"auto_renew": true,
"created_at": "2026-09-21T09:14:02Z",
"renews_at": "2026-10-21T09:14:02Z",
"charged": { "monthly": 12.90, "activation": 10.00, "total": 22.90, "currency": "USD" },
"balance_after": 77.10
}# read the inbox, newest first — the code is already extracted for you
curl "https://api.nokycphone.com/v1/numbers/num_8f2c1a94/messages?limit=2" \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…"
# 200 OK
{
"object": "list",
"has_more": false,
"data": [
{
"id": "msg_5b1f77c0",
"direction": "inbound",
"from": "Telegram",
"to": "+33647189022",
"body": "Your login code is 72194. Do not share it.",
"code": "72194",
"received_at": "2026-09-21T09:15:41Z"
},
{
"id": "msg_5b1f7411",
"direction": "inbound",
"from": "+14155550142",
"to": "+33647189022",
"body": "Your verification code: 408-113",
"code": "408113",
"received_at": "2026-09-21T09:14:58Z"
}
]
}code 字段替您完成繁琐工作。 我们采用与控制面板相同的提取规则:识别 4 至 8 位数字组合,去除空格和连字符,并忽略发送方自己的电话号码。如果未识别出疑似验证码的内容,code 会是 null,消息正文仍会保留。
身份验证
每次调用都必须在 Authorization 标头中携带 Bearer 密钥。默认不设第二重验证、请求签名或 IP 允许名单——密钥本身就是凭据,请按凭据的安全标准妥善保管。
Authorization: Bearer nkp_live_9f2c8a41d0b7e5…创建和轮换密钥
- 在控制面板的 API 密钥页面创建密钥。完整值只显示一次;我们保存的是哈希,而非密钥本身。
- 为每项集成单独创建并标记密钥。撤销其中一个不会影响其他密钥。
- 撤销立即生效。正在处理的请求会完成,下一次请求将返回
401。 - 每个账户最多可持有 10 个有效密钥。密钥不会自行过期。
权限范围
每个密钥都带有三种权限范围之一,在创建时选择。
| 权限范围 | 可执行操作 | 典型用途 |
|---|---|---|
read | 列出并获取号码、消息、通话和余额。 | 仪表盘、监控,以及只读取验证码的机器人。 |
write | 拥有 read 的全部权限,此外还可发送短信、编辑线路设置和管理 Webhook。 | 集成通常应选择此权限。 |
admin | 拥有 write 的全部权限,此外还可订购号码、续订、释放线路和发起充值。 | 任何会消耗余额的操作。 |
泄露的密钥可能会花掉您的余额。 如果拥有 admin 权限的密钥泄露,请先在控制面板中撤销它,再检查您的账本。链上付款无法撤销,而且我们没有您的电子邮箱可用于提醒——这正是不关联身份信息的账户所需承担的取舍。
约定
请求
- 基础 URL 为
https://api.nokycphone.com/v1。仅支持 HTTPS;普通 HTTP 请求会被拒绝,而不会重定向。 - 请求正文可以使用 JSON(
Content-Type: application/json)或表单编码。响应始终为 UTF-8 编码的 JSON。 - 请求正文中的未知字段会被忽略,不会触发错误,因此增量变更可以安全上线。
标识符与时间
- ID 是带类型前缀的不透明字符串:
num_、msg_、call_、vm_、whk_、top_。请勿解析其内部结构。 - 所有时间戳均采用 UTC 的 RFC 3339 格式,并以
Z结尾。时长以秒为单位;金额以美元计,并保留两位小数。 - 国家或地区代码采用小写 ISO 3166-1 alpha-2。号码始终使用 E.164 格式,并带有开头的
+。
分页
列表端点返回一个包含 object: "list"、data 数组和 has_more 的对象。使用 limit(1–100,默认 25)和 starting_after 分页;后者应传入您上一页看到的最后一个 ID。
curl "https://api.nokycphone.com/v1/messages?limit=50&starting_after=msg_5b1f7411" \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…"幂等性
对任何 POST 请求都可发送 Idempotency-Key 标头。我们会保存首次响应 24 小时;再次收到相同密钥时,将逐字节重放该响应,因此超时或重试绝不会重复订购两个号码。每个逻辑操作请使用新的 UUID。
可以安全重试。 如果请求从未到达我们这里,就不会保存密钥,重试会正常执行。如果请求已经到达,但在您一侧超时,我们会重放已保存的响应。无论哪种情况,最终都只会得到一个号码。
错误
错误使用标准状态码,并始终采用相同的数据结构。code 字段稳定可靠,可安全用于程序分支;message 面向用户编写,内容可能会变化。
{
"error": {
"type": "balance_error",
"code": "insufficient_balance",
"message": "Your balance is 4.10 USD; this order costs 22.90 USD.",
"param": null,
"doc": "https://nokycphone.com/api/#billing"
}
}| 状态 | 代码 | 发生了什么 |
|---|---|---|
400 | invalid_request | 缺少参数或参数格式错误。param 会指出相应参数。 |
401 | invalid_key | 密钥缺失、格式错误或已被撤销。 |
403 | insufficient_scope | 密钥有效,但其权限范围不包含此次调用。 |
403 | country_unavailable | 该国家或地区目前不接受新订单。 |
404 | not_found | 对象不存在,或属于其他账户。 |
409 | number_released | 线路已被释放,无法继续使用。 |
422 | unsupported_type | 该国家或地区不提供所请求类型的线路。 |
402 | insufficient_balance | 余额不足。发起充值后重试。 |
429 | rate_limited | 请求过多。请退避重试;参见速率限制。 |
503 | temporarily_unavailable | 依赖服务不可用。请采用退避策略重试,并查看服务状态。 |
端点索引
| 方法 | 路径 | 作用 |
|---|---|---|
GET | /v1/countries | 查询各国家和地区的可用情况与价格。 |
GET | /v1/numbers | 列出您的线路。 |
POST | /v1/numbers | 订购一条线路。 |
GET | /v1/numbers/{id} | 获取一条线路。 |
PATCH | /v1/numbers/{id} | 编辑标签、自动续订、主叫号码、免打扰时段、Webhook 和附加功能。 |
POST | /v1/numbers/{id}/renew | 立即续订一个周期。 |
DELETE | /v1/numbers/{id} | 立即释放线路。 |
GET | /v1/numbers/{id}/messages | 一条线路的收件箱。 |
GET | /v1/messages | 所有线路的消息。 |
GET | /v1/messages/{id} | 获取一条消息。 |
POST | /v1/messages | 发送短信。 |
GET | /v1/calls | 通话记录。 |
GET | /v1/voicemails/{id} | 获取包含转写文本和音频 URL 的语音留言。 |
GET | /v1/balance | 获取余额和近期账本记录。 |
POST | /v1/topups | 创建充值地址。 |
GET | /v1/topups/{id} | 跟踪一笔充值。 |
GET | /v1/webhooks | 列出端点。 |
POST | /v1/webhooks | 注册端点。 |
DELETE | /v1/webhooks/{id} | 移除端点。 |
国家和地区
订购前请先查询可用情况和价格。这里的价格与国家和地区页面一致并同步变动;此端点就是该价格表的机器可读版本。
curl https://api.nokycphone.com/v1/countries \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…"
# 200 OK
{
"object": "list",
"data": [
{
"code": "fr",
"name": "France",
"dial": "+33",
"region": "europe",
"types": ["mobile", "landline"],
"in_stock": true,
"price": { "mobile": 12.90, "landline": 10.30, "activation": 10.00, "currency": "USD" },
"premium_surcharge": 4.90
}
]
}可使用 ?type=mobile、?region=europe 或 ?in_stock=true 筛选。库存会根据运营商号码池实时检查,因此当某个国家或地区显示为 false 时,订单会以 country_unavailable 拒绝,而不会先收款再让您排队。
电话号码
订购线路
POST /v1/numbers 会从您的余额中扣款并开通线路。号码分配确认后调用即返回,通常不到一秒;线路会在约一分钟内开始接收消息和来电。
| 字段 | 类型 | 说明 |
|---|---|---|
country | 字符串,必填 | 小写 ISO 代码,例如 fr。 |
type | 字符串,必填 | mobile 或 landline。 |
period | 整数 | 1、3 或 12 个月,默认为 1 个月。季付优惠 10%,年付优惠 25%。 |
premium | 布尔值 | 请求易记号码组合。每月加收 $4.90。 |
e164 | 字符串 | 预订 /v1/numbers/available 返回的某个指定号码。 |
label | 字符串 | 您为线路自定义的名称,最多 40 个字符。 |
auto_renew | 布尔值 | 默认为 true。 |
addons | 字符串数组 | 可选值:ai-pickup、ai-screen、ai-summary、ai-trans。 |
webhook_url | 字符串 | 线路专用端点,会覆盖账户级端点。 |
每条线路只收取一次开通费。 首个周期收取 $10.00,之后续订不再收取。释放线路后再选择新号码,会被视为一次新的开通。
选择指定号码
先列出某个国家或地区当前可用的号码,此操作不会预留任何号码;随后传入所需号码的 e164 即可订购。候选号码不会保留,请在几分钟内完成订购。
curl "https://api.nokycphone.com/v1/numbers/available?country=de&type=mobile&premium=true" \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…"
# 200 OK
{
"object": "list",
"data": [
{ "e164": "+4915735550088", "pattern": "repeating", "surcharge": 4.90 },
{ "e164": "+4915735551234", "pattern": "sequential", "surcharge": 4.90 },
{ "e164": "+4915735557000", "pattern": "round", "surcharge": 4.90 }
]
}更新、续订与释放
# stop auto-renew, mask the caller ID, mute the line at night
curl -X PATCH https://api.nokycphone.com/v1/numbers/num_8f2c1a94 \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…" \
-H "Content-Type: application/json" \
-d '{"auto_renew":false,"mask_caller_id":true,"quiet_from":"23:00","quiet_to":"07:00"}'POST /v1/numbers/{id}/renew会立即收取下一个周期的费用,并将renews_at向后顺延。DELETE /v1/numbers/{id}会立即释放线路。线路将立刻停止接收,且无法恢复;号码会返回运营商号码池。- 因余额不足而续订失败的线路仍可使用 3 天,之后会自动释放。请通过 Webhook 关注
number.grace事件。
消息
读取
GET /v1/messages 涵盖账户中的所有线路;GET /v1/numbers/{id}/messages 返回相同的列表,但仅限一条线路。可使用 direction、from、since 和 has_code=true 筛选。
curl "https://api.nokycphone.com/v1/messages?has_code=true&since=2026-09-21T00:00:00Z" \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…"发送
POST /v1/messages 会从您的一条线路发送短信。外发短信每个分段收费 $0.08,费用从余额中扣除;长消息会拆分为多个分段,并按分段计费。
curl -X POST https://api.nokycphone.com/v1/messages \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…" \
-H "Content-Type: application/json" \
-d '{"from":"num_8f2c1a94","to":"+447700900123","body":"On my way."}'
# 202 Accepted
{
"id": "msg_9c04ab71",
"direction": "outbound",
"status": "queued",
"segments": 1,
"charged": 0.08,
"created_at": "2026-09-21T09:22:10Z"
}状态依次变为 queued → sent → delivered;失败时则为 failed,并附带 failure_code。请通过 message.status Webhook 监控状态,无需轮询。
发送功能用于对话,而非营销群发。 批量或未经请求的消息会导致线路被停用且不予退款;请参阅可接受使用政策。运营商往往会在我们发现之前就将其拦截,而且这会影响同一号段的所有用户。
通话与语音留言
每条线路都可以接听电话。未接来电会进入语音信箱,并被录音和转写;启用摘要附加功能后,还会压缩成一行摘要。
curl https://api.nokycphone.com/v1/voicemails/vm_31d9f0a2 \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…"
# 200 OK
{
"id": "vm_31d9f0a2",
"number": "num_8f2c1a94",
"from": "+33612345678",
"duration": 34,
"language": "fr",
"transcript": "Bonjour, c'est le service livraison, votre colis arrive demain entre 9h et 11h.",
"translation": "您好,这里是配送服务,您的包裹将于明天 9 点至 11 点送达。",
"summary": "明天 09:00–11:00 配送。",
"audio_url": "https://api.nokycphone.com/v1/voicemails/vm_31d9f0a2/audio",
"expires_at": "2026-10-21T09:14:02Z",
"received_at": "2026-09-21T09:31:44Z"
}audio_url需要使用相同的 Bearer 密钥,并返回audio/ogg。它不是公开链接。- 录音和转写文本会在收到 30 天后删除;如果您主动删除,则以更早时间为准。
- 转写支持 12 种语言,可通过每条线路的
voicemail_lang选择。
余额与充值
无需绑定银行卡,也没有待支付的账单。您持有以美元计价、由加密货币充值而来的余额;每次订购和续订都从中扣款。
# open a one-time deposit address for 50 USD in Monero
curl -X POST https://api.nokycphone.com/v1/topups \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…" \
-H "Content-Type: application/json" \
-d '{"amount_usd":50,"coin":"XMR"}'
# 201 Created
{
"id": "top_4a91c7e2",
"coin": "XMR",
"address": "46BeWrHpwXm…",
"amount_crypto": "0.2841",
"amount_usd": 50.00,
"rate_locked_until": "2026-09-21T10:05:00Z",
"status": "waiting",
"confirmations_required": 10
}- 汇率锁定 30 分钟。逾期付款时,我们会按款项到账时的币值入账,绝不会少于实际到账价值。
- 少付时,到账部分会作为部分款项入账;多付时,多出的金额也会计入余额。任何款项都不会退回发送方。
- 每个地址仅使用一次。重复使用旧地址是最容易丢失充值款的做法。
- 状态依次为
waiting → seen → confirming → credited;如果 3 小时内未检测到付款,则变为expired。
Webhooks
注册端点后即可停止轮询。我们会通过 POST 发送 JSON 正文,并期待在 10 秒内收到 2xx 响应;其他情况均视为失败并重试。
curl -X POST https://api.nokycphone.com/v1/webhooks \
-H "Authorization: Bearer nkp_live_9f2c8a41d0b7e5…" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.org/hooks/nkp","events":["message.received","call.missed"]}'
# 201 Created
{
"id": "whk_77c1e0",
"url": "https://example.org/hooks/nkp",
"events": ["message.received", "call.missed"],
"secret": "whsec_2b91f4c7a0d3…",
"created_at": "2026-09-21T09:40:00Z"
}事件
| 事件 | 触发时机 |
|---|---|
message.received | 您的一条线路收到短信,并携带提取出的验证码。 |
message.status | 外发短信变为已发送、已送达或失败。 |
call.missed | 来电未接听。语音留言会通过单独的事件发送。 |
voicemail.ready | 录音和转写文本已可用。 |
number.active | 订购的线路已经开通。 |
number.grace | 因余额不足而续订失败,宽限期倒计时开始。 |
number.released | 线路由您主动释放,或因到期而被释放。 |
topup.credited | 充值已确认,余额已经更新。 |
载荷与签名
POST /hooks/nkp HTTP/1.1
Content-Type: application/json
X-NKP-Event: message.received
X-NKP-Delivery: evt_6f0b28d4
X-NKP-Timestamp: 1789033541
X-NKP-Signature: v1=6b3a1f8e7c0d94aa5e2b…
{
"event": "message.received",
"created_at": "2026-09-21T09:45:41Z",
"data": {
"id": "msg_5b1f77c0",
"number": "num_8f2c1a94",
"e164": "+33647189022",
"from": "Telegram",
"body": "Your login code is 72194. Do not share it.",
"code": "72194",
"received_at": "2026-09-21T09:45:41Z"
}
}签名使用端点密钥,对 timestamp + "." + raw_body 执行 HMAC-SHA256,并编码为十六进制。请以恒定时间比较签名,并拒绝任何超过五分钟的请求。
import hmac, hashlib, time
def verify(secret, headers, raw_body):
ts = headers["X-NKP-Timestamp"]
if abs(time.time() - int(ts)) > 300:
return False
sent = headers["X-NKP-Signature"].split("=", 1)[1]
mine = hmac.new(secret.encode(), f"{ts}.".encode() + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(sent, mine)重试
- 约 24 小时内共尝试 8 次,并采用指数退避:10 秒、1 分钟、5 分钟、30 分钟、2 小时、6 小时、12 小时、24 小时。
- 事件至少投递一次。请根据
X-NKP-Delivery去重;同一个 ID 绝不会代表两个不同事件。 - 不保证投递顺序。如果顺序很重要,请使用
created_at。 - 如果一个端点连续三天的所有尝试均失败,该端点会被停用,控制面板会明确显示此状态。
先响应,再处理。 保存请求正文后请立即返回 200,然后再进行处理。处理程序如果超过 10 秒,会被视为失败,整个事件也会重新投递。
速率限制
| 类别 | 限制 | 范围 |
|---|---|---|
读取(GET) | 每分钟 120 个请求 | 每个密钥 |
写入(POST、PATCH、DELETE) | 每分钟 30 个请求 | 每个密钥 |
| 订购号码 | 每分钟 10 个、每天 200 个 | 每个账户 |
| 发送短信 | 每分钟 60 条 | 每条线路 |
| 同时进行的充值 | 3 笔 | 每个账户 |
每个响应都包含 X-RateLimit-Limit、X-RateLimit-Remaining 和 X-RateLimit-Reset。429 响应还会通过 Retry-After 给出等待秒数;请遵守该值,持续请求只会延长限制窗口。
客户端库
我们有意不提供官方 SDK:API 接口足够精简,封装库反而比 HTTP 调用更容易过时。下面分别给出两种语言的完整客户端。
const nkp = (path, init = {}) =>
fetch("https://api.nokycphone.com/v1" + path, {
...init,
headers: { Authorization: `Bearer ${process.env.NKP_KEY}`, "Content-Type": "application/json", ...init.headers },
}).then(async (r) => {
const body = await r.json();
if (!r.ok) throw new Error(body.error.code + ": " + body.error.message);
return body;
});
const line = await nkp("/numbers", { method: "POST", body: JSON.stringify({ country: "fr", type: "mobile" }) });
console.log(line.e164);import os, requests
S = requests.Session()
S.headers["Authorization"] = "Bearer " + os.environ["NKP_KEY"]
BASE = "https://api.nokycphone.com/v1"
def nkp(method, path, **kw):
r = S.request(method, BASE + path, timeout=15, **kw)
if not r.ok:
e = r.json()["error"]
raise RuntimeError(f"{e['code']}: {e['message']}")
return r.json()
line = nkp("POST", "/numbers", json={"country": "fr", "type": "mobile"})
print(line["e164"])更新日志
v1 只会增加字段和端点。任何会破坏现有集成的变更都将作为 v2 发布,之后 v1 仍会至少继续运行 12 个月。
| 日期 | 变更 |
|---|---|
| 2026 年 7 月 14 日 | 新增 premium 和 /v1/numbers/available:可在订购前选择易记号码。 |
| 2026 年 5 月 2 日 | 新增 addons 字段;voicemail.ready 现在会携带 summary。 |
| 2026 年 2 月 19 日 | 消息新增 has_code 筛选条件。重写验证码提取逻辑后,约多 30% 的消息会设置 code。 |
| 2025 年 11 月 6 日 | Webhook 签名改为带时间戳、以 v1= 为前缀的 HMAC。旧版无前缀标头支持至 2026 年 2 月。 |
| 2025 年 6 月 23 日 | 新增 starting_after 分页。偏移量分页在弃用六个月后移除。 |
| 2024 年 9 月 16 日 | v1 随服务一同上线。 |