身份核验
按纳税人识别号查询巴西官方登记信息:CNPJ 查询、带出生日期的 CPF 查询、错误模型、数据合规与联调清单。
能力概述
按纳税人识别号查询巴西官方登记信息:
| 能力 | 端点 | 说明 |
|---|---|---|
| CNPJ 查询 | GET /openapi/v3/consultas/cnpj/{cnpj} | 按 14 位法人税号查工商登记:法定名称、商号、登记状态、法律性质、CNAE、注册地址、联系方式、注册资本 |
| CPF 查询 | GET /openapi/v3/consultas/cpf/{cpf}/{nascimento} | 按 11 位自然人税号 + 出生日期查登记信息:姓名、登记状态、出生日期 |
两个端点均为 GET:签名用的 body 为空字符串,所有路径变量(CNPJ / CPF / 出生日期)都属于签名 path,见 认证与签名。响应为裸结构(不带平台信封);业务错误为裸 {code, message} 对象。
CPF 为何必须带出生日期
上游按 CPF 与出生日期配对核验(巴西联邦税务局语义),只给 CPF 查不到。配对不符与查无此人返回同一个错误码,不作区分:区分开来接口就成了校验他人生日的探测工具。
对接前提(一次性)
- 应用凭证:申请应用并领取
app_secret,仅回显一次,请妥善保存。 - 接口订阅:平台为你的应用开通所需端点的调用授权(scope 键即端点路径)。
端点
| 端点 | 用途 |
|---|---|
GET /openapi/v3/consultas/cnpj/{cnpj} | 按 CNPJ 查企业登记信息 |
GET /openapi/v3/consultas/cpf/{cpf}/{nascimento} | 按 CPF 与出生日期查自然人登记信息,含 LGPD 年龄分档 |
错误模型
两种错误形状
业务、请求级与上游侧错误(HTTP 400 / 422 / 428 / 451 / 503)为裸对象:
{ "code": 10016003, "message": "未找到该 CPF 的信息" }
| 字段 | 类型 | 说明 |
|---|---|---|
| code | integer | 平台错误码 |
| message | string | 人类可读说明,随请求语言本地化 |
鉴权层错误(HTTP 401 / 403 / 429)由平台网关在请求到达接口前产出,为平台信封形状:
{ "success": false, "errorType": 1, "code": 10009005, "message": "API 未订阅,请订阅后调用" }
| 字段 | 类型 | 说明 |
|---|---|---|
| success | boolean | 所有错误恒为 false |
| errorType | integer | 1 API 错误、2 SEFAZ 驳回、3 系统异常、4 字段校验失败 |
| code | integer | 平台错误码 |
| message | string | 人类可读说明,本地化 |
注意: 错误处理须兼容两种形状。稳妥做法:把响应体按 JSON 解析,从任一形状读取
code,以success=false或 HTTP >= 400 判定失败。
业务错误码
| code | HTTP | 责任方 | 含义 | 处置 |
|---|---|---|---|---|
| 10016000 | 400 | 调用方 | CPF 格式不合法(须 11 位数字) | 检查是否误传格式符或位数不足 |
| 10016001 | 400 | 调用方 | CPF 校验位不合法 | 本地先用 mod-11 算法校验,避免无效调用 |
| 10016002 | 400 | 调用方 | 出生日期格式不合法(须 DDMMYYYY 有效日期) | 注意是日月年顺序,且须为真实存在的日期 |
| 10016003 | 400 | 调用方 | 未找到该 CPF 的信息 | 该 CPF 不存在,或 CPF 与出生日期不匹配(二者不作区分) |
| 10016004 | 451 | 第三方(上游依法拦截) | LGPD: menor de 16 anos (Lei Felca),持有人小于 16 岁 | 依法不提供数据,勿重试 |
| 10016005 | 422 | 第三方(上游依法拦截) | LGPD: menor de idade,持有人 16 到 17 岁 | 依法不提供数据,勿重试 |
| 10016006 | 428 | 第三方(上游依法拦截) | LGPD: idade nao verificavel - informe a data de nascimento para completar a verificacao,年龄无法核实 | 平台已带出生日期补核验一次仍未通过,勿重试 |
| 10016010 | 400 | 调用方 | CNPJ 格式不合法(须 14 位数字) | 检查是否误传格式符 |
| 10016011 | 400 | 调用方 | CNPJ 校验位不合法 | 本地先用 mod-11 算法校验 |
| 10016012 | 400 | 调用方 | 未找到该 CNPJ 的信息 | 该 CNPJ 在官方登记中不存在 |
| 10016020 | 503 | 第三方(上游不可用) | 上游数据源暂不可用,请稍后重试 | 退避重试(初始 1 秒,倍增至 30 秒上限,加抖动);持续出现请联系平台 |
格式与校验位错误由平台本地拦截,不会发往上游数据源,因此不消耗调用额度也不计费。
责任方约定:10016000 到 10016003、10016010 到 10016012 为调用方问题;10016004 到 10016006 为第三方依法拦截;10016020 为第三方不可用;HTTP 500 + 10001000 为平台自身异常。
计费:10016003(查无 / 出生日期不配对)、10016004(小于 16 岁)、10016005(16 到 17 岁)按次计费;10016006(年龄无法核实)、10016020(上游不可用)与本地拦截的格式 / 校验位错误不计费。年龄分档详见 CPF 查询 页。
鉴权与授权错误
| HTTP | code | 含义 | 处置 |
|---|---|---|---|
| 401 | 10009000 | 缺少签名请求头(token / sign / timestamp) | 三个头必须齐全 |
| 401 | 10009001 | 时间戳非法或时钟偏差超 ±300 秒 | 用 NTP 校准;每次请求重新生成时间戳 |
| 401 | 10009002 | token 无效 | 核对 app_secret |
| 401 | 10009003 | 签名不匹配 | 见 排障 的核对清单 |
| 403 | 10009004 | 应用已停用 | 联系平台 |
| 403 | 10009015 | 应用未生效(待审批或已驳回) | 等待审批 |
| 403 | 10009014 | 集成商账户已停用 | 联系平台 |
| 403 | 10009005 | 接口未订阅 | 为所调端点申请订阅 |
| 429 | 10009006 | 超出限流额度 | 指数退避重试(初始 1 秒,倍增至 30 秒上限,加抖动) |
重试指引:401 与 403 属配置错误,不修复就重试无意义且可能触发限流;429 与 503(10016020)可退避重试;422 / 428 / 451 是法定拦截,重试无意义;500 建议携带失败请求的 timestamp 与路径联系平台。
HTTP 状态速查
| HTTP | 场景 | 响应形状 |
|---|---|---|
| 200 | 查询成功 | 裸数据 |
| 400 | 参数不合法 / 查无此记录 | 裸 {code, message} |
| 401 | 鉴权失败 | 平台信封 |
| 403 | 应用停用 / 未生效 / 未订阅 | 平台信封 |
| 422 | CPF 持有人 16 到 17 岁(上游依法拦截,10016005) | 裸 {code, message},无人员字段 |
| 428 | CPF 年龄无法核实(上游依法拦截,10016006) | 裸 {code, message},无人员字段 |
| 429 | 超出限流额度 | 平台信封 |
| 451 | CPF 持有人小于 16 岁(上游依法拦截,10016004) | 裸 {code, message},无人员字段 |
| 500 | 平台侧异常(10001000) | 裸 {code, message},联系平台 |
| 503 | 上游数据源不可用(10016020) | 裸 {code, message},退避重试 |
数据合规说明
CPF 属自然人个人数据,受巴西 LGPD(第 13.709/2018 号法律)约束:
- 平台不留存 CPF 查询结果,每次查询实时回源。
- CPF 全号不写入应用日志,日志中一律掩码。
- 调用日志中的路径变量经 HMAC 处理后入库,不含明文。
- 上游对未成年人依法不返回数据,平台以 451 / 422 / 428 原状态码透传、不留存;451 / 422 按次计费,428 不计费,见 CPF 查询 页的“未成年人与年龄核实”。
请对接方同样遵循最小必要原则:仅在开票等确有法律依据的业务场景下查询,不得留存超出业务需要的个人数据。
响应语言
message 字段随请求语言返回:Language 头(zh / en / pt / es)优先,其次 Accept-Language(支持 pt-BR 与 q 值)。未提供语言头时默认葡语(pt)。
程序判断一律使用 code 数字码与 situacao.codigo 等枚举值,不要匹配描述文案。LGPD 三档拦截的 message 是法定葡语文案,不随语言翻译。
联调清单
- 领取
app_secret,确认两个端点均已订阅。 - 用一个真实 CNPJ 调用:HTTP 200,
ni与入参一致,situacaoCadastral.codigo为2。 - 用一组真实 CPF + 出生日期调用:HTTP 200,
nascimento回显与入参一致。 - 反向用例:CPF 正确但出生日期错误,得到 400 +
10016003(与查无此人同码)。 - 反向用例:校验位错误的 CNPJ / CPF,得到 400 +
10016011/10016001(本地拦截,不计费)。 - 反向用例:出生日期传
1997-01-09或31021997,得到 400 +10016002。 - 失败路径:故意用错误
sign得到 401 +10009003;调用未订阅端点得到 403 +10009005。 - 解析器兼容性:确认你的客户端把 422 / 428 / 451 / 503 都按失败处理并能读出裸
{code, message}(这些状态码无法用测试数据主动构造,上线后遇到真实未成年 CPF 才会出现)。
排障
签名始终不匹配(401,10009003)?
按出现频率依次检查:
- GET 请求没把 body 当作空字符串
""拼接(拼成了空对象、占位文本等); path缺/openapi前缀,或误带查询串;- CPF 接口漏拼出生日期段,两个路径变量都要参与签名;
sign用了大写(必须小写十六进制);- 拼接用的
timestamp与请求头不是同一个值(两次生成); - CNPJ 带了格式符,
/把路径切断了。
可先用 认证与签名 中签名示例的固定取值复算比对,确认本地实现无误后再排查线上参数。
CNPJ 返回 404 或路径不匹配?
CNPJ 只接受 14 位纯数字。带格式符的 40.673.061/0001-34 中的 / 会被当作路径分隔符,导致路由不到端点。
CPF 查得到但业务对不上?
先看 situacao.codigo:非 0 表示该 CPF 处于非正常状态(已故、暂停、待补正等),数据本身有效但业务上可能需要拦截。
时钟偏差(401,10009001)?
服务器时钟与平台相差超过 300 秒。请用 NTP 校准,且不要跨请求缓存时间戳。
