企业信息模糊查询 API:一个关键词带回信用代码、企业类型与法定代表人
供应商准入、客户建档、开票信息核对,第一道坎往往是「手里只有一个不完整的公司名」:「某某能源」「某某物流」这类简称,或者一张名单 Excel 里几百个名字需要补全统一社会信用代码。人工去查字号 iget 一个个搜,慢且容易串;更麻烦的是同名近似企业(「重庆某某能源有限公司」和「重庆某某新能源有限公司」),选错主体后面全是错的。enterprise.query 把这件事做成一个 GET 接口:传入关键词,返回命中的企业列表,每条给出名称、工商注册号、统一社会信用代码、企业类型、成立日期、法定代表人,用信用代码做主键就可以直接入库去重。
一个必须提前讲清楚的计费口径:本接口查不到结果不收费。关键词为空、少于 2 个字符、上游不可用,或者压根没匹配到企业,都直接返回失败且不扣费、不写扣费流水、不累加调用次数——脏关键词不会吃掉预算。详见第九节。
api.xujian.techV:xujian_cq
接口速览
| 关键事实 | 说明 |
|---|---|
| 接口地址 | https://api.xujian.tech/openapi/enterprise/query |
| 接口编码 | enterprise.query |
| 请求方式 | GET |
| 鉴权方式 | 请求头 X-API-Key,不做签名、时间戳或加密 |
| 请求参数 | keyword(必填)、limit(可选) |
| 返回条数 | 单次最多 20 条(上限不可调,超过按 20 裁剪) |
| 计价 | 按次计费,0.01 元/次 |
| 不计费场景 | 关键词为空 / 过短超长、服务未启用或未配置、鉴权失败、余额不足、未查询到任何匹配企业 |
| 建议超时 | 15 秒以上(受上游响应影响,costMs 为真实耗时) |
一、哪些场景会用到它
| 场景 | 具体动作 |
|---|---|
| 供应链准入 | 拿到对方简称后先做工商主体定位,用信用代码作为唯一主键建档 |
| CRM / ERP 客户名录治理 | 批量把名单里的简称补全为标准名称 + 信用代码,消除重名导致的重复客户 |
| 开票核验 | 开票前核对购方名称与纳税人识别号(即统一社会信用代码)是否一致 |
| 反欺诈前置校验 | 先定位主体,再决定要不要调用详情 / 失信 / 经营异常接口做深挖 |
| 招投标报名名单核对 | 批量确认投标单位是否真实存续、名称是否与营业执照一致 |
模糊查询的定位是入口型接口:它只返回定位所需的最小字段集,拿到信用代码之后再按需组合 enterprise.profile、enterprise.dishonesty 等接口,比一上来就拉全量详情便宜得多。
二、请求参数
2.1 请求头
| 参数名 | 必填 | 说明 |
|---|---|---|
X-API-Key |
是 | 开发者 API Key,缺失或无效直接返回失败(不计费) |
2.2 业务参数(Query String)
| 参数名 | 必填 | 类型 | 示例 | 说明 |
|---|---|---|---|---|
keyword |
是 | String | 某某能源 | 查询关键词:企业名称片段、工商注册号或统一社会信用代码;至少 2 个字符,最多 50 个字符,建议 4 个字符以上以提高匹配率 |
limit |
否 | Integer | 10 | 期望返回条数,为空或小于等于 0 时取上限 20;大于 20 也只会返回 20 条 |
三、返回字段
3.1 顶层字段
| 字段 | 类型 | 说明 |
|---|---|---|
code |
int | 0 成功,非 0 失败(统一为 500) |
msg |
String | 成功为 success,失败为具体原因 |
data |
Object | 业务数据,失败时为 null |
3.2 data 字段
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
keyword |
String | 某某能源 | 查询关键词原文(已去除首尾空格) |
total |
Integer | 3 | 本次返回的企业条数 |
list |
Array | — | 企业列表,每项结构见下表 |
apiCode |
String | enterprise.query | 接口编码 |
apiName |
String | 企业信息模糊查询 | 接口名称 |
chargeType |
String | PER_CALL | 计费类型 |
balance |
BigDecimal | 99.9900 | 扣费后的账户余额(元) |
costMs |
Long | 860 | 本次调用耗时(毫秒) |
3.3 list[] 元素字段
| 字段 | 类型 | 示例 | 说明 |
|---|---|---|---|
name |
String | 重庆某某能源有限公司 | 企业名称(工商登记全称) |
regNo |
String | 5001100XXXXXXXX | 工商注册号 |
creditNo |
String | 91500110MAXXXXXXX | 统一社会信用代码(18 位,开票场景常作为纳税人识别号) |
type |
String | 0 | 企业类型编码:0 企业 / 4 社团 / 5 律师事务所 / 6 香港公司 |
typeName |
String | 企业 | 企业类型名称,由编码转换而来,未知编码返回「其他」 |
startDate |
String | 2021-08-31 | 成立日期,格式 YYYY-MM-DD |
operName |
String | 张某某 | 法定代表人姓名 |
未取到的字段一律返回空字符串,不返回
null,调用方不需要逐字段判空。上游的主键、匹配权重等内部字段一概不返回——返回体里的七个字段就是全部。
四、调用示例
4.1 curl
curl -s -G "https://api.xujian.tech/openapi/enterprise/query" \
--data-urlencode "keyword=某某能源" \
--data-urlencode "limit=10" \
-H "X-API-Key: 你的APIKey"
4.2 Java(JDK 11+ HttpClient)
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class EnterpriseQueryClient {
private static final String API_URL = "https://api.xujian.tech/openapi/enterprise/query";
public String query(String apiKey, String keyword, Integer limit) throws Exception {
StringBuilder url = new StringBuilder(API_URL)
.append("?keyword=").append(URLEncoder.encode(keyword, StandardCharsets.UTF_8));
if (limit != null && limit > 0) {
url.append("&limit=").append(limit);
}
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url.toString()))
.header("X-API-Key", apiKey)
.timeout(Duration.ofSeconds(15))
.GET()
.build();
return HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
.body();
}
}
4.3 Python
import requests
def query_enterprise(api_key: str, keyword: str, limit: int | None = None) -> list[dict]:
"""模糊查询企业,返回企业列表;查不到返回空列表(且不扣费)"""
params = {
"keyword": keyword}
if limit:
params["limit"] = limit
resp = requests.get(
"https://api.xujian.tech/openapi/enterprise/query",
params=params,
headers={
"X-API-Key": api_key},
timeout=15,
)
result = resp.json()
if result.get("code") != 0:
print("查询失败(不收费):", result.get("msg"))
return []
return result["data"]["list"]
if __name__ == "__main__":
for ent in query_enterprise("你的APIKey", "某某能源"):
print(ent["name"], ent["creditNo"], ent["typeName"], ent["startDate"])
4.4 JavaScript(浏览器 / Node 18+)
const url = new URL("https://api.xujian.tech/openapi/enterprise/query");
url.searchParams.set("keyword", "某某能源");
url.searchParams.set("limit", "10");
const {
code, msg, data } = await fetch(url, {
headers: {
"X-API-Key": API_KEY },
}).then((r) => r.json());
if (code === 0) {
data.list.forEach((e) => console.log(e.name, e.creditNo, e.operName));
} else {
console.warn("查询失败(不收费):", msg);
}
五、返回示例
{
"code": 0,
"msg": "success",
"data": {
"keyword": "某某能源",
"total": 2,
"list": [
{
"name": "重庆某某能源有限公司",
"regNo": "5001100XXXXXXXX",
"creditNo": "91500110MAXXXXXXX",
"type": "0",
"typeName": "企业",
"startDate": "2021-08-31",
"operName": "张某某"
},
{
"name": "重庆某某新能源科技有限公司",
"regNo": "5001100XXXXXXXX",
"creditNo": "91500112MAYYYYYYY",
"type": "0",
"typeName": "企业",
"startDate": "2023-04-17",
"operName": "李某某"
}
],
"apiCode": "enterprise.query",
"apiName": "企业信息模糊查询",
"chargeType": "PER_CALL",
"balance": 99.9900,
"costMs": 860
}
}
查不到时的返回(不计费):
{
"code": 500,
"msg": "未查询到匹配的企业信息,请更换更完整的企业名称 / 注册号 / 统一社会信用代码后重试;本次调用不计费",
"data": null
}
这里有个容易被忽略的设计点:「查不到」走的是失败返回而不是空
list。好处是扣费语义清晰(成功就等于有数据),代价是调用方必须区分「业务失败」和「真的没有这家公司」——判断依据就是上面这条msg。
六、落地实践
6.1 名录批量补全:先定位,再详情
from concurrent.futures import ThreadPoolExecutor, as_completed
def enrich_roster(api_key: str, names: list[str]) -> list[dict]:
"""把简称名单补全为标准工商主体"""
result = {
}
with ThreadPoolExecutor(max_workers=4) as pool:
futures = {
pool.submit(query_enterprise, api_key, n): n for n in names}
for fu in as_completed(futures):
name = futures[fu]
hit = fu.result()
# 命中多条时用信用代码作为唯一主键落库,留待人审选择
result[name] = hit
return [{
"原始名称": k, "命中": v} for k, v in result.items()]
6.2 用信用代码做去重主键
public class EnterpriseArchive {
/**
* 名录合并:以统一社会信用代码为主键,避免同名不同主体被合并
*/
public void merge(List<EnterpriseRow> rows) {
Map<String, EnterpriseRow> index = new HashMap<>();
for (EnterpriseRow row : rows) {
if (StrUtil.isBlank(row.getCreditNo())) {
continue; // 模糊查询没拿到信用代码的行,留到人工处理
}
index.merge(row.getCreditNo(), row, (oldVal, newVal) ->
// 同一信用代码出现多次时保留信息更完整的一条
completeness(oldVal) >= completeness(newVal) ? oldVal : newVal);
}
}
}
6.3 与其他企业接口组合
名单里的简称
↓ enterprise.query (0.01 元/次)定位主体、拿到信用代码
↓ 用 creditNo 作为后续接口的 keyword,避免同名错查
├─ enterprise.profile (0.20 元/次)33 项工商照面:状态、注册资本、经营范围
├─ enterprise.dishonesty (0.20 元/次)失信被执行人
├─ enterprise.abnormal (0.20 元/次)经营异常名录
└─ enterprise.detail (0.52 元/次)照面 + 股东 + 变更 + 社保一次拿全
七、提高命中率的几条建议
- 关键词至少 4 个字符。低于 2 个字符直接参数错误;2 ~ 3 个字符虽然合法,但命中结果往往过多甚至查不到有用的。
- 优先用信用代码或注册号。整串传入可以精确定位,几乎不会命中错主体。
- 用注册名片段而不是口语简称。例如用「某某能源」而不是「某能源公司」,去掉「市」「有限公司」等冗余词反而更稳。
- 同名命中多条时不要自动取第一条。把
list全部展示给用户选择,或用成立日期、法定代表人做二次比对。 limit不用白填。上限就是 20 条,需要更大范围请拆关键词分批查。- 查不到的分支要单独处理。这类返回不计费,适合直接落到「待人工核对」队列,而不是重试。
八、错误码与排查
| code | msg(示例) | 处理建议 |
|---|---|---|
| 0 | success | 调用成功 |
| 500 | 缺少请求头 X-API-Key | 请求头补充 X-API-Key |
| 500 | API Key 无效 / API Key 已停用 | 检查 Key 是否正确,或在控制台重新启用 |
| 500 | 客户不存在或已停用 | 联系平台确认账号状态 |
| 500 | 接口不存在或已停用 | 确认 enterprise.query 当前是否维护中 |
| 500 | 余额不足,请先充值 | 调用前校验余额,余额不足不扣费,充值后重试 |
| 500 | keyword 不能为空 | 补充关键词,不计费 |
| 500 | keyword 至少需要 2 个字符(建议 4 个字符以上以提高匹配率) | 使用更完整的名称片段、注册号或信用代码 |
| 500 | keyword 长度不能超过 50 个字符 | 截断或改用信用代码 |
| 500 | 企业信息查询服务未启用 / 未配置 | 服务端状态问题,稍后重试;不计费 |
| 500 | 未查询到匹配的企业信息……本次调用不计费 | 更换关键词;不计费 |
九、计费与接入
| 项目 | 说明 |
|---|---|
| 单价 | 0.01 元/次 |
| 计费方式 | 按次计费,调用前校验余额,返回至少一条企业信息才计一次 |
| 不计费场景 | 参数非法、服务未启用或未配置、鉴权失败、余额不足、查无结果 |
| 建议超时 | 15 秒以上 |
接入流程:注册开发者账号 → 控制台创建 API Key → 请求头带上 X-API-Key 即可调用,无需签名或加密。控制台可查看调用量、扣费流水与余额。
服务站点:
api.xujian.tech(纯文本域名,不做跳转)。接口试用、数据与充值咨询可在控制台提交工单,或联系 Vxujian_cq。边界说明:本接口返回的是工商登记公示口径的主体信息,用于定位与核验;不包含经营状况、风险、财务等深度数据,需要的话请用
enterprise.profile/enterprise.detail等接口。
十、小结
企业名录类需求的核心不是「查得到」,而是「别查错主体」。用信用代码做主键、把模糊查询当作定位入口而不是数据终点,能省掉后面大量的返工。
使用时要记住:
- 查不到不收费:脏关键词不会消耗预算,失败分支可以直接转人工队列;
- 最多 20 条:需要更宽范围就拆关键词分批查;
- 七个字段足够做主键与去重:
creditNo定位、name展示、startDate/operName做同名二次比对; - 再用信用代码去调详情接口,比拿名称去查稳得多。
配套接口:enterprise.profile(0.20 元/次)拿 33 项工商照面,enterprise.detail(0.52 元/次)一次取回照面 + 股东 + 变更 + 社保,enterprise.dishonesty / enterprise.abnormal(各 0.20 元/次)做风险排查。