尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

免费身份证归属地查询接口梳理与使用教程

免费身份证归属地查询接口梳理与使用教程 免费身份证归属地查询接口梳理与使用教程说明本文基于公开文档与社区文章整理未对每个接口做真实请求实测接口可用性、返回结构与字段命名以公开文档为准集成前请自行验证。身份证号属于敏感个人信息调用任何第三方接口前请评估数据合规与隐私风险。写在前面身份证号的前 6 位是地址码对应国家标准 GB/T 2260 里的省、市、区县行政区划。所谓身份证归属地查询本质上就是把这 6 位拿去查行政区划映射再结合校验位顺带解析出生日期、性别等信息。这类能力在会员注册预填、风控辅助核验、物流地址校验、用户地域分布统计等场景里很常见。下面把市面上能找到、写法相对完整的接口做个梳理覆盖免密钥直连和需自备密钥的免费额度两类供你按需挑选。通用坑提醒先看这一段能少踩很多弯路部分免费接口由个人或小团队托管稳定性、可用性、数据时效性都不保证生产环境务必加降级与缓存。行政区划会调整撤县设区、新设地级市等第三方数据的更新频率参差不齐关键业务不要只依赖单源。不能只看 HTTP 状态码。一个接口返回 200也可能恒返回空或常数俗称假活接入前用两个不同地域的合法身份证号验证返回是否随输入变化。身份证号是敏感个人信息传输建议走 HTTPS密钥放环境变量切勿硬编码进代码仓库。1. 接口总览接口请求地址说明HTTPS编码需要 Key来源类型万维易源 ShowAPIview/25https://route.showapi.com/25-3POST/GET返回省/市/区县 生日/性别是UTF-8是免费额度注册即用接口市场nxvavhttps://api.nxvav.cn/api/idcard/GET免密钥返回省/市/区 生日/性别/年龄是UTF-8否第三方托管铭心 mxin.moehttps://api.mxin.moe/api/v1/sfz/areaGET免密钥返回省/市/县是UTF-8否第三方托管aa1zj.v.api.aa1.cnhttps://zj.v.api.aa1.cn/api/sfz/GET免密钥返回省/市 性别/年龄是UTF-8否第三方托管apizerohttps://v1.apizero.cn/api/idcard-regionGET需 X-API-Key返回省/市/区县含国标码是UTF-8是免费额度API 平台2. 万维易源 ShowAPIview/25一句话定位接口市场提供的身份证归属地查询免费额度可用注册即送约 100 次/天、1 QPS需自备 appKey返回省/市/区县及出生日期、性别。请求示例POST参数放表单GET 同样支持appKey 走 querycurl -X POST https://route.showapi.com/25-3?appKeyYOUR_APPKEY \ -H content-type: application/x-www-form-urlencoded \ -d id110105199001010010返回示例{ showapi_res_code: 0, showapi_res_error: , showapi_res_id: ce135f6739294c63be0c021b76b6fbff, showapi_res_body: { errNum: 0, retData: { address: 北京市市辖区朝阳区, birthday: 1990-01-01, sex: F }, retMsg: success, ret_code: 0 } }注意事项必填参数id身份证号appKey走 query。appKey 可在万维易源控制台appKey 管理获取全文仅此一处说明。业务数据在showapi_res_body内retData.address籍贯、retData.birthday生日、retData.sex性别M 男 / F 女。外层showapi_res_code为系统级状态码业务异常看showapi_res_body.ret_code。本文按官方 OpenAPI 文档整理接入写法未返回真实业务数据免费额度有每日调用上限与 QPS 限制批量场景注意限速。3. nxvav一句话定位一个免密钥的公开接口除归属地外还能顺带解析出生日期、性别、年龄字段最全。请求示例curl https://api.nxvav.cn/api/idcard/?id110105199001010010返回示例{ code: 200, msg: 查询成功, data: { idCardNum: 110105199001010010, birthday: 1990-01-01, sex: 男, age: 36, address: 北京市市辖区朝阳区朝外街道 } }注意事项返回字段code200 成功、data.address完整归属地、data.sex、data.birthday、data.age。第三方托管可能出现限频或不稳定接入时对失败做降级处理。4. 铭心 mxin.moe一句话定位免密钥接口专注返回省 / 市 / 县三级行政区划结构干净。请求示例curl https://api.mxin.moe/api/v1/sfz/area?idcard110105199001010010返回示例{ code: 0, msg: OK, data: { province: 北京市, city: 朝阳区, county: 朝阳区 } }注意事项返回字段code0 成功、data.province/data.city/data.county。它对直辖市的市、区都填进了city/county如北京样例里city朝阳区、county朝阳区做字段映射时做兼容不要把city直接当地级市理解。响应里带了一个站点信息字段解析时忽略即可不要拿它做结构校验。5. aa1zj.v.api.aa1.cn一句话定位免密钥接口返回省 / 市及性别、年龄、是否成年等扩展信息。请求示例注意入参名是sfz与其它接口的id/idcard不同curl https://zj.v.api.aa1.cn/api/sfz/?sfz110105199001010010返回示例{ code: 200, msg: 身份证校验正确, data: { province: 北京市, city: null, sfz: 110105199001010010, sfz_mw: 110105******0010, xb: 男, age: 36, age_isage: 已成年, age_job: 社会人士 } }注意事项返回字段code200 成功、data.province/data.city部分号码city为 null、data.xb性别、data.age。入参名是sfz对接时注意区分。同样由第三方托管稳定性不保证。6. apizero一句话定位API 平台提供的身份证区划查询需 X-API-Key有免费额度返回省/市/区县三级且带国标代码并自动对完整身份证号脱敏回显。请求示例curl -sS -X GET \ -H X-API-Key: $APIZERO_API_KEY \ https://v1.apizero.cn/api/idcard-region?idcard110101199001011234返回示例{ code: 0, data: { province: {code: 110000, name: 北京市}, city: {code: 110100, name: 北京市}, district: {code: 110101, name: 东城区}, idcard: 110101************ }, msg: 成功 }注意事项鉴权用 HeaderX-API-Key密钥建议从环境变量读取勿硬编码。idcard支持 6 位区划代码、15 位或 18 位身份证号传入完整号时回显自动脱敏。直辖市city.name与province.name相同业务里可直接取province。服务端有缓存与更新窗口行政区划调整后最坏延迟约 30 天更新关键业务建议维护本地区划表做降级。横向对比维度ShowAPI view/25nxvav铭心 mxinaa1apizero是否需要 Key是免费额度否否否是免费额度返回格式JSON外层 ShowapiResEnvelope 包裹JSONJSONJSONJSONHTTPS是是是是是编码UTF-8UTF-8UTF-8UTF-8UTF-8返回内容省/市/区县 生日/性别省/市/区 生日/性别/年龄省/市/县省/市 性别/年龄省/市/区县含国标码已知限制需 appKeysex 为 M/F免费额度有上限第三方托管可能限频直辖市 city/county 填法特殊部分号码 city 为 null需密钥数据有更新窗口各有取舍没有哪个是全能最优。若你只要省/市/县三级铭心字段最干净若想顺带拿生日性别年龄nxvav 与 aa1 信息更全若需要国标代码或脱敏回显apizero 更合适若想要接口市场的稳定性与文档ShowAPI 免费额度可作为备选。具体用哪个取决于你的字段需求、对稳定性的容忍度以及是否愿意管理密钥文中不下该用哪个的结论。生产环境参考实现多源降级下面把所有源列为对等节点按发请求并落业务字段、失败切换下一源串联。各源排序交由调用方决定示例代码仅供集成参考。import os import requests # 各源配置密钥放环境变量勿硬编码 SOURCES [ { name: nxvav, url: https://api.nxvav.cn/api/idcard/, params: lambda idno: {id: idno}, headers: {}, parse: lambda d: { province: (d.get(data, {}).get(address) or ).split(市)[0][:3] if d.get(code) 200 else None, address: d.get(data, {}).get(address), sex: d.get(data, {}).get(sex), birthday: d.get(data, {}).get(birthday), }, }, { name: mxin, url: https://api.mxin.moe/api/v1/sfz/area, params: lambda idno: {idcard: idno}, headers: {}, parse: lambda d: { province: d.get(data, {}).get(province), city: d.get(data, {}).get(city), county: d.get(data, {}).get(county), }, }, { name: aa1, url: https://zj.v.api.aa1.cn/api/sfz/, params: lambda idno: {sfz: idno}, headers: {}, parse: lambda d: { province: d.get(data, {}).get(province), city: d.get(data, {}).get(city), sex: d.get(data, {}).get(xb), age: d.get(data, {}).get(age), }, }, { name: apizero, url: https://v1.apizero.cn/api/idcard-region, params: lambda idno: {idcard: idno}, headers: lambda: {X-API-Key: os.environ.get(APIZERO_API_KEY, )}, parse: lambda d: { province: d.get(data, {}).get(province, {}).get(name), city: d.get(data, {}).get(city, {}).get(name), district: d.get(data, {}).get(district, {}).get(name), }, }, { name: showapi, url: https://route.showapi.com/25-3, params: lambda idno: {id: idno, appKey: os.environ.get(SHOWAPI_APPKEY, )}, headers: {content-type: application/x-www-form-urlencoded}, parse: lambda d: { address: d.get(showapi_res_body, {}).get(retData, {}).get(address), birthday: d.get(showapi_res_body, {}).get(retData, {}).get(birthday), sex: d.get(showapi_res_body, {}).get(retData, {}).get(sex), }, }, ] def query_idcard(idno: str, timeout: float 5.0) - dict: 依次尝试各源返回第一个成功解析的结果含来源标识。 for src in SOURCES: try: resp requests.get( src[url], paramssrc[params](idno), headerssrc[headers]() if callable(src[headers]) else src[headers], timeouttimeout, ) resp.raise_for_status() data resp.json() parsed src[parse](data) if any(v for v in parsed.values()): return {source: src[name], idcard: idno, **parsed} except Exception: # 单源失败切换下一源 continue return {source: None, idcard: idno, error: 所有源均失败请检查网络/密钥或稍后重试} if __name__ __main__: print(query_idcard(110105199001010010))要点客户端做超时与降级对相同身份证前缀做本地缓存TTL 建议 30 分钟以内以减少外部调用密钥统一从环境变量读取记录脱敏后的请求与响应耗时便于排查。踩坑清单字段命名不统一有的用address有的用province/city/county有的用xb。对接时按源适配不要假设统一结构。直辖市特例北京/上海/天津/重庆的city常与province同名铭心接口甚至把区也填进city映射逻辑要做兼容。入参名不同nxvav 用idmxin/apizero 用idcardaa1 用sfzShowAPI 用id。接多个源时务必分别处理。性别表达不同ShowAPI 返回M/F其余多为男/女做统一输出时记得转换。假活风险免费第三方接口可能返回空或常数集成前用两个不同地域的合法号码验证返回随输入变化。稳定性免密钥接口多为个人/小团队托管可能随时限频、停服或改字段生产环境务必多源降级 本地缓存 监控。合规身份证号是敏感个人信息传输走 HTTPS密钥不落库脱敏日志遵守《个人信息保护法》。附录需自备密钥的接口一览以下接口在公开资料中出现频率高、写法相对完整但均需注册并自备密钥 / 配额多数含免费额度。是否选用由你自行决定接入前以官方文档为准聚合数据https://apis.juhe.cn/idcard/index?keycardno极速数据https://api.jisuapi.com/idcard/query?appkeyidcardRollToolsApihttps://www.mxnzp.com/api/idcard/search?idcardapp_idapp_secret接口盒子https://cn.apihz.cn/api/other/card.php?idkeycard码道 explinkshttps://www.explinks.com/api/kyc_idcard_infowapihttps://www.wapi.cn/api_detail/60/167.htmlxbronchttps://xbronc.com/freeapi/idCard?id公开写法显示免注册免密钥但仅单一来源未做充分验证列入此表供参考常见问题 FAQ问身份证归属地查询到底查的是什么 答查的是身份证号前 6 位地址码对应的行政区划依据国家标准 GB/T 2260再结合校验位解析出生日期与性别。问有没有完全免费、不需要密钥的接口 答有公开资料里 nxvav、铭心 mxin.moe、aa1 三个接口免密钥、直接 GET 即可调用适合个人项目与原型验证。问免密钥接口稳定吗 答多为第三方托管稳定性与可用性不保证可能限频或停服生产环境建议多源降级并加本地缓存。问ShowAPI 这个接口免费吗 答有免费额度注册即用约 100 次/天、1 QPS但需要自备 appKey超出额度会产生费用。问不同接口返回的字段为什么不一样 答各家命名习惯不同有的给address完整字符串有的拆成province/city/county性别有的用M/F有的用男/女接入时需按源适配。问直辖市的归属地怎么解析 答北京/上海/天津/重庆的city通常与province同名部分接口还会把区填进city映射逻辑要做兼容避免把city当地级市理解。问请求参数名都一样吗 答不一样nxvav 用idmxin 与 apizero 用idcardaa1 用sfzShowAPI 用id多源接入要分别处理。问怎么判断一个免费接口是不是假活 答用两个不同地域的合法身份证号分别请求看返回是否随输入变化、是否对应真实行政区划若恒返回空或同一段常数就是假活。问接入时密钥怎么管理最安全 答从环境变量或配置中心注入不要硬编码进代码定期轮换日志里只记脱敏后的身份证号。问身份证号算敏感信息吗调用第三方要注意什么 答算传输走 HTTPS选择合规的服务商遵循《个人信息保护法》不要无必要地把号码发给不可信的第三方。问行政区划调整后接口数据会马上变吗 答不会第三方数据有更新窗口有的资料提到最坏约 30 天关键业务建议维护本地区划表做降级兜底。问本地能不能不调用接口自己算归属地 答可以把国标地址码映射表CSV/SQLite集成到本地自主可控、无网络依赖、无调用费用代价是要自行维护数据更新。问本文里的接口都实测过吗 答没有本文基于公开文档与社区文章整理未对每个接口做真实请求实测接口可用性与字段以公开文档为准集成前请自行验证。
返回列表