免费身份证归属地查询 接口实测

0 阅读15分钟

免费身份证归属地查询 接口实测评测

实测时间:2026-08-17
实测方式:通过百度 / 必应 / 搜狗三个搜索引擎检索「免费 身份证归属地查询」「身份证归属地查询 免费接口 api」等关键词,逐篇阅读候选文章正文,抽取其中出现的接口源并去重,对每个源用 curl 做三轮实测(基础请求 / 跟随跳转 / 补 Referer+UA),并以至少两个不同地域的合法身份证号验证返回数据是否正确、是否为"假活"。
样本说明:公开可直连、无需密钥的身份证归属地 HTTP 接口本就稀少。本次多轮检索与实测后,只有 3 个免费接口用两个样例验证返回了正确归属地、且排除"假活"。另有若干知名商业/免费额度接口需要自备密钥,本文未用真实密钥跑通业务数据,仅确认其路由与错误语义,统一在「需自备密钥的接口一览」中中性列出。其中用户指定的万维易源(ShowAPI)接口 view/25 先以无效 key 验证路由,随后在用户提供真实 appKey 的情况下完成双样例实测,返回数据与真实行政区划一致(详见第 6 节)。


写在前面转存失败,建议直接上传图片文件

写在前面

身份证号的前 6 位是地址码(依据国家标准 GB/T 2260),对应申领时的省、市、区县。所谓"身份证归属地查询",本质上就是拿这 6 位去查行政区划映射。

这里先提一个通用坑:不能只看 HTTP 状态码。一个接口返回 200,不代表它真的在干活——它可能返回恒为空、或恒为常数(比如永远返回同一个 IP / 同一段假数据),这种叫"假活"。本文对每个接口都用了两个不同地域的样例去验证返回内容是否随输入变化、是否对应真实行政区划,以此排除假活。


1. 可用接口总览

1. 可用接口总览

下表列出本文亲手实测到真实数据的接口(含免密钥与需密钥的免费额度类)。所有样例均使用合法校验位的身份证号,返回归属地与地址码一致。

接口请求地址说明HTTPS编码需要 Key本次是否实测到真实数据
nxvavhttps://api.nxvav.cn/api/idcard/?id={身份证号}GET,返回省/市/区+生日/性别/年龄UTF-8是(3 个样例)
铭心の接口 (mxin)https://api.mxin.moe/api/v1/sfz/area?idcard={身份证号}GET,返回省/市/县UTF-8是(2 个样例)
aa1 身份证校验 (zj)https://zj.v.api.aa1.cn/api/sfz/?sfz={身份证号}GET,返回省/市+性别/年龄UTF-8是(3 个样例)
万维易源 ShowAPI (view/25)POST/GET https://route.showapi.com/25-3?appKey={你的appKey}&id={身份证号}返回省/市/区县 + 生日/性别UTF-8是(免费额度,注册即用)是(2 样例,消耗 3 次免费额度)

前三个接口不需要密钥、直接 GET 即可调用,适合个人项目、原型验证、内部小工具。ShowAPI view/25 为免费额度接口(注册即用,100 次/天、1 QPS),需自备 appKey,本次在用户提供真实 appKey 下实测通过。四个接口均由第三方托管 / 服务商提供,稳定性与可用性不保证(详见后文"踩坑清单")。


2. nxvav — 无需密钥,返回最完整

2. nxvav — 无需密钥,返回最完整

一句话定位:一个免密钥的公开接口,除归属地外还能顺带解析出生日期、性别、年龄。

调用示例

curl "https://api.nxvav.cn/api/idcard/?id=110105199001010010"

实测返回(北京·朝阳,样例 1)

{
  "code": 200,
  "msg": "查询成功!",
  "data": {
    "idCardNum": "110105199001010010",
    "birthday": "1990-01-01",
    "sex": "男",
    "age": 36,
    "address": "北京市市辖区朝阳区朝外街道"
  }
}

