NoKYCPhone

开发者

API 参考文档。

只需四次 HTTP 调用,即可订购一个真实电话号码、读取收到的验证码并作出回复。使用条件与控制面板相同:无需身份信息、无需合约,费用从您的加密货币余额中扣除。

  • REST + JSON
  • 一个 Bearer 密钥
  • 已签名的 Webhook
  • 47 个国家和地区
  • 号码约 60 秒开通
基础 URL
https://api.nokycphone.com/v1
版本
v1 — 仅作向后兼容的增量变更
身份验证
Authorization: Bearer nkp_live_…
内容类型
application/json 或表单编码

快速入门

只需四次调用,便可从零开始获得一个带收件箱的可用号码。以下内容均可直接复制粘贴;替换密钥后即可使用。

  1. 在控制面板中创建账户,然后前往 API 密钥生成密钥。密钥以 nkp_live_ 开头,并且只显示一次。
  2. 使用加密货币为余额充值。号码费用从余额中扣除,绝不会从银行卡扣款。
  3. 订购一条线路。调用返回后,线路通常会在约一分钟内开通。
  4. 读取收件箱;也可以将 Webhook 指向您自己的端点,从而不再轮询。
POST /v1/numbers
# 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
}
GET /v1/numbers/{id}/messages
# 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 标头
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。

GET /v1/messages
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 面向用户编写,内容可能会变化。

402 Payment Required(需要付款)
{
  "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"
  }
}
状态代码发生了什么
400invalid_request缺少参数或参数格式错误。param 会指出相应参数。
401invalid_key密钥缺失、格式错误或已被撤销。
403insufficient_scope密钥有效,但其权限范围不包含此次调用。
403country_unavailable该国家或地区目前不接受新订单。
404not_found对象不存在,或属于其他账户。
409number_released线路已被释放,无法继续使用。
422unsupported_type该国家或地区不提供所请求类型的线路。
402insufficient_balance余额不足。发起充值后重试。
429rate_limited请求过多。请退避重试;参见速率限制
503temporarily_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}移除端点。

国家和地区

订购前请先查询可用情况和价格。这里的价格与国家和地区页面一致并同步变动;此端点就是该价格表的机器可读版本。

GET /v1/countries
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字符串,必填mobilelandline
period整数1、3 或 12 个月,默认为 1 个月。季付优惠 10%,年付优惠 25%。
premium布尔值请求易记号码组合。每月加收 $4.90。
e164字符串预订 /v1/numbers/available 返回的某个指定号码。
label字符串您为线路自定义的名称,最多 40 个字符。
auto_renew布尔值默认为 true
addons字符串数组可选值:ai-pickupai-screenai-summaryai-trans
webhook_url字符串线路专用端点,会覆盖账户级端点。

每条线路只收取一次开通费。 首个周期收取 $10.00,之后续订不再收取。释放线路后再选择新号码,会被视为一次新的开通。

选择指定号码

先列出某个国家或地区当前可用的号码,此操作不会预留任何号码;随后传入所需号码的 e164 即可订购。候选号码不会保留,请在几分钟内完成订购。

GET /v1/numbers/available
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 }
  ]
}

更新、续订与释放

PATCH /v1/numbers/{id}
# 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 返回相同的列表,但仅限一条线路。可使用 directionfromsincehas_code=true 筛选。

GET /v1/messages?has_code=true&since=2026-09-21T00:00:00Z
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,费用从余额中扣除;长消息会拆分为多个分段,并按分段计费。

POST /v1/messages
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 监控状态,无需轮询。

发送功能用于对话,而非营销群发。 批量或未经请求的消息会导致线路被停用且不予退款;请参阅可接受使用政策。运营商往往会在我们发现之前就将其拦截,而且这会影响同一号段的所有用户。

通话与语音留言

每条线路都可以接听电话。未接来电会进入语音信箱,并被录音和转写;启用摘要附加功能后,还会压缩成一行摘要。

GET /v1/voicemails/{id}
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 选择。

余额与充值

无需绑定银行卡,也没有待支付的账单。您持有以美元计价、由加密货币充值而来的余额;每次订购和续订都从中扣款。

POST /v1/topups
# 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 响应;其他情况均视为失败并重试。

POST /v1/webhooks
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 到您的端点
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,并编码为十六进制。请以恒定时间比较签名,并拒绝任何超过五分钟的请求。

verify.py
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 个请求每个密钥
写入(POSTPATCHDELETE每分钟 30 个请求每个密钥
订购号码每分钟 10 个、每天 200 个每个账户
发送短信每分钟 60 条每条线路
同时进行的充值3 笔每个账户

每个响应都包含 X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset429 响应还会通过 Retry-After 给出等待秒数;请遵守该值,持续请求只会延长限制窗口。

客户端库

我们有意不提供官方 SDK:API 接口足够精简,封装库反而比 HTTP 调用更容易过时。下面分别给出两种语言的完整客户端。

node.mjs
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);
client.py
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 随服务一同上线。

接入一个
一分钟内开通的号码。

创建账户、充值,然后通过 API 订购第一条线路。整个过程中都无需提交任何证件。