Após vencer uma ação judicial, o próximo desafio é localizar bens do devedor para garantir o pagamento. O Sherlocker permite mapear patrimônio de pessoa física ou jurídica — e expandir a busca para cônjuge, empresas vinculadas e sócios.

O problema

O devedor raramente tem bens em nome próprio. Patrimônio pode estar em nome do cônjuge, de empresas, de parentes ou em estados diferentes. Um levantamento manual exige consultas em dezenas de cartórios, Detrans e portais IPTU.

Estratégia de busca

1

Patrimônio direto do devedor

Imóveis, veículos, aeronaves, rural e patentes em nome do CPF/CNPJ
2

Identificar cônjuge e parentes

Buscar parentes — especialmente cônjuge (comunhão de bens)
3

Patrimônio do cônjuge

Repetir busca patrimonial no CPF do cônjuge
4

Empresas vinculadas

Sociedades onde o devedor é sócio — podem ter bens penhoráveis
5

Patrimônio das empresas

Imóveis e veículos em nome dos CNPJs vinculados
6

Consolidar e avaliar

Montar relatório com todos os bens encontrados e valores estimados

Implementação

Passo 1 — Patrimônio direto

import requests
from concurrent.futures import ThreadPoolExecutor

BASE = "https://modulos.sherlocker.dev"
TOKEN = "SEU_TOKEN"

def get(endpoint, **params):
    params["token"] = TOKEN
    return requests.get(f"{BASE}{endpoint}", params=params).json()

cpf_devedor = "12345678901"

# 5 consultas em paralelo
with ThreadPoolExecutor(max_workers=5) as pool:
    fut_imoveis = pool.submit(get, f"/imoveis/cpf/{cpf_devedor}")
    fut_veiculos = pool.submit(get, f"/veiculos/cpf/{cpf_devedor}")
    fut_aeronaves = pool.submit(get, f"/aeronaves/cpf/{cpf_devedor}")
    fut_rural = pool.submit(get, f"/rural/cpf/{cpf_devedor}")
    fut_patentes = pool.submit(get, f"/patentes/cpf/{cpf_devedor}")

patrimonio = {
    "imoveis": fut_imoveis.result(),
    "veiculos": fut_veiculos.result(),
    "aeronaves": fut_aeronaves.result(),
    "rural": fut_rural.result(),
    "patentes": fut_patentes.result(),
}

Passo 2 — Cônjuge e parentes

perfil = get(f"/pessoas/cpf/{cpf_devedor}")
parentes = perfil.get("parentes", [])

conjuge = next(
    (p for p in parentes if p.get("vinculo") == "conjuge"),
    None
)

# Se tem conjuge, buscar patrimonio dele tambem
if conjuge and conjuge.get("cpf_vinculo"):
    cpf_conjuge = conjuge["cpf_vinculo"]

    with ThreadPoolExecutor(max_workers=3) as pool:
        fut_im = pool.submit(get, f"/imoveis/cpf/{cpf_conjuge}")
        fut_ve = pool.submit(get, f"/veiculos/cpf/{cpf_conjuge}")
        fut_ru = pool.submit(get, f"/rural/cpf/{cpf_conjuge}")

    patrimonio["imoveis_conjuge"] = fut_im.result()
    patrimonio["veiculos_conjuge"] = fut_ve.result()
    patrimonio["rural_conjuge"] = fut_ru.result()

Passo 3 — Empresas vinculadas

sociedades = get(f"/empresas/cpf/{cpf_devedor}")

for socio in sociedades.get("socios", []):
    cnpj = socio["cnpj"]

    # Patrimonio da empresa
    with ThreadPoolExecutor(max_workers=2) as pool:
        fut_im = pool.submit(get, f"/imoveis/cnpj/{cnpj}")
        fut_ve = pool.submit(get, f"/veiculos/cnpj/{cnpj}")

    patrimonio[f"imoveis_empresa_{cnpj}"] = fut_im.result()
    patrimonio[f"veiculos_empresa_{cnpj}"] = fut_ve.result()

Passo 4 — Consolidar relatório

def contar_bens(patrimonio):
    imoveis = patrimonio.get("imoveis", {}).get("imoveis", [])
    veiculos = patrimonio.get("veiculos", {}).get("veiculos", [])
    valor_total = sum(float(im.get("valor_venal", 0) or 0) for im in imoveis)

    return {
        "imoveis": len(imoveis),
        "valor_imoveis": valor_total,
        "veiculos": len(veiculos),
        "aeronaves": len(patrimonio.get("aeronaves", {}).get("aeronaves", [])),
        "rurais": len(patrimonio.get("rural", {}).get("imoveis", [])),
    }

relatorio = contar_bens(patrimonio)

# Adicionar bens do conjuge
if conjuge:
    relatorio["conjuge"] = {
        "cpf": cpf_conjuge,
        "nome": conjuge.get("nome_vinculo"),
        "imoveis": len(patrimonio.get("imoveis_conjuge", {}).get("imoveis", [])),
        "veiculos": len(patrimonio.get("veiculos_conjuge", {}).get("veiculos", [])),
    }

# Adicionar bens das empresas
relatorio["empresas"] = []
for socio in sociedades.get("socios", []):
    cnpj = socio["cnpj"]
    relatorio["empresas"].append({
        "cnpj": cnpj,
        "razao_social": socio.get("razao_social"),
        "imoveis": len(patrimonio.get(f"imoveis_empresa_{cnpj}", {}).get("imoveis", [])),
        "veiculos": len(patrimonio.get(f"veiculos_empresa_{cnpj}", {}).get("veiculos", [])),
    })

Dica: usar o scoring de renda como triagem

Antes de iniciar o levantamento completo, use o endpoint de enriquecimento para ter uma estimativa rápida:
response = requests.post(
    f"{BASE}/leads/enriquecer",
    params={"token": TOKEN},
    json={
        "contatos": [{"cpf": cpf_devedor}],
        "campos": ["renda"]
    }
)

score = response.json()["resultados"][0].get("score_renda", {})
print(f"Faixa: {score.get('faixa')} — Score: {score.get('score')}")
print(f"Sinais: {score.get('sinais')}")
# Se faixa E, provavelmente nao ha bens penhораveis

APIs utilizadas

Imóveis

Propriedades urbanas por CPF/CNPJ

Veículos

Frota registrada

Rural

Imóveis rurais e SNCR

Aeronaves

Aeronaves e drones

Pessoas

Parentes e cônjuge

Empresas

Sociedades vinculadas

Enriquecer

Scoring de renda como triagem

Patentes

Propriedade intelectual