另一个地域的样例(广东·深圳·南山,样例 2)

{
  "code": 200,
  "msg": "查询成功!",
  "data": {
    "idCardNum": "44030519850615002X",
    "birthday": "1985-06-15",
    "sex": "女",
    "age": 41,
    "address": "广东省深圳市南山区南头街道"
  }
}

注意事项

  • 返回字段:code(200 成功)、data.address(完整归属地)、data.sexdata.birthdaydata.age
  • 实测发现该接口对出生年份早于 1900 的号码会直接拒绝(返回 {"code":400,"msg":"出生年份不能早于1900年"})。这是业务规则,不是假活,但接入时要注意对老号码做兼容或提示。
  • 第三方托管,可能出现限频或不稳定。

3. 铭心の接口 (mxin.moe) — 无需密钥,字段精简

3. 铭心の接口 (mxin.moe) — 无需密钥,字段精简

一句话定位:免密钥接口,专注返回省 / 市 / 县三级行政区划,结构干净。

调用示例

curl "https://api.mxin.moe/api/v1/sfz/area?idcard=110105199001010010"

实测返回(北京·朝阳,样例 1)

{
  "code": 0,
  "msg": "OK",
  "data": {
    "province": "北京市",
    "city": "朝阳区",
    "county": "朝阳区"
  }
}

另一个地域的样例(广东·深圳·南山,样例 2)

{
  "code": 0,
  "msg": "OK",
  "data": {
    "province": "广东省",
    "city": "深圳市",
    "county": "南山区"
  }
}

注意事项

  • 返回字段:code(0 成功)、data.province / data.city / data.county
  • 注意它把直辖市的市、区都填进了 city/county(如北京样例里 city=朝阳区、county=朝阳区),做字段映射时要做兼容,不要把 city 直接当"地级市"理解。
  • 响应里带了一个 meta 字段(站点信息),解析时忽略即可,不要拿它做结构校验。

4. aa1 身份证校验 (zj.v.api.aa1.cn) — 无需密钥,带性别年龄

4. aa1 身份证校验 (zj.v.api.aa1.cn) — 无需密钥,带性别年龄

一句话定位:免密钥接口,返回省 / 市及性别、年龄、是否成年等扩展信息。

调用示例

curl "https://zj.v.api.aa1.cn/api/sfz/?sfz=110105199001010010"

实测返回(北京,样例 1)

{
  "code": 200,
  "msg": "身份证校验正确",
  "data": {
    "province": "北京市",
    "city": null,
    "sfz": "110105199001010010",
    "sfz_mw": "110105******0010",
    "xb": "男",
    "age": 36,
    "age_isage": "已成年",
    "age_job": "社会人士"
  }
}

另一个地域的样例(四川·绵阳,样例 3)

{
  "code": 200,
  "msg": "身份证校验正确",
  "data": {
    "province": "四川省",
    "city": "绵阳市",
    "sfz": "510704199203070039",
    "xb": "男",
    "age": 34,
    "age_isage": "已成年"
  }
}

注意事项

  • 返回字段:code(200 成功)、data.province / data.city(部分号码 city 为 null)、data.xb(性别)、data.age
  • 入参名是 sfz=(与其它两个接口的 id= / idcard= 不同),对接时注意区分。
  • 同样由第三方托管,稳定性不保证。

5. 横向对比

5. 横向对比

维度nxvav铭心(mxin)aa1(zj)易源 ShowAPI
是否需要 Key是(免费额度)
返回格式JSONJSONJSONJSON(外层 ShowapiResEnvelope 包裹)
HTTPS
编码UTF-8UTF-8UTF-8UTF-8
返回内容省/市/区 + 生日/性别/年龄省/市/县省/市 + 性别/年龄省/市/区县 + 生日/性别
本次实测真实数据是(3 样例)是(2 样例)是(3 样例)是(2 样例)
已知限制拒收 1900 年前出生city/county 对直辖市填法特殊部分号码 city 为 null需 appKey;返回 sex 为 M/F;免费额度 100 次/天、1 QPS

