API 文档
手机号段数据查询接口,仅高级会员在有效期内可调用。所有接口返回 JSON,同时支持 GET 与 POST。
鉴权方式
所有接口必须携带 API Key,放在请求头:
Authorization: Bearer YOUR_API_KEY
API Key 在 用户中心 查看;请勿泄露给他人。只有成功查询到数据才扣减 1 次额度,参数错误或未查询到数据不扣额度。
基础地址
http://phone.aohenggl.cn/api
请求方式
| 方式 | 参数位置 | 说明 |
|---|---|---|
| GET | URL 查询串 | http://phone.aohenggl.cn/api/phone?phone=13800138000 |
| POST (JSON) | 请求体 | Content-Type: application/json,请求体为 {"phone":"13800138000"} |
| POST (表单) | 请求体 | Content-Type: application/x-www-form-urlencoded,请求体为 phone=13800138000 |
在线测试
直接在浏览器调用接口,用于联调;仅查询成功时消耗该 Key 的 1 次额度。Key 只随本次请求发送,不会保存到页面或服务器配置中。
点击“发送请求”后在此查看响应。
代码示例
示例以 /api/phone 为例,每种语言都给出 GET 与 POST 两种写法;区域查询把路径换成 /api/area、参数换成 prefix、province(可填 全国)、可选的 city 与 isp 即可。
curl -H "Authorization: Bearer YOUR_API_KEY" \ "http://phone.aohenggl.cn/api/phone?phone=13800138000"
curl -X POST "http://phone.aohenggl.cn/api/phone" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phone":"13800138000"}'
<?php
$ch = curl_init('http://phone.aohenggl.cn/api/phone?phone=13800138000');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
CURLOPT_TIMEOUT => 10,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;
<?php
$ch = curl_init('http://phone.aohenggl.cn/api/phone');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode(['phone' => '13800138000']),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_API_KEY',
'Content-Type: application/json',
],
CURLOPT_TIMEOUT => 10,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status, PHP_EOL, $body, PHP_EOL;
import requests
resp = requests.get(
"http://phone.aohenggl.cn/api/phone",
params={"phone": "13800138000"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=10,
)
print(resp.status_code, resp.json())
import requests
resp = requests.post(
"http://phone.aohenggl.cn/api/phone",
json={"phone": "13800138000"},
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=10,
)
print(resp.status_code, resp.json())
const res = await fetch("http://phone.aohenggl.cn/api/phone?phone=13800138000", {
headers: { Authorization: "Bearer YOUR_API_KEY" },
});
console.log(res.status, await res.json());
const res = await fetch("http://phone.aohenggl.cn/api/phone", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ phone: "13800138000" }),
});
console.log(res.status, await res.json());
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "http://phone.aohenggl.cn/api/phone?phone=13800138000", nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(resp.StatusCode, string(body))
}
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{"phone":"13800138000"}`)
req, _ := http.NewRequest("POST", "http://phone.aohenggl.cn/api/phone", body)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
result, _ := io.ReadAll(resp.Body)
fmt.Println(resp.StatusCode, string(result))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Query {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://phone.aohenggl.cn/api/phone?phone=13800138000"))
.header("Authorization", "Bearer YOUR_API_KEY")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Query {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://phone.aohenggl.cn/api/phone"))
.header("Authorization", "Bearer YOUR_API_KEY")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{\"phone\":\"13800138000\"}"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_API_KEY");
var body = await client.GetStringAsync("http://phone.aohenggl.cn/api/phone?phone=13800138000");
Console.WriteLine(body);
}
}
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_API_KEY");
using var content = new StringContent(
"{\"phone\":\"13800138000\"}", Encoding.UTF8, "application/json");
var resp = await client.PostAsync("http://phone.aohenggl.cn/api/phone", content);
Console.WriteLine(await resp.Content.ReadAsStringAsync());
}
}
POST 也可以使用表单格式(application/x-www-form-urlencoded),参数名与 GET 一致;JSON 与表单二选一即可。
1. 手机号归属地查询
GET /api/phone?phone=13800138000
POST /api/phone,JSON 体 {"phone":"13800138000"}
请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
| phone | 是 | 11 位大陆手机号,1 开头,第二位 3-9 |
成功返回
HTTP 200
{
"code": 0,
"msg": "ok",
"data": {
"phone": "13800138000",
"segment": "1380013",
"prefix": "138",
"province": "北京",
"city": "北京",
"isp": "中国移动",
"tel_code": "010",
"postal_code": "100000",
"area_code": "110100"
}
}
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
| code | 数字 / 字符串 | 业务码:0 成功;A10001 未在库中找到该号段数据(不扣额度);400/401/403/500 见错误码表 |
| msg | 字符串 | 结果说明,成功为 ok |
| data | 对象 / null | 查询结果,失败或未找到时为 null |
| data.phone | 字符串 | 本次查询的手机号(原样返回) |
| data.segment | 字符串 | 号段,手机号前 7 位,如 1380013 |
| data.prefix | 字符串 | 号段前缀,手机号前 3 位 |
| data.province | 字符串 | 归属省份,如 北京 |
| data.city | 字符串 | 归属城市,如 北京 |
| data.isp | 字符串 | 运营商,如 中国移动 |
| data.tel_code | 字符串 | 城市区号,如 010 |
| data.postal_code | 字符串 | 邮政编码,如 100000 |
| data.area_code | 字符串 | 行政区划代码,如 110100 |
未找到数据返回
HTTP 200
{
"code": "A10001",
"msg": "未在库中找到该号段数据,本次查询不扣除额度",
"data": null
}
2. 按地区 + 号段查询(省 / 市 / 全国 / 运营商)
GET /api/area?prefix=138&province=山东(全省)
GET /api/area?prefix=138&province=山东&city=济南(市级)
GET /api/area?prefix=138&city=济南(只填城市,省份可省略)
GET /api/area?prefix=138&province=全国(全国)
GET /api/area?prefix=147&province=全国&isp=1(中国移动)
POST /api/area,JSON 体 {"prefix":"138","province":"全国","city":"济南","isp":"1"}(city、isp 可省略)
请求参数
| 参数 | 必填 | 说明 |
|---|---|---|
| prefix | 是 | 3 位数字号段前缀,如 138 |
| province | 条件必填 | 省份名称,如 山东(兼容 山东省);填 全国 查询全国。只填 city 时可省略,按全国范围查询该城市 |
| city | 否 | 城市名称,如 济南(兼容 济南市);填写后只返回该城市。不填 province 时按全国该城市查询 |
| isp | 否 | 运营商:1=中国移动、2=中国电信、3=中国联通、4=中国广电;不传查全部。按运营商主体筛选,包含该运营商的虚拟运营商、物联网卡等子类 |
成功返回(按省 / 按市)
HTTP 200
{
"code": 0,
"msg": "ok",
"data": {
"prefix": "138",
"province": "山东",
"city": "济南",
"isp": "",
"isp_name": "",
"scope": "city",
"count": 71,
"cities": {
"济南": ["1380531", "1380532"]
}
}
}
不传 city 时 scope 为 province,cities 为全省各城市;传 city 时 scope 为 city,cities 只包含该城市。只传 city 不传 province 时,province 按 全国 处理,返回结构与全国查询一致。
成功返回(全国)
HTTP 200
{
"code": 0,
"msg": "ok",
"data": {
"prefix": "138",
"province": "全国",
"city": "",
"isp": "",
"isp_name": "",
"scope": "nationwide",
"count": 10000,
"provinces": {
"山东": {
"count": 593,
"cities": {
"济南": ["1380531", "1380532"],
"青岛": ["1380533"]
}
},
"广东": {
"count": 700,
"cities": {
"广州": ["1380013"]
}
}
}
}
}
province=全国 时按省份 → 城市分组,避免不同省份的同名城市互相覆盖;data.count 为命中号段总数。全国查询会返回该前缀下的全部省市数据,响应体较大(如 138 约 100 KB),请按需调用。传 isp 时只统计该运营商的号段,返回示例中 isp 为编码、isp_name 为名称(如 1 / 中国移动)。
返回字段
| 字段 | 类型 | 说明 |
|---|---|---|
| code | 数字 / 字符串 | 0 成功;A10001 未找到符合条件的号段(不扣额度);其他见错误码表 |
| msg | 字符串 | 结果说明,成功为 ok |
| data | 对象 / null | 查询结果,失败或未找到时为 null |
| data.prefix | 字符串 | 请求的 3 位号段前缀 |
| data.province | 字符串 | 请求的省份;全国查询或只传 city 不传 province 时为 全国 |
| data.city | 字符串 | 请求的城市,未传时为空字符串 |
| data.isp | 字符串 | 请求的运营商编码(1~4),未传时为空字符串 |
| data.isp_name | 字符串 | 运营商名称,如 中国移动;未传时为空字符串 |
| data.scope | 字符串 | province 按省查询;city 按市查询;nationwide 全国查询(含只传 city 的情况) |
| data.count | 整数 | 命中的号段总数 |
| data.cities | 对象 | 省/市查询时返回:键为城市名,值为该城市下的 7 位号段数组(string[]) |
| data.provinces | 对象 | 全国查询时返回:键为省份名,值为 {count, cities},其中 cities 结构与 data.cities 相同 |
未找到数据返回
HTTP 200
{
"code": "A10001",
"msg": "未在库中找到符合条件的号段数据,本次查询不扣除额度",
"data": null
}
错误码
| code | HTTP | 说明 |
|---|---|---|
| 0 | 200 | 成功,扣减 1 次额度 |
| A10001 | 200 | 未查询到数据(号段/条件不存在),不扣额度 |
| 400 | 400 | 参数错误(不扣额度) |
| 401 | 401 | 缺少或无效 API Key(不扣额度) |
| 403 | 403 | 无权限、封禁、到期、额度不足、维护中(不扣额度) |
| 500 | 500 | 服务异常 |
鉴权失败示例
HTTP 401
{
"code": 401,
"msg": "缺少或无效的 API Key",
"data": null
}
无权限示例
HTTP 403
{
"code": 403,
"msg": "当前账号无 API 权限,请购买高级会员",
"data": null
}
使用条款
- 接口仅用于合法合规的号码归属地查询场景,禁止用于骚扰、诈骗等违法用途。
- 请合理控制请求频率,禁止恶意刷量;异常调用可能导致封禁。
- 仅当成功查询到数据时扣减 1 次额度;参数错误、未查询到数据(
A10001)不扣额度。