# Consulta Car

> Consulta pública do CAR (Cadastro Ambiental Rural / SICAR): a partir do número de registro, traz município, estado, latitude, longitude, área do imóvel, módulos fiscais e data de cadastro — direto da base oficial (consulta.car.gov.br). Funciona com UM número no chat ou com uma PLANILHA (CSV/XLSX) de vários CARs, preenchendo as colunas faltantes e devolvendo a planilha completa. Acione com "consultar CAR", "dados do CAR", "SICAR", "preencher planilha de CAR" ou quando o usuário colar um número no formato UF-1234567-XXXX.XXXX...

- Skill: `guilherme-iaparaagronomos/consulta-car` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add guilherme-iaparaagronomos/consulta-car`
- Raw SKILL.md: https://api.skillmd.com/api/skills/guilherme-iaparaagronomos/consulta-car/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: guilherme-iaparaagronomos (https://skillmd.com/u/guilherme-iaparaagronomos)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/guilherme-iaparaagronomos/consulta-car

---


# 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: é `getDeatilsByIdentifier` mesmo (typo oficial).
- Aceita o número **com ou sem pontos** (`PI-2200053-1BAB.C06A...` ou
  `PI-2200053-1BABC06A...`). Sem captcha, sem token.
- Resposta: JSON com `nameCity`, `nameState`, `idState`, `latitude` e
  `longitude` (em graus/min/seg, ex.: `8°22'26.947"S`), `haRegisteredArea`,
  `fiscalModules`, `createdAt` e `bounderBox` — 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):

```bash
# 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 (`feicoes` no
  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:

1. **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.
2. 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).
3. 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):

```bash
# 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:

0. **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.py` nele
   agora. É o caminho mais curto para o polígono real.
1. Requer navegador (Claude Code/Cowork). Abra o site, preencha o CAR,
   **Buscar**, e no painel "Detalhes" clique **"Baixar feições"**.
2. **PARE e peça ao usuário**: "clique no 'Não sou um robô' — eu sigo daqui".
3. Com o zip baixado, `scripts/feicoes.py <arquivo>.zip`:
   - extrai o pacote **inclusive os zips aninhados** (o SICAR entrega
     `Area_do_Imovel.zip` dentro 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 skill `krigagem-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.

## Regras de resposta

1. **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.
2. **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.
3. **Não encontrado ≠ erro**: informe quais números não existem na base e
   siga com os demais.
4. Ao apresentar resultado único, entregue os campos em lista limpa (como o
   site mostra).
5. **NUNCA use o `bounderBox` como 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: rode `baixar_feicao.py` (WFS, sem
   captcha) ou processe o zip de feições com `feicoes.py`. Entregar o
   retângulo produz mapa errado com cara de certo — e, encadeado na skill
   `krigagem-solo`, interpola sobre área que não é do imóvel. O `bounderBox`
   serve só para enquadrar um mapa de visualização rápida, e mesmo aí diga
   que é caixa envolvente, não limite da propriedade.
6. **Cite a fonte e a data**: "Consulta Pública do CAR (consulta.car.gov.br),
   consultado em <data>". Os dados são autodeclarados pelo proprietário no
   SICAR — situação cadastral e sobreposições NÃO vêm nesta consulta.
7. 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 `--decimal`
  para 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.