三个接口各有取舍,没有哪个是"全能最优"。若你只需要省/市/县三级,铭心字段最干净;若还想顺带拿生日性别年龄,nxvav 与 aa1 信息更全。具体用哪个,取决于你的字段需求与对稳定性的容忍度,文中不下"该用哪个"的结论。


6. 需自备密钥的接口一览

6. 需自备密钥的接口一览

以下接口在检索中出现频率高、资料完整,且均需注册并自备密钥 / 配额。其中 ShowAPI view/25 已由用户在提供真实 appKey 的情况下完成实测(见本节末专节);其余仅确认其存在与调用形态,是否选用由你自行决定。

接口接入点(文档形态)需要 Key本文处理
万维易源 ShowAPI view/25POST/GET https://route.showapi.com/25-3?appKey={你的appKey},参数 id是(免费额度,注册即用)已实测:用户真实 appKey 下双样例通过,返回正确(见本节末专节)
接口盒子 (apihz)https://cn.apihz.cn/api/other/card.php?id=&key=&card=是(可用公共 ID/KEY,但实测被限频)路由存活,公共凭据限频,未验证真实数据
聚合数据 juhehttps://apis.juhe.cn/idcard/index?key=&cardno=https://apis.juhe.cn/mobile_idcard/query未验证
极速数据 jisuapihttps://api.jisuapi.com/idcard/query?appkey=&idcard=未验证
RollToolsApi (mxnzp)https://www.mxnzp.com/api/idcard/search?idcard=&app_id=&app_secret=未验证
天聚数行 TianAPI / 探数数据 / wapi.cn / 简化云(腾讯云市场) / alapi 等各家文档接入点未验证

ShowAPI view/25(身份证归属地查询)实测记录(用户提供真实 appKey)

  • 接入点 25-3,请求参数 id(身份证号),网关 https://route.showapi.com/25-3
  • 鉴权:URL query 参数 appKey(注意:该市场接口为 appKey 直验,无需额外的 sign 签名;与部分 ShowAPI 文档示例不同)。不传 key 返回 showapi_res_code:-1002、key 无效返回 -1004,HTTP 均为 200。
  • 免费额度:注册即用,100 次/天、1 QPS。本次实测消耗 3 次免费调用额度(样本 1 的 POST+GET 各 1 次、样本 2 的 GET 1 次)。
  • 返回结构:外层 ShowapiResEnvelope 包裹(showapi_res_code / showapi_fee_num / showapi_res_body);业务数据在 showapi_res_body.retDataaddress / birthday / sex / province / city / county)。注意 sexM/F(非中文)。

调用示例(appKey 请替换为你自己的):

curl "https://route.showapi.com/25-3?appKey=你的appKey&id=110105199001010010"

实测返回(北京·朝阳,样例 1)

{
  "showapi_res_code": 0,
  "showapi_fee_num": 1,
  "showapi_res_body": {
    "errNum": 0, "retMsg": "success", "ret_code": 0,
    "retData": {
      "sex": "M", "province": "北京市", "city": "市辖区",
      "birthday": "1990-01-01", "address": "北京市朝阳区", "county": "朝阳区"
    }
  }
}

实测返回(广东·深圳·南山,样例 2)

{
  "showapi_res_code": 0,
  "showapi_fee_num": 1,
  "showapi_res_body": {
    "errNum": 0, "retMsg": "success", "ret_code": 0,
    "retData": {
      "sex": "F", "province": "广东省", "city": "深圳市",
      "birthday": "1985-06-15", "address": "广东深圳市南山区", "county": "南山区"
    }
  }
}

两个不同地域样本均返回与地址码一致的正确数据,排除"假活"。接口经真实 appKey 实测通过,故已纳入上文"已实测可用"清单(标记需 Key)。


