Confira o preço antes de iniciar a pesquisa. Envie POST /v1/orcamento/car-demonstrativo com os dados que deseja pesquisar. O orçamento informa o valor e a disponibilidade, sem cobrar.
Sistema Nacional de Cadastro Ambiental Rural (SICAR)
CAR — demonstrativo (Reserva Legal e APP)
Reserva Legal, APP, uso restrito, cobertura do solo e passivo ambiental declarados no CAR, pelo número do CAR.
Site oficial da fonte ↗/v1/consultas/car-demonstrativo
v1
Tempo típico
não medido
Preço
R$ 2,99
por consulta
Visão geral
Responde "a Reserva Legal deste imóvel está regular e quanto há de APP": a pergunta que trava compra de fazenda, crédito rural e due diligence ambiental.
Traz situação e condição do cadastro, áreas de Reserva Legal (declarada, proposta, averbada), APP, uso restrito, cobertura do solo e o passivo ou excedente de Reserva Legal.
Leitura do demonstrativo público do SICAR. O preço cobre a operação e o arquivamento.
Antes de começar
Cobrança, idempotência e leitura do resultado. Leia antes da primeira chamada.
Custa dinheiro se você ignorar 1
A busca é pelo número do CAR, nunca pelo CPF/CNPJ
Sem o número do CAR (recibo de inscrição) não há como localizar o imóvel; a consulta sem car não é executada nem cobrada.
Vale saber antes de integrar 2
Tempo: a origem exige reCAPTCHA
Cada consulta resolve um reCAPTCHA no site do SICAR antes de ler o demonstrativo. Na medição de 20/10/2026 o desafio levou 95 s; o PDF oficial pede um segundo desafio e ~20 s de geração. Conte com 1 a 3 minutos. A chamada é assíncrona: acompanhe pelo protocolo ou pelo webhook.
Números declarados, não laudo
As áreas são as que o SICAR publica para o cadastro, sem soma ou derivação nossa. Enquanto a condição for "Aguardando análise", são declaração do proprietário, não aprovação do órgão.
Requisição
Autentique com token no cabeçalho. Parâmetro obrigatório ausente é recusado com
422, antes de qualquer cobrança.
cpf_cnpj
string
obrigatório
CPF ou CNPJ a quem a consulta fica associada no seu cadastro (o titular ou o interessado). Não é enviado ao SICAR.
car
string
obrigatório
Número de inscrição do imóvel no CAR, como no recibo do SICAR. Com ou sem os pontos.
finalidade
string
opcional
Obrigatória (mínimo 10 caracteres) quando cpf_cnpj é um CPF que ainda não está no seu cadastro.
Envie apenas o token e os dados. Cada POST inicia uma nova consulta, mesmo com dados iguais, com protocolo e cobrança próprios.
Use os exemplos no backend. Guarde o protocolo recebido e acompanhe por GET. Se a resposta do POST se perder, confira o histórico antes de reenviar: outro POST é outro pedido.
// Execute somente no backend (Node.js 22+). Configure o token no servidor.
// const pedido = await consultarOficialData(process.env.OFICIALDATA_TOKEN, dados);
// Guarde pedido.protocolo. Depois use acompanharOficialData(token, pedido.protocolo).
// Cada POST inicia uma nova consulta, mesmo com dados iguais.
// Resposta perdida: confira o histórico antes de reenviar; outro POST é outro pedido.
export async function consultarOficialData(token, dados = {"cpf_cnpj":"12345678000190","car":"MG-3103405-4266.D811.310B.4471.B6F1.8330.051D.1255"}) {
const corpo = await enviar(token, "https://api.oficialdata.com.br/v1/consultas/car-demonstrativo", dados);
const protocolo = corpo.data?.[0]?.protocolo;
if (corpo.code !== 202 || !protocolo) throw new Error(JSON.stringify(corpo));
return { protocolo: String(protocolo), resposta: corpo };
}
export async function acompanharOficialData(token, protocolo) {
if (!/^\d+$/.test(String(protocolo))) throw new Error('Informe o protocolo recebido.');
const corpo = await enviar(token, "https://api.oficialdata.com.br" + '/v1/consultas/' + encodeURIComponent(protocolo));
// code 202: aguarde intervalo_consulta_segundos e consulte novamente por GET.
// code 200/6xx: confira o resultado. Não repita o POST para acompanhar.
return { protocolo: String(protocolo), resposta: corpo };
}
async function enviar(token, url, dados) {
if (!token) throw new Error('Informe o token de acesso.');
const post = dados !== undefined;
const resposta = await fetch(url, {
method: post ? 'POST' : 'GET',
headers: {
Authorization: 'Bearer ' + token, Accept: 'application/json',
...(post && { 'Content-Type': 'application/json' }),
},
...(post && { body: JSON.stringify(dados) }),
signal: AbortSignal.timeout(30000),
});
const corpo = await resposta.json();
// Não repita POST automaticamente após timeout: o pedido pode ter sido aceito.
if (!resposta.ok) throw new Error('HTTP ' + resposta.status + ': ' + JSON.stringify(corpo));
return corpo;
}
A consulta aceita responde HTTP 202 com protocolo.
Acompanhe até a conclusão e confira o campo code do resultado.
Resposta
Dentro de data[]:
15 campos em 3 blocos.
Campo que a origem não informou volta null —
nunca 0 nem string vazia. Trate
null como dado ausente, não como zero.
data[]
object
SUCESSO ou NAO_ENCONTRADO.
Frase descritiva, nunca veredito de regularidade.
PDF oficial do SICAR ("Demonstrativo da Situação das Informações Declaradas no CAR"). Se a origem não o gerar, é o comprovante da OficialData (comprovante_sintetico: true).
Quando consultamos a origem, em ISO-8601.
identificadores
object
Número do CAR consultado.
dados
object
Situação do cadastro (Ativo, Pendente, Suspenso, Cancelado).
Fase da análise pelo órgão estadual.
Área do imóvel, em hectares.
Situação da Reserva Legal (ex.: não analisada, aprovada).
Reserva Legal mínima exigida por lei para o imóvel, em hectares.
Reserva Legal declarada, em hectares.
APP, em hectares.
Área de uso restrito, em hectares.
Positivo = excedente de vegetação; negativo = passivo (déficit) de Reserva Legal, em hectares. Convenção do SICAR.
Área sobreposta a terra indígena, em hectares. Também sobreposicao_unidade_conservacao, sobreposicao_assentamento e sobreposicao_outros_imoveis.
Códigos de erro
O mesmo mapa que o motor usa em produção. Leia as colunas Estorna e Retenta antes de integrar: nem toda falha devolve o dinheiro.
| Classe | Códigos | Significa | Estorna | Retenta |
|---|---|---|---|---|
sucesso |
200 | A origem respondeu e entregou. | — | — |
nao_encontrado |
612 | A origem respondeu: nada consta para este alvo. | Não | Não |
indeterminado |
611 | A origem não conseguiu emitir pela internet. Não é irregularidade. | Não | Não |
erro_participante |
608 619 620 | A origem recusou os DADOS do pedido. | Não | Sim |
retry |
600 605 609 610 613 614 615 618 | Instabilidade momentânea da origem ou do transporte. | Sim | Sim |
fatal |
601 602 603 604 606 607 617 621 622 | Defeito de integração — nosso, não seu. | Sim | Não |
Estorno:
erro_participante é a única
classe que não devolve o dinheiro — nela a origem
respondeu recusando os dados do pedido. Corrija o alvo antes de repetir.
fatal é falha nossa e sempre estorna.
Permanentes: não retente 602 e 603. A fonte sai do ar na hora e a nossa equipe é avisada.
Preço
Preço único por consulta pelo canal API. Confira o orçamento em
POST /v1/orcamento/car-demonstrativo
antes de disparar em lote.
R$ 2,99
por consulta
Este é o preço da sua conta pelo canal API. Acordos vigentes prevalecem.
Como interpretar o orçamento
Motivo do preço, piso mínimo e situação da cota.
Leia data[0].preco.total para saber o valor previsto da consulta.
header.price é zero porque orçar não cobra.
preco.motivo é um slug estável para sua integração;
preco.justificativa é o texto para exibir ao usuário e pode evoluir.
coberto_pela_cota- A cota cobre a consulta, sem débito de saldo. A execução consumirá as unidades previstas.
fonte_gratuita- A regra de preço aplicada considera a fonte gratuita. Confira se o piso do canal permanece cobrado.
cortesia- Aplica-se uma cortesia comercial. Ela pode continuar sujeita ao piso mínimo da API.
cobranca_avulsa- Aplica-se o preço avulso da consulta no canal API.
preco_negociado- Aplica-se uma condição negociada para a conta.
preco_ao_custo- Aplica-se a condição de preço ao custo da conta, com o piso do canal quando indicado.
somente_emolumentos- A cota cobre o serviço; permanece o emolumento do cartório.
taxa_na_cota- A cota cobre o pedido com a taxa reduzida do plano; soma-se o emolumento do cartório.
taxa_do_plano- Aplica-se a taxa de cartório do plano, com a execução por nossa conta; soma-se o emolumento. O pedido não consome cota.
taxa_integrador- Aplica-se a taxa de cartório do plano Integrador; soma-se o emolumento do cartório.
emolumentos_e_servico- O valor inclui emolumentos do cartório e a cobrança pelo serviço.
Quando preco.piso_minimo_aplicado é true, o mínimo da API
permanece cobrado. Use sempre preco.total: cortesia, custo zero da origem
ou plano Gratuito não garantem uma consulta a R$ 0.
cota.status informa disponivel, esgotada,
insuficiente (restam unidades, mas não bastam para a operação),
fonte_fora_da_cota ou plano_sem_cota.
cota.restante é a quantidade livre agora; unidades_necessarias
é o peso da operação e unidades_previstas é o consumo previsto na execução.
Uma consulta gratuita por outra regra pode ter cota disponível e prever consumo zero.
cota.eixo identifica a franquia e cota.limite o limite do ciclo.
cota.origem distingue plano de trial.
cota.reservada é sempre false: o orçamento não reserva nem
consome unidades. Preço, cota e disponibilidade serão revalidados ao executar.
Se disponivel for false, leia o motivo_codigo
e a mensagem motivo da resposta. Nesse caso, preco.total,
preco.motivo, preco.justificativa e cota vêm
null. Preço desconhecido não significa gratuidade. Disponibilidade e preço
também não dispensam saldo ou os demais requisitos da execução.
Limites e desempenho
Números medidos em produção. "Não medido" é falta de amostra — nenhum valor aqui é estimativa.
Tempo típico
não medido
p95
não medido
Teto por hora
—
Timeout máximo
—
De onde vem o tempo: cerca de 85% dos ~s típicos é a origem varrendo os cartórios. Dimensione o seu timeout por esse número e não conte com redução.
Sobre o teto: a origem exige sessão única por conta, então os pedidos são serializados. É limite técnico, não cota comercial: acima dele a fila cresce e paralelizar do seu lado não acelera. Para volume maior, combine antes.
Versionamento
O contrato de resposta é v1,
e a versão viaja em header.api_version
em toda resposta.
- Campo novo opcional pode entrar a qualquer momento e não muda a versão. Seu parser precisa ignorar campo que não conhece.
- Remover campo, renomear campo ou mudar tipo é versão nova, publicada em paralelo, com prazo de desligamento anunciado da anterior.
- Nunca alteramos o significado de um campo existente mantendo o nome. Se o significado muda, o nome muda junto.
Vai integrar?
Diga o volume que você espera e em quais UFs. A ordem de liberação segue a demanda.