电话号码查询

先了解号码信息, 再向其发送消息。

一次 POST,一个结果,无需创建或轮询资源。基础查询返回号码所属国家、当前服务网络、原始分配号段的网络、号码是否在两者之间迁移的标志,以及线路类型。通过指定名称,还可获取另外五个属性。

phone-number.ts
200
const answer = await bird.lookup.phoneNumber({
  phone_number: "+31612345678",
  type: ["classification", "porting"],
});

console.log(answer.country_code, answer.line_type);
// → "NL" "mobile"
console.log(answer.network_info?.carrier_name);
// → "KPN"
console.log(answer.original_network_info?.carrier_name);
// → "Vodafone"
console.log(answer.flags);
// → ["ported"]

if (answer.porting?.status === "ok") {
  console.log(answer.porting.ported, answer.porting.last_ported_at);
  // → true "2021-04-18T00:00:00Z"
}

两个网络,以及它们之间的差异。

这个差异就是携号转网在响应中的表现。

电话号码查询是 Bird Lookup API 中两个操作之一。发送国际格式的号码(带或不带前导加号),即可获得 country_code、一个包含当前服务运营商的 network_info 块,以及一个包含原始分配号段运营商的 original_network_info 块。当两者不一致时,表示号码已携号转网,flags 会标明。仅限国内格式的号码会被拒绝而非猜测处理,因此错误输入会明确报错,而不是返回关于错误国家的貌似合理的结果。

返回内容及返回时机。

前三项随每次查询返回。其余项在您于 type 中指定时返回。

  1. 01

    国家和两个运营商。

    country_code 是号段的 ISO 国家代码,对于非地理号码会缺省而非猜测。network_info 和 original_network_info 各包含运营商名称以及移动国家代码和网络代码——如果您基于 MCC 和 MNC 而非名称进行路由,这正是您需要的。

  2. 02

    线路类型,来自固定列表。

    mobile、fixed_line、voip、toll_free、premium_rate、satellite、pager、payphone、m2m、service、other 或 unknown。列表是封闭的,因此对其进行 switch 判断始终是穷举的;在决定 SMS 是否可行之前,应先检查此字段。

  3. 03

    携号转网标志,无额外费用。

    flags 中的 ported 表示号码曾在任何时候更换过网络。它随基础查询一起返回,因此判断号码是否曾经携号转网这一低成本问题,无需请求任何额外属性。

  4. 04

    classification,对线路的第二意见。

    来自不同数据源的更精细判断,包含 line_type 所没有的值:fixed_line_or_mobile、shared_cost、national_rate、personal_number、isp、voice_mail、short_codes 等。它在响应中与 line_type 并列而非替代,因此当号码看起来异常时,您可以对比两者。

  5. 05

    porting,包含日期和历史记录。

    ported 为布尔值,last_ported_at 为时间戳,当注册机构仅知月份时提供 last_ported_at_is_approximate,history 为按时间从早到晚排列的携号转网事件列表。每个事件包含一个注册机构特定的操作代码,适合展示但不建议用于逻辑分支。

  6. 06

    presence 和 roaming,来自实时网络。

    presence 查询网络并报告 reachable,这是判断线路是否开机的最接近方式。roaming 报告 is_roaming 以及访问网络的 MCC 和 MNC,因此来自外国网络号码的注册是可以直接看到而非推测的。

  7. 07

    score,0 到 100 的单一数值。

    一个综合可信度评分。它无法从其他属性推导得出,这正是请求它的意义所在:在注册流程中,您可以用一个整数设定阈值,而无需自行编写基于运营商名称和线路类型的规则。

每个属性都会告诉您它是否已响应。

每个块都有自己的状态:ok、unavailable 或 inconclusive。只有 ok 才会携带值,因此您无需检查响应来判断它是否为空,没有值的字段会被省略而非设为 null。计费遵循同样的逻辑:基础查询计费一次,属性仅在状态为 ok 时计费,查询失败则不计费。

properties.ts
200 · partial
const answer = await bird.lookup.phoneNumber({
  phone_number: "+31612345678",
  type: ["presence", "roaming", "score"],
});

// Only a block whose status is ok carries a value.
if (answer.presence?.status === "ok") {
  console.log(answer.presence.reachable);
}

if (answer.roaming?.status === "ok") {
  console.log(answer.roaming.is_roaming, answer.roaming.mcc, answer.roaming.mnc);
}

// unavailable and inconclusive both mean no value, and no charge.
if (answer.score?.status !== "ok") {
  console.log("no credibility score on this answer");
}

每次请求一个号码。

没有批量形式,这是设计使然:查询是对运营商数据的实时请求,批量操作会掩盖一千行中哪些已响应、哪些未响应。速率限制起始为每个操作凭证每分钟 10 次请求,Lookup 有独立的配额,因此筛选号码不会占用您的发送额度。发送 Idempotency-Key 后,重试会重放您已付费的结果,而非再次购买。

在文档中深入了解。

查询电话号码详细介绍了请求及其可返回的每个字段。Lookup 概览在一个页面中涵盖了两个操作和属性状态,速率限制记录了查询分组,幂等性解释了重放响应的费用。

电话号码查询常见问题解答。

格式、线路类型、携号转网,以及查询不能做什么。

电话号码查询能返回哪些信息?
基础查询会返回号码所属国家、当前服务网络、分配该号段的原始网络、是否曾经携号转网,以及粗略的线路类型。基础查询始终执行,如果无法返回结果,整个请求会失败,而不是返回一个半空的响应。
号码应该怎么写?
先写国家代码,再写国内号码。前导加号可省略,00 也可以替代加号,因此 +31612345678、31612345678 和 0031612345678 都是同一个号码。
为什么我的号码被拒绝了?
如果号码是按国内拨号格式书写、没有国家代码,系统会返回 E22000,而不是猜测号码。因为在 0612345678 前加上一个国家代码可能会指向其他地方的真实号码,并按该号码向您收取查询费用。
可以返回哪些线路类型?
mobile、fixed_line、voip、toll_free、premium_rate、satellite、pager、payphone、m2m、service、other 或 unknown。unknown 表示运营商平台对该号段没有分类记录,other 表示有一个分类但在此处没有对应项。请求 classification 属性可获取更精确的已分配服务信息。
如何判断号码是否已携号转网?
network_info 是当前为该号码提供服务的网络,original_network_info 是最初分配该号段的网络。号码携号转网后两者会不同,此时 flags 中会包含 ported。如果您还需要携号转网日期和完整记录,请请求 porting 属性。
为什么我的结果中没有 country_code?
因为该号码不属于任何单一国家,非地理号段即是如此。没有值的字段会被省略而非返回 null,因此响应中出现的每个字段都已被解析。
查询会拨打或发送消息给该号码吗?
不会。查询绝不会联系号码本身。它读取的是运营商和号码情报数据,presence 和 roaming 属性查询的是号码所注册的网络,因此不会有电话响起,也不会有任何内容到达手机。

付诸实践。

继续查阅此主题的文档、指南和示例。资源为英文。

获取实施简报

对一个您已知的号码运行首次查询。

控制台每次对单个号码执行相同操作,这是在编写任何代码之前查看结果的最快方式。

从一个渠道开始。
准备好后,再添加其他渠道。

测试 API 密钥即刻可用。添加支付方式并验证发送者身份后,即可解锁生产环境。

正在使用 Claude Code、Cursor 或 Codex?复制一条设置提示,您的智能代理即可自动安装 Bird CLI 和相关技能。选择您的工具:

Cursor