接口概述
一句话说明
region.query 是 XAPI 提供的行政区划数据查询接口,返回省 / 市 / 区县三级名称、 行政区划代码(Adcode)与邮政编码。 数据源为国家统计局行政区划代码与邮政编码整理数据, 每周日凌晨全量同步一次(新增 → 插入,变更 → 更新,源数据中移除 → 逻辑删除), 可安全用于地址解析、三级联动、邮编填充等场景。
| 请求地址 | https://api.xujian.tech/openapi/region/query |
|---|---|
| 请求方式 | GET |
| 鉴权方式 | 请求头 X-API-Key(不做签名与加密) |
| 接口编码 | region.query |
| 收费类型 | PER_CALL(按次计费,0.0100 元/次) |
| 响应格式 | JSON,Content-Type: application/json;charset=UTF-8 |
| 是否需要授权 | 否(无需授权,API Key 有效且余额充足即可调用) |
| 数据更新频率 | 每周日 03:00 全量同步,支持管理端手动触发 |
| 典型用途 | 省市区三级联动、地址解析与标准化、邮政编码填充、行政区划代码转换、报表区域归类 |
快速开始
把 你的APIKey 换成控制台获取的 API Key,按行政区划代码精确查询:
curl -s "https://api.xujian.tech/openapi/region/query?code=110101" \
-H "X-API-Key: 你的APIKey"
查询全部省份(level=1)
curl -s "https://api.xujian.tech/openapi/region/query?level=1&limit=100" \
-H "X-API-Key: 你的APIKey"
查某省的全部地市(只传 province)
curl -s "https://api.xujian.tech/openapi/region/query?province=%E6%B5%99%E6%B1%9F%E7%9C%81&limit=100" \
-H "X-API-Key: 你的APIKey"
查某市的全部区县(传 city)
curl -s "https://api.xujian.tech/openapi/region/query?province=%E6%B5%99%E6%B1%9F%E7%9C%81&city=%E6%9D%AD%E5%B7%9E%E5%B8%82&limit=100" \
-H "X-API-Key: 你的APIKey"
三级联动推荐调用顺序
level=1&limit=100→ 全部省份(约 34 条,code为 6 位省级代码,如 110000 北京市)province=浙江省(不传 level) → 该省全部地市,level返回 2province=浙江省&city=杭州市→ 该市全部区县,level返回 3
第二、三步为接口的自动下钻行为:只要没有传 code / keyword / zipCode / level,
传 province 即返回地市、传 city 即返回区县;如需跳过下钻取其自身明细,显式传 level=3。
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
X-API-Key |
String | 是 | 开发者 API Key,在控制台创建后获取;缺失或无效会返回失败 |
| 参数名 | 类型 | 必填 | 示例 | 说明 |
|---|---|---|---|---|
code |
String | 否 | 110101 | 行政区划代码精确查询(区县级 6 位,省直辖县级 9 位) |
keyword |
String | 否 | 朝阳 | 名称 / 城市 / 省份 / 拼音模糊匹配 |
province |
String | 否 | 浙江省 | 省份名称精确匹配。仅传 province(不带 code / keyword / zipCode / city / level)时, 返回该省下的全部地市(level=2),如浙江省 → 杭州市、宁波市…… |
city |
String | 否 | 杭州市 |
城市名称精确匹配。传了 city(不带 code / keyword / zipCode / level)时,
返回该市下的全部区县(level=3),如杭州市 → 上城区、拱墅区……
可与 province 组合以限定省份
|
zipCode |
String | 否 | 100010 | 邮政编码精确匹配 |
level |
Integer | 否 | 1 |
层级过滤,优先级最高:1 返回全部省级列表(去重,约 34 条,可直接作为三级联动第一级);
2 返回地市级列表(去重,配合 province 可限定某省的地市);
3 返回区县明细(可与 province / city 等任意条件组合)。
不传 level 时由接口按下钻规则自动判定:只传 province → 地市,传了 city → 区县
|
limit |
Integer | 否 | 20 | 返回条数,默认 20,最大 100(查全部省份请用 limit=100) |
响应参数
| 字段 | 类型 | 说明 |
|---|---|---|
code |
int | 状态码,0 表示成功,非 0 表示失败(常见为 500) |
msg |
String | 结果描述,成功为 success,失败为具体原因 |
data |
Object | 业务数据,失败时为 null |
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
total |
Integer | 1 | 本次返回的记录条数 |
list |
Array | [{...}] | 行政区划记录列表,字段见下表 |
apiCode |
String | region.query | 接口编码 |
apiName |
String | 行政区划查询 | 接口名称 |
chargeType |
String | PER_CALL | 计费类型:FREE 免费 / PER_CALL 按次 / MONTHLY 按月 / YEARLY 按年(本接口后台配置为 PER_CALL) |
balance |
BigDecimal | 100.0000 | 调用完成后(已扣费)的账户余额(元) |
costMs |
Long | 5 | 本次调用耗时(毫秒) |
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
code |
String | 110101 | 行政区划代码 |
name |
String | 东城区 | 区县名称 |
city |
String | 北京市 | 地级市名称 |
cityCode |
String | 1101 | 地级市代码 |
province |
String | 北京市 | 省级名称 |
provinceCode |
String | 11 | 省级代码 |
zipCode |
String | 100010 | 邮政编码 |
pinyin |
String | dong cheng | 区县名称拼音 |
level |
Integer | 3 | 层级:1 省 / 2 市 / 3 区县 |
响应示例
成功(code = 0)—— 按代码查区县明细
{
"code": 0,
"msg": "success",
"data": {
"total": 1,
"list": [
{
"code": "110101",
"name": "东城区",
"cityCode": "1101",
"city": "北京市",
"provinceCode": "11",
"province": "北京市",
"zipCode": "100010",
"pinyin": "dong cheng",
"level": 3
}
],
"apiCode": "region.query",
"apiName": "行政区划查询",
"chargeType": "PER_CALL",
"balance": 100.0000,
"costMs": 5
}
}
成功(code = 0)—— province=浙江省,返回该省全部地市
{
"code": 0,
"msg": "success",
"data": {
"total": 11,
"list": [
{
"code": "330100",
"name": "杭州市",
"cityCode": "3301",
"city": "杭州市",
"provinceCode": "33",
"province": "浙江省",
"zipCode": "",
"pinyin": "",
"level": 2
},
{
"code": "330200",
"name": "宁波市",
"cityCode": "3302",
"city": "宁波市",
"provinceCode": "33",
"province": "浙江省",
"zipCode": "",
"pinyin": "",
"level": 2
}
],
"apiCode": "region.query",
"apiName": "行政区划查询",
"chargeType": "FREE",
"balance": 100.0000,
"costMs": 6
}
}
地市级与省级为聚合结果:zipCode / pinyin 返回空字符串(邮编与拼音只在区县级明细上有值),
code 分别补位为 6 位市级 / 省级代码。
失败(未传查询条件)
{
"code": 500,
"msg": "code / keyword / province / city / zipCode / level 至少填写一个查询条件",
"data": null
}
错误码与常见失败原因
| code | msg(示例) | 处理建议 |
|---|---|---|
| 0 | success | 调用成功 |
| 500 | 缺少请求头 X-API-Key | 在请求头中补充 X-API-Key |
| 500 | API Key 无效 / API Key 已停用 | 检查 Key 是否正确,或在控制台重新启用 |
| 500 | 客户不存在或已停用 | 联系平台运营确认账号状态(可联系微信xujian_cq) |
| 500 | 接口不存在或已停用 | 确认接口编码 region.query 当前是否维护中 |
| 500 | 余额不足,请先充值。可联系微信xujian_cq | 按次计费接口在调用前校验余额,余额不足时不扣费,充值后重试(可联系微信xujian_cq) |
| 500 | code / keyword / province / city / zipCode / level 至少填写一个查询条件 | 补充至少一个查询条件后重试(查全部省份请传 level=1) |
| 500 | level 取值只能是 1 省 / 2 市 / 3 区县 | level 只能传 1、2、3 |
多语言代码示例
Java(Hutool)
String body = HttpRequest.get("https://api.xujian.tech/openapi/region/query")
.form("keyword", "朝阳")
.form("province", "北京市")
.form("limit", 10)
.header("X-API-Key", apiKey)
.timeout(5000)
.execute()
.body();
JSONObject json = JSONUtil.parseObj(body);
if (json.getInt("code") == 0) {
JSONArray list = json.getJSONObject("data").getJSONArray("list");
list.forEach(o -> {
JSONObject item = (JSONObject) o;
System.out.println(item.getStr("code") + " " + item.getStr("province")
+ item.getStr("city") + item.getStr("name") + " " + item.getStr("zipCode"));
});
}
Python
import requests
resp = requests.get(
"https://api.xujian.tech/openapi/region/query",
params={"code": "110101"},
headers={"X-API-Key": API_KEY},
timeout=5,
)
data = resp.json()
if data["code"] == 0:
for item in data["data"]["list"]:
print(item["province"], item["city"], item["name"], item["zipCode"])
JavaScript(浏览器 / Node 18+)
const url = new URL("https://api.xujian.tech/openapi/region/query");
url.searchParams.set("keyword", "朝阳");
url.searchParams.set("limit", 20);
const resp = await fetch(url, { headers: { "X-API-Key": API_KEY } });
const { code, data } = await resp.json();
if (code === 0) {
data.list.forEach((r) => console.log(r.code, r.province, r.city, r.name, r.zipCode));
}
常见问题(FAQ)
region.query 接口怎么收费?
region.query 的收费类型为 PER_CALL(按次计费),当前单价 0.0100 元/次,调用前校验余额,余额不足返回「余额不足,请先充值。可联系微信xujian_cq」且不扣费;充值可可联系微信xujian_cq。扣费金额、交易前后余额均记录于交易流水中。
有调用次数或频率限制吗?
当前版本不限制调用次数、不做硬性限流。请按业务需要合理调用;由于行政区划数据每周才更新一次, 强烈建议在本地缓存结果,避免重复请求。
怎么一次性拿到全部省份?
请求 level=1&limit=100,一次返回全部省级去重记录(约 34 条,含省 / 自治区 / 直辖市 / 特别行政区)。
由于源数据本身只有区县级明细行,省级与地市级列表由接口实时聚合生成。
三级联动推荐顺序:level=1 取省 → 只传 province=浙江省 取该省全部地市 →
再传 province=浙江省&city=杭州市 取该市全部区县。
传入 province 或 city 会返回什么?
接口会自动向下钻一级:
- 只传
province(不带 code / keyword / zipCode / level)→ 返回该省全部地市,level=2; - 传了
city(不加上述条件)→ 返回该市全部区县,level=3; - 若希望跳过下钻、按条件精确检索区县级明细,请显式传
level=3,或改用code / keyword / zipCode查询。
行政区划数据多久更新一次?
每周日凌晨 03:00 自动全量同步一次,管理端也支持手动立即同步。同步采用「新增 / 更新 / 逻辑删除」的比对策略, 已下线地区会被标记为删除而不再返回,不会被物理删除。
可以一次查到多少条数据?
单次最多返回 100 条(limit 参数,默认 20)。需要全量数据建议按 province / city 分批拉取,并在本地缓存, 行政区划数据变更频率很低。
返回结果中的 code 和 zipCode 分别是什么?
code 是国家统计局行政区划代码(区县为 6 位,省直辖县级行政区为 9 位,如 419001000 济源市), zipCode 是对应地区的邮政编码。
调用需要签名或加密吗?
不需要。XAPI 的接口仅校验请求头 X-API-Key,不做签名、时间戳或加密。
不传任何查询条件可以调用吗?
不可以。code、keyword、province、city、zipCode、level 至少需要提供一个, 否则返回「code / keyword / province / city / zipCode / level 至少填写一个查询条件」。