TF Fiscal
开发文档

身份核验

按纳税人识别号查询巴西官方登记信息: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 查不到。配对不符与查无此人返回同一个错误码,不作区分:区分开来接口就成了校验他人生日的探测工具。

对接前提(一次性)

  1. 应用凭证:申请应用并领取 app_secret仅回显一次,请妥善保存。
  2. 接口订阅:平台为你的应用开通所需端点的调用授权(scope 键即端点路径)。

端点

端点用途
GET /openapi/v3/consultas/cnpj/{cnpj}按 CNPJ 查企业登记信息
GET /openapi/v3/consultas/cpf/{cpf}/{nascimento}按 CPF 与出生日期查自然人登记信息,含 LGPD 年龄分档

错误模型

两种错误形状

业务、请求级与上游侧错误(HTTP 400 / 422 / 428 / 451 / 503)为裸对象:

json
{ "code": 10016003, "message": "未找到该 CPF 的信息" }
字段类型说明
codeinteger平台错误码
messagestring人类可读说明,随请求语言本地化

鉴权层错误(HTTP 401 / 403 / 429)由平台网关在请求到达接口前产出,为平台信封形状:

json
{ "success": false, "errorType": 1, "code": 10009005, "message": "API 未订阅,请订阅后调用" }
字段类型说明
successboolean所有错误恒为 false
errorTypeinteger1 API 错误、2 SEFAZ 驳回、3 系统异常、4 字段校验失败
codeinteger平台错误码
messagestring人类可读说明,本地化

注意: 错误处理须兼容两种形状。稳妥做法:把响应体按 JSON 解析,从任一形状读取 code,以 success=false 或 HTTP >= 400 判定失败。

业务错误码

codeHTTP责任方含义处置
10016000400调用方CPF 格式不合法(须 11 位数字)检查是否误传格式符或位数不足
10016001400调用方CPF 校验位不合法本地先用 mod-11 算法校验,避免无效调用
10016002400调用方出生日期格式不合法(须 DDMMYYYY 有效日期)注意是日月年顺序,且须为真实存在的日期
10016003400调用方未找到该 CPF 的信息该 CPF 不存在,或 CPF 与出生日期不匹配(二者不作区分)
10016004451第三方(上游依法拦截)LGPD: menor de 16 anos (Lei Felca),持有人小于 16 岁依法不提供数据,勿重试
10016005422第三方(上游依法拦截)LGPD: menor de idade,持有人 16 到 17 岁依法不提供数据,勿重试
10016006428第三方(上游依法拦截)LGPD: idade nao verificavel - informe a data de nascimento para completar a verificacao,年龄无法核实平台已带出生日期补核验一次仍未通过,勿重试
10016010400调用方CNPJ 格式不合法(须 14 位数字)检查是否误传格式符
10016011400调用方CNPJ 校验位不合法本地先用 mod-11 算法校验
10016012400调用方未找到该 CNPJ 的信息该 CNPJ 在官方登记中不存在
10016020503第三方(上游不可用)上游数据源暂不可用,请稍后重试退避重试(初始 1 秒,倍增至 30 秒上限,加抖动);持续出现请联系平台

格式与校验位错误由平台本地拦截,不会发往上游数据源,因此不消耗调用额度也不计费。

责任方约定10016000100160031001601010016012 为调用方问题;1001600410016006 为第三方依法拦截;10016020 为第三方不可用;HTTP 500 + 10001000 为平台自身异常。

计费10016003(查无 / 出生日期不配对)、10016004(小于 16 岁)、10016005(16 到 17 岁)按次计费;10016006(年龄无法核实)、10016020(上游不可用)与本地拦截的格式 / 校验位错误不计费。年龄分档详见 CPF 查询 页。

鉴权与授权错误

HTTPcode含义处置
40110009000缺少签名请求头(token / sign / timestamp三个头必须齐全
40110009001时间戳非法或时钟偏差超 ±300 秒用 NTP 校准;每次请求重新生成时间戳
40110009002token 无效核对 app_secret
40110009003签名不匹配排障 的核对清单
40310009004应用已停用联系平台
40310009015应用未生效(待审批或已驳回)等待审批
40310009014集成商账户已停用联系平台
40310009005接口未订阅为所调端点申请订阅
42910009006超出限流额度指数退避重试(初始 1 秒,倍增至 30 秒上限,加抖动)

重试指引:401 与 403 属配置错误,不修复就重试无意义且可能触发限流;429 与 503(10016020)可退避重试;422 / 428 / 451 是法定拦截,重试无意义;500 建议携带失败请求的 timestamp 与路径联系平台。

HTTP 状态速查

HTTP场景响应形状
200查询成功裸数据
400参数不合法 / 查无此记录{code, message}
401鉴权失败平台信封
403应用停用 / 未生效 / 未订阅平台信封
422CPF 持有人 16 到 17 岁(上游依法拦截,10016005{code, message},无人员字段
428CPF 年龄无法核实(上游依法拦截,10016006{code, message},无人员字段
429超出限流额度平台信封
451CPF 持有人小于 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 是法定葡语文案,不随语言翻译。

联调清单

  1. 领取 app_secret,确认两个端点均已订阅。
  2. 用一个真实 CNPJ 调用:HTTP 200,ni 与入参一致,situacaoCadastral.codigo2
  3. 用一组真实 CPF + 出生日期调用:HTTP 200,nascimento 回显与入参一致。
  4. 反向用例:CPF 正确但出生日期错误,得到 400 + 10016003(与查无此人同码)。
  5. 反向用例:校验位错误的 CNPJ / CPF,得到 400 + 10016011 / 10016001(本地拦截,不计费)。
  6. 反向用例:出生日期传 1997-01-0931021997,得到 400 + 10016002
  7. 失败路径:故意用错误 sign 得到 401 + 10009003;调用未订阅端点得到 403 + 10009005
  8. 解析器兼容性:确认你的客户端把 422 / 428 / 451 / 503 都按失败处理并能读出裸 {code, message}(这些状态码无法用测试数据主动构造,上线后遇到真实未成年 CPF 才会出现)。

排障

签名始终不匹配(401,10009003)?

按出现频率依次检查:

  1. GET 请求没把 body 当作空字符串 "" 拼接(拼成了空对象、占位文本等);
  2. path/openapi 前缀,或误带查询串;
  3. CPF 接口漏拼出生日期段,两个路径变量都要参与签名
  4. sign 用了大写(必须小写十六进制);
  5. 拼接用的 timestamp 与请求头不是同一个值(两次生成);
  6. CNPJ 带了格式符,/ 把路径切断了。

可先用 认证与签名 中签名示例的固定取值复算比对,确认本地实现无误后再排查线上参数。

CNPJ 返回 404 或路径不匹配?

CNPJ 只接受 14 位纯数字。带格式符的 40.673.061/0001-34 中的 / 会被当作路径分隔符,导致路由不到端点。

CPF 查得到但业务对不上?

先看 situacao.codigo:非 0 表示该 CPF 处于非正常状态(已故、暂停、待补正等),数据本身有效但业务上可能需要拦截。

时钟偏差(401,10009001)?

服务器时钟与平台相差超过 300 秒。请用 NTP 校准,且不要跨请求缓存时间戳。