7. 生产环境参考实现(多源降级)

7. 生产环境参考实现(多源降级)

下面把上文 3 个已验证的免费接口列为对等降级节点:按顺序尝试,某个源不可用时自动切到下一个;是否、以及如何排序这些源,交由调用方自行决定。代码只做"取业务字段"的通用逻辑,不对任何源做优先/兜底暗示。

import json
import urllib.request
import urllib.parse

# 三个已实测的免费源,列为对等降级节点
SOURCES = [
    {
        "name": "nxvav",
        "url": lambda n: f"https://api.nxvav.cn/api/idcard/?id={n}",
        "parse": lambda d: d.get("data", {}).get("address"),
    },
    {
        "name": "mxin",
        "url": lambda n: f"https://api.mxin.moe/api/v1/sfz/area?idcard={n}",
        "parse": lambda d: (d.get("data") or {}).get("province"),
    },
    {
        "name": "aa1_zj",
        "url": lambda n: f"https://zj.v.api.aa1.cn/api/sfz/?sfz={n}",
        "parse": lambda d: (d.get("data") or {}).get("province"),
    },
]

def query(idcard: str) -> dict:
    """按顺序尝试已验证源,返回第一个成功取到归属地的源。"""
    for src in SOURCES:
        try:
            with urllib.request.urlopen(src["url"](idcard), timeout=5) as r:
                body = json.loads(r.read().decode("utf-8"))
            region = src["parse"](body)
            if region:                      # 业务字段非空才算成功
                return {"ok": True, "source": src["name"], "region": region}
        except Exception:
            continue                        # 该源不可用,降级到下一个
    return {"ok": False, "region": None}

if __name__ == "__main__":
    print(query("110105199001010010"))

若你也使用了需密钥的接口(如 ShowAPI view/25),可把上面 SOURCES 里的 url 改为带 appKey 的闭包、并在 parse 里取 showapi_res_body.retData.address 即可,鉴权与降级逻辑复用同一套。

接入要点:

  • 超时与降级:每个源加超时,失败即切下一个;全部失败再做兜底(提示用户或走本地数据,见下)。
  • 限频:免费第三方接口普遍限频,生产环境建议加本地缓存(同一身份证号结果缓存),减少重复请求。

8. 踩坑清单

8. 踩坑清单

  • 只看状态码会踩"假活":返回 200 但内容恒为空/常数,一律视为不可用。本文所有接口都用了两个不同地域样例交叉验证。
  • nxvav 拒收 1900 年前出生:老身份证(出生年份 < 1900)会返回 400 业务错误,接入时要兼容或提示。
  • 铭心接口对直辖市的 city/county 填法特殊:北京样例里 city=朝阳区county=朝阳区,不要机械地把 city 当成"地级市"。
  • aa1(zj) 部分号码 city 为 null:只保证 province 稳定,取市一级时要做空值兜底。
  • 免费第三方接口稳定性不保证:这类接口多由个人开发者托管,可能因限频、停机、域名过期而失效(本次检索中就有若干早年文章提到的接口已 404 / 域名无法解析,如 xbronc.comapi.guaqb.cn 的旧路径、sojson.com/api/idcard 等)。
  • 参数名不统一id / idcard / sfz / cardno 各不相同,对接前务必看各源文档。

9. 附录:提醒

9. 附录:提醒

  • 网上流传的同类接口,很多需要自备密钥或已不稳定;本文未纳入正文的密钥类接口(含 ShowAPI view/25、聚合、极速、RollToolsApi 等)均只确认了路由/文档形态,未经真实业务数据验证,接入前请自行用有效密钥复测。
  • "假活"风险是通用提醒,不针对任何具体产品:部分接口会返回 HTTP 200 但内容恒为空或恒为常数,务必用多个不同输入验证返回是否随输入变化、是否对应真实行政区划。
  • 隐私与合规:把身份证号发给第三方接口,等于把个人敏感信息传出本地。对内网/生产环境,优先考虑本地方案——直接按前 6 位地址码查 GB/T 2260 行政区划数据(如开源的 province-city-chinacnregion 等本地数据包),数据不出本地、无调用费用、无网络依赖,只是需要自行维护行政区划变更。

