Consulta CAR — dados do imóvel rural pelo número de registro
Recebe um número de CAR (ou uma planilha cheia deles) e devolve os dados públicos do imóvel na base oficial do SICAR: município, estado, latitude, longitude, área (ha), módulos fiscais e data de cadastro.
Como funciona por baixo
O portal https://consulta.car.gov.br/ expõe a consulta numa API pública simples — a MESMA chamada que o site faz ao clicar em "Buscar":
GET https://consulta.car.gov.br/api/totalizer/getDeatilsByIdentifier/<NUMERO>
- Atenção ao endpoint: é
getDeatilsByIdentifiermesmo (typo oficial). - Aceita o número com ou sem pontos (
PI-2200053-1BAB.C06A...ouPI-2200053-1BABC06A...). Sem captcha, sem token. - Resposta: JSON com
nameCity,nameState,idState,latitudeelongitude(em graus/min/seg, ex.:8°22'26.947"S),haRegisteredArea,fiscalModules,createdAtebounderBox— este último é a CAIXA ENVOLVENTE (retângulo WKT), não o perímetro do imóvel; ver a regra 5. - CAR inexistente responde 200 com corpo VAZIO — trate como "não encontrado", não como erro.
- Formato válido do número:
UF-CCCCCCC-HHHHHHHH...(UF, 7 dígitos do código IBGE do município, 32 caracteres hexadecimais).
Caminho 1 — script (Claude Code, Cowork e qualquer ambiente com Python)
Use scripts/consultar_car.py (só biblioteca padrão, Python 3.9+, precisa
de internet):
# um CAR: JSON com todos os campos + perímetro nos 3 formatos
python scripts/consultar_car.py "PI-2200053-1BAB.C06A.E224.43BC.A804.FFEC.51C2.5EB9"
# VÁRIOS CARs (o usuário colou uma lista no chat) — 1 arquivo POR CAR
python scripts/consultar_car.py "PI-2200053-1BAB..." "PE-2606309-8C20..."
# planilha: PREENCHE as células vazias E salva os perímetros (1 por CAR)
python scripts/consultar_car.py fazendas.xlsx
python scripts/consultar_car.py lista.csv -o resultado.csv
# opções: --decimal (lat/long decimais) · --sobrescrever (reconsulta tudo)
# --sem-feicao (não baixar os perímetros)
ENTREGUE OS PERÍMETROS JUNTO, SEMPRE — não ofereça, não pergunte. Vale para os TRÊS modos:
- Um CAR: o script salva o perímetro nos três formatos (
feicoesno JSON:<CAR>.geojson+<CAR>-shapefile.zip+<CAR>.kml). Apresente os dados E entregue os três arquivos na mesma resposta. - Vários CARs no chat e planilha: mesma regra — ver abaixo.
UM ARQUIVO POR CAR (decisão do fundador 2026-08-13)
Com mais de um CAR — seja lista no chat, seja planilha — cada imóvel vira um arquivo PRÓPRIO (nada de tudo junto numa coleção só), empacotados em um zip por formato:
<base>-geojson.zip → PI-2200053-....geojson · PE-2606309-....geojson
<base>-shapefile.zip → cada CAR com seu .shp/.shx/.dbf/.prj
<base>-kml.zip → PI-2200053-....kml · PE-2606309-....kml
<base> é cars-perimetros (lista no chat) ou <planilha>-preenchida-perimetros
(modo planilha). Entregue TODOS os zips gerados — e, no modo planilha, a
planilha preenchida junto.
NUNCA responda só com os dados e deixe o shape para um segundo pedido. Se o
usuário não quiser as feições, ele avisa (ou use --sem-feicao). Só há um
caso em que os perímetros não vêm: ambiente sem internet (sandbox do chat)
— aí avise que o download exige rede.
O leitor/escritor de XLSX é embutido (sem openpyxl): lê a primeira aba e
escreve um arquivo válido para Excel/Sheets. CSV aceita ; ou ,.
O script pausa 0,5 s entre consultas (gentileza com o servidor público) e
reporta linha a linha o que não encontrou ou está inválido.
Caminho 2 — ambiente sem internet (sandbox do chat)
A sandbox de código do chat (claude.ai) só alcança uma lista fechada de
hosts (pypi, github…); consulta.car.gov.br NÃO está nela, então o script
recebe 403 host_not_allowed e o fetch de URL também falha. Isso é
limite do ambiente, não da skill — e ela trata assim:
- Preenchimento OFFLINE (sempre roda): o código IBGE do município está
embutido no número do CAR (os 7 dígitos após a UF). Com
references/municipios_ibge.tsv(5.571 municípios), o script preenche município, estado e UF sem tocar a rede — e marca a linha como PARCIAL. Só latitude, longitude, área e módulos fiscais exigem a API. - Se você (IA) TIVER uma ferramenta de fetch que alcance o site (algumas alcançam mesmo com a sandbox bloqueada), monte a URL da API com o número normalizado e leia o JSON — assim completa os campos que faltam. Para poucos CARs (até ~15).
- Se nada alcançar o site, diga ao usuário com todas as letras: os dados geográficos só vêm da base oficial e este ambiente bloqueia o acesso — rode a skill no Claude Code ou no Cowork (internet real), onde ela funciona ponta a ponta. Não invente lat/long/área.
O script já faz tudo isso: em bloqueio ele preenche o que dá offline, avisa o motivo e sai com código 3 (único) ou reporta "N PARCIAL(is)" (planilha).
Caminho 3 — último recurso (navegador)
Com browser automation disponível e a API fora do ar: abra https://consulta.car.gov.br/, preencha o campo "Número de registro no CAR" (canto direito do bloco "Confira as áreas cadastradas"), clique em Buscar e leia o bloco "Dados do imóvel rural" no fim da página (município, UF, lat/long, área, módulos fiscais).
Baixar a FEIÇÃO do imóvel (polígono) — SEM captcha, via WFS oficial
O botão "Baixar feições" do site empacota um shapefile atrás de um reCAPTCHA, mas o MESMO dado geográfico está no GeoServer público do SICAR — filtrável pelo código do imóvel numa requisição pública legítima. É o caminho preferido (roda em qualquer ambiente com Python e rede, sem clique nenhum):
# perímetro do imóvel — sai em GeoJSON + Shapefile(.zip) + KML (padrão)
python scripts/baixar_feicao.py "PI-2200053-1BAB.C06A.E224.43BC.A804.FFEC.51C2.5EB9"
# escolher formatos / camadas temáticas do cadastro
python scripts/baixar_feicao.py <CAR> --formatos geojson,kml
python scripts/baixar_feicao.py <CAR> --temas arl_averbada,vegetacao_nativa
python scripts/baixar_feicao.py <CAR> --temas todos # varre as comuns
# converter um GeoJSON já baixado (ex.: veio do chat) em shapefile + kml
python scripts/converter.py area.geojson
# usuário anexou o zip de feições do site? extrai (inclusive zip aninhado)
# e gera o GeoJSON do polígono real
python scripts/feicoes.py shape-car.zip
python scripts/feicoes.py shape-car.zip --somente-perimetro
Por baixo: GET .../geoserver/consulta_publica/ows (WFS 2.0, GetFeature,
cql_filter=cod_imovel='<CAR>', outputFormat=application/json). A camada
iru é o perímetro; as demais (arl_*, vegetacao_nativa,
area_consolidada, app_* etc.) filtram pelo mesmo campo. A conversão
(converter.py) é Python puro (sem GDAL): escreve Shapefile
(.shp/.shx/.dbf/.prj num .zip) e KML, tudo em SIRGAS 2000. Abre direto no
QGIS/Google Earth e serve de perímetro para a skill krigagem-solo.
Detalhes das camadas em references/api-sicar.md.
Fallback — baixar o SHAPEFILE oficial pelo site (com captcha)
Só quando o usuário precisar do pacote shapefile idêntico ao do site (ou o WFS estiver fora). Aí o download tem reCAPTCHA, que é para HUMANO resolver — a skill NUNCA burla, resolve ou terceiriza captcha:
O usuário já anexou um zip de feições nesta conversa? Então NÃO peça download nem sugira alternativa: rode
scripts/feicoes.pynele agora. É o caminho mais curto para o polígono real.Requer navegador (Claude Code/Cowork). Abra o site, preencha o CAR, Buscar, e no painel "Detalhes" clique "Baixar feições".
PARE e peça ao usuário: "clique no 'Não sou um robô' — eu sigo daqui".
Com o zip baixado,
scripts/feicoes.py <arquivo>.zip:- extrai o pacote inclusive os zips aninhados (o SICAR entrega
Area_do_Imovel.zipdentro do zip externo); - lista os temas com geometria, registros e caixa envolvente;
- gera o GeoJSON de cada tema — o polígono REAL, todos os vértices,
em SIRGAS 2000. O do perímetro alimenta
converter.py(→ shapefile + KML) e a skillkrigagem-solo.
Se o WFS falhou e o usuário NÃO tem o zip, peça que ele baixe pelo site e anexe aqui. Não invente substituto geométrico — ver a regra 5.
- extrai o pacote inclusive os zips aninhados (o SICAR entrega
Regras de resposta
- Normalize antes de consultar: maiúsculas, sem espaços; valide o formato (UF + 7 dígitos + 32 hex). Número mal formado → diga o que está errado em vez de consultar à toa.
- Planilha: NUNCA sobrescreva célula já preenchida (padrão do script); preserve as colunas e a ordem do arquivo do usuário; colunas que não existirem (ex.: Módulos Fiscais) são acrescentadas ao final.
- Não encontrado ≠ erro: informe quais números não existem na base e siga com os demais.
- Ao apresentar resultado único, entregue os campos em lista limpa (como o site mostra).
- NUNCA use o
bounderBoxcomo perímetro. Ele é a CAIXA ENVOLVENTE do imóvel — um retângulo de 4 cantos que engloba terra de vizinhos. O perímetro real tem dezenas ou centenas de vértices. Se o usuário quer plotar em GIS, quer o polígono: rodebaixar_feicao.py(WFS, sem captcha) ou processe o zip de feições comfeicoes.py. Entregar o retângulo produz mapa errado com cara de certo — e, encadeado na skillkrigagem-solo, interpola sobre área que não é do imóvel. ObounderBoxserve só para enquadrar um mapa de visualização rápida, e mesmo aí diga que é caixa envolvente, não limite da propriedade. - Cite a fonte e a data: "Consulta Pública do CAR (consulta.car.gov.br), consultado em ". Os dados são autodeclarados pelo proprietário no SICAR — situação cadastral e sobreposições NÃO vêm nesta consulta.
- São dados PÚBLICOS do governo federal; ainda assim, não especule sobre o proprietário — a consulta não traz (nem deve trazer) dados pessoais.
Limites conhecidos
- A API pública traz o RESUMO do imóvel — não traz situação do cadastro (ativo/pendente/cancelado), reserva legal, APP nem sobreposição; para isso o caminho é o demonstrativo completo no site com o proprietário.
- Latitude/longitude são o centroide declarado, em DMS; use
--decimalpara converter (S/W negativos). - Base atualizada periodicamente pelo SICAR (a data aparece no rodapé do site) — pequenas divergências com o painel estadual são esperadas.