documentoquery · stringRequiredQueried carrier's CPF (11 digits) or CNPJ (14 digits), digits only.
Constraints
{
"type": "string",
"pattern": "^([0-9]{11}|[0-9]{14})$"
}Parameters, data structure and responses from the versioned contract.
/consultas/frotaTechnical descriptions are translated from the versioned contract. Original identifiers and JSON are preserved; data examples are omitted.
Checks a list of license plates to determine whether each belongs to a carrier's fleet in RNTRC (ANTT). Each plate's response includes pertence (true/false, or null when ANTT did not provide a conclusive status).
Prerequisite for the querying company: completed tax registration, including an A1 digital certificate uploaded in Settings. Otherwise, the response is 422 with empresa_nao_habilitada.
Requires the consultas scope enabled in the dashboard.
This query has no contracted provider behind it: in the sandbox environment, FleetPay generates a deterministic response with no regulatory effect — the data does not come from ANTT and does not reflect the carrier's real fleet. Each frota item contains verificacao: "simulada", marking the nature of verification for each plate. The field is inherently optional: an item without verificacao represents a real verification.
The request and response contract is already final: you can integrate now. When the real provider is introduced, behavior stops being simulated without a contract change.
documento + rntrc pair must matchThese parameters ask a single question: "the status of THIS registration for THIS carrier." An RNTRC that does not belong to the supplied CPF/CNPJ does not identify a carrier for this query. The response is 400 with rntrc_nao_confere — never a 200 about whichever registration happened to be found.
It is 400, not 503, because the query ran and reached a conclusion: there was no outage. It is not 404, because the problem is the combination of parameters, not a missing resource at the address.
The test sentinels below are exempt from this check — they are deliberately not anyone's RNTRC.
Rejection of the pair is different from pertence: null. null means a plate has an inconclusive result within an existing fleet; 400 means there is no carrier to report on for that pair. It therefore replaces the entire response rather than appearing per plate.
In simulated mode, these plates always return the same outcome — use them to exercise your integration's error paths:
| License plate | Response |
|---|---|
ZZZ0X00 | Plate outside the carrier's fleet — pertence: false |
ZZZ9X99 | Inconclusive status at ANTT — pertence: null |
| any other valid plate | Success response |
[
{
"oauth2": []
},
{
"chaveApi": []
}
]documentoquery · stringRequiredQueried carrier's CPF (11 digits) or CNPJ (14 digits), digits only.
{
"type": "string",
"pattern": "^([0-9]{11}|[0-9]{14})$"
}rntrcquery · stringRequiredRNTRC of the queried carrier, with 8 or 9 digits.
{
"type": "string",
"pattern": "^[0-9]{8,9}$"
}placasquery · arrayRequiredLicense plates to check (1 to 20). Send placas[]=ABC1D23&placas[]=XYZ4E56.
In the sandbox environment, ZZZ0X00 returns pertence: false and ZZZ9X99 returns
pertence: null; any other valid license plate returns success.
{
"type": "array",
"minItems": 1,
"maxItems": 20,
"items": {
"type": "string",
"pattern": "^[A-Za-z]{3}[0-9][A-Za-z0-9][0-9]{2}$"
}
}200 HTTP ResponseStatus of each license plate in the carrier's fleet.
400 HTTP Responserntrc_nao_confere — the supplied RNTRC is not registered under this CPF/CNPJ, so there is no fleet to report on.
validacao — a license plate does not match the Mercosur format, or a parameter is missing.
401 HTTP ResponseUnauthenticated (autenticacao): missing, invalid or expired credentials, including an API key used in the wrong environment. A sandbox key is not valid in production, nor a production key in the sandbox; the error message indicates the expected environment.
422 HTTP ResponseThe authenticated company has not completed fiscal registration (empresa_nao_habilitada).
503 HTTP ResponseThe query is temporarily unavailable (consulta_indisponivel). Wait and try again.
{
"tags": [
"Consultas"
],
"summary": "Consultar a frota de um transportador (ANTT)",
"operationId": "consultarFrota",
"description": "Verifica, para uma lista de placas, se cada uma pertence à frota de um transportador no\nRNTRC (ANTT). A resposta traz, por placa, `pertence` (`true`/`false`, ou `null` quando a\nANTT não deu situação conclusiva).\n\n**Pré-requisito da empresa que consulta:** ter o cadastro fiscal concluído — com o\ncertificado digital A1 enviado em Configurações. Sem isso a resposta é `422` com\n`empresa_nao_habilitada`.\n\nExige o escopo `consultas` habilitado no painel.\n\n## Modo simulado em homologação\n\nEsta consulta **não tem provedor contratado** por trás: em homologação a resposta é\ngerada pela FleetPay, é determinística e **não tem efeito regulatório** — o dado não vem\nda ANTT e não reflete a frota real do transportador. Cada item de `frota` carrega\n`verificacao: \"simulada\"`, marcando a natureza da verificação por placa — e o campo é\nopcional por natureza: item **sem** `verificacao` é verificação real.\n\nO contrato de request e response já é o definitivo: integre agora. Quando o provedor real\nentrar, o comportamento deixa de ser simulado **sem mudança de contrato**.\n\n\n### O par `documento` + `rntrc` precisa conferir\n\nOs dois parâmetros são uma pergunta só: *\"a situação DESTE registro DESTE\ntransportador\"*. Um RNTRC que não seja o daquele CPF/CNPJ não descreve transportador\nnenhum, e a resposta é **`400` com `rntrc_nao_confere`** — nunca um `200` sobre o\ncadastro que por acaso foi encontrado.\n\nÉ `400` e não `503` porque a consulta rodou e concluiu: não houve indisponibilidade. E\nnão é `404` porque o que está errado é a **combinação** dos dois parâmetros, não um\nrecurso ausente no endereço.\n\nAs sentinelas abaixo são **isentas** dessa checagem — elas existem justamente para não\nserem o RNTRC de ninguém.\n\nRepare que a recusa do par é **diferente** de `pertence: null`. `null` é uma placa\ninconclusiva dentro de uma frota que existe; o `400` é a ausência de transportador\nsobre o qual responder — por isso ele não vem por placa, e sim no lugar da resposta\ninteira.\n\n### Sentinelas de teste\n\nEm modo simulado, estas placas respondem sempre a mesma coisa — use-as para exercitar o\ncaminho de erro da sua integração:\n\n| Placa | Resposta |\n|---|---|\n| `ZZZ0X00` | Placa fora da frota do transportador — `pertence: false` |\n| `ZZZ9X99` | Situação inconclusiva na ANTT — `pertence: null` |\n| qualquer outra placa válida | Resposta de sucesso |\n",
"parameters": [
{
"name": "documento",
"in": "query",
"required": true,
"schema": {
"type": "string",
"pattern": "^([0-9]{11}|[0-9]{14})$"
},
"description": "CPF (11 dígitos) ou CNPJ (14 dígitos) do transportador consultado, somente dígitos."
},
{
"name": "rntrc",
"in": "query",
"required": true,
"schema": {
"type": "string",
"pattern": "^[0-9]{8,9}$"
},
"description": "RNTRC do transportador consultado, com 8 ou 9 dígitos."
},
{
"name": "placas",
"in": "query",
"required": true,
"style": "form",
"explode": true,
"schema": {
"type": "array",
"minItems": 1,
"maxItems": 20,
"items": {
"type": "string",
"pattern": "^[A-Za-z]{3}[0-9][A-Za-z0-9][0-9]{2}$"
}
},
"description": "Placas a verificar (1 a 20). Envie `placas[]=ABC1D23&placas[]=XYZ4E56`.\n\nEm homologação, `ZZZ0X00` devolve `pertence: false` e `ZZZ9X99` devolve\n`pertence: null`; qualquer outra placa válida devolve sucesso.\n"
}
],
"responses": {
"200": {
"description": "Situação de cada placa na frota do transportador.",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"documento": {
"type": "string"
},
"rntrc": {
"type": "string"
},
"frota": {
"type": "array",
"items": {
"type": "object",
"properties": {
"placa": {
"type": "string"
},
"pertence": {
"type": "boolean",
"nullable": true
},
"verificacao": {
"type": "string",
"description": "Natureza da verificação desta placa. Em homologação vem\n`simulada`: a situação não foi apurada na ANTT, foi gerada em\nmodo simulado e não tem efeito regulatório.\n\nO marcador viaja **dentro de cada item**, e não no envelope da\nresposta, para sobreviver a ingestões que guardam só a lista de\nplacas e descartam o envelope.\n\n**Trate o campo como opcional.** Ele só existe enquanto a\nverificação é simulada: item **sem** `verificacao` é verificação\nreal. Um parser que exija o campo quebra na virada para o\nprovedor real — leia por presença, não por obrigatoriedade.\n"
}
}
}
}
}
},
"environment": {
"$ref": "#/components/schemas/Environment"
}
}
}
}
}
},
"400": {
"description": "`rntrc_nao_confere` — o RNTRC informado não é o registro deste CPF/CNPJ, então não\nhá frota sobre a qual responder.\n`validacao` — alguma placa está fora do formato Mercosul, ou falta parâmetro.\n",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Erro"
}
}
}
},
"401": {
"$ref": "#/components/responses/Erro401"
},
"403": {
"$ref": "#/components/responses/Erro403"
},
"422": {
"description": "A empresa autenticada ainda não concluiu o cadastro fiscal (`empresa_nao_habilitada`).",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Erro"
}
}
}
},
"503": {
"description": "A consulta está temporariamente indisponível (`consulta_indisponivel`). Aguarde e tente de novo.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Erro"
}
}
}
}
},
"method": "GET",
"path": "/consultas/frota"
}