10. 常见问题 FAQ

1. 身份证归属地查询的原理是什么?
身份证号前 6 位是地址码,对应国家标准 GB/T 2260 的行政区划代码。查询就是把这 6 位映射到对应的省、市、区县名称。

2. 这些免费接口需要密钥吗?
本文实测可用的 4 个中,nxvav、铭心 mxin、aa1 zj 三个不需要密钥、直接 GET 调用;万维易源 ShowAPI(view/25)也已用真实 appKey 实测通过,但属于免费额度接口,需注册并自备 appKey(100 次/天、1 QPS)。其余商业/免费额度类接口(聚合、极速、RollToolsApi 等)同样需要自备密钥。

3. 返回的数据准确吗?
基于地址码映射,反映首次申领身份证时的户籍所在地(发证地),不是持卡人当前实际居住地。行政区划会调整(撤县设区等),数据更新不及时可能导致旧号查询偏差。

4. 什么是"假活"?怎么判断?
指接口返回 HTTP 200,但内容恒为空或恒为常数(如永远返回同一个假数据)。判断方法是用多个不同地域的合法号码请求,看返回是否随输入变化、是否对应真实行政区划。

5. 为什么有的接口对老身份证报错?
部分接口有业务规则限制,例如 nxvav 会拒绝出生年份早于 1900 的号码。这是接口自身策略,不是数据错误,接入时需注意兼容。

6. 免费接口稳定吗?
本文列出的免费接口多由第三方开发者托管,可能出现限频、停机或域名过期。本次检索中就发现多个早年文章提到的接口已失效(404 或域名无法解析)。

7. 商用接口和免费接口有什么区别?
商用/免费额度接口通常需要密钥、有每日/每秒调用限额,但一般有服务商维护、SLA 与文档支持;免费第三方接口无密钥但稳定性与可用性不保证。是否选用取决于你的稳定性与合规要求。

8. 把身份证号发给第三方接口安全吗?
身份证号属于个人敏感信息。发给第三方意味着信息传出本地,需评估对方的数据留存与隐私政策,并尽量走 HTTPS、最小化传输。对隐私要求高的场景建议用本地方案。

9. 有没有不把身份证号发给第三方的方法?
有。直接按前 6 位地址码查本地的 GB/T 2260 行政区划数据包(如开源的 province-city-chinacnregion),数据不出本地、无费用、无网络依赖,只是要自行维护数据更新。

10. 怎么自己写多源降级调用?
把已验证源列为对等节点,按顺序请求,某个源不可用时自动切到下一个;只看业务字段是否非空,不要只看 HTTP 状态码。示例代码见第 7 节。

11. 不同接口返回的省/市/县字段不一样怎么办?
不同源字段命名与粒度有差异(如有的 city 对直辖市填法特殊、有的 city 可能为 null)。对接时按字段做兼容映射,并对缺失字段做兜底。

12. 这些接口今天还能用吗?怎么自己复测?
接口随时可能变动。可用以下命令自行复测(替换为合法校验位的号码):

curl "https://api.nxvav.cn/api/idcard/?id=110105199001010010"
curl "https://api.mxin.moe/api/v1/sfz/area?idcard=110105199001010010"
curl "https://zj.v.api.aa1.cn/api/sfz/?sfz=110105199001010010"

若返回结构与本文示例一致且归属地正确,即说明仍可用。

ShowAPI 可用以下命令复测(替换为你自己的 appKey):

curl "https://route.showapi.com/25-3?appKey=你的appKey&id=110105199001010010"

若返回 showapi_res_code:0retData.address 正确,即说明仍可用。