Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.sherlocker.com.br/llms.txt

Use this file to discover all available pages before exploring further.

Dado uma lista de CPFs — ou apenas telefones/emails — o Sherlocker permite construir um perfil completo de cada lead: nome, endereços, telefones, emails, vínculos empresariais e sinais patrimoniais.

Estratégia

1

Identificar o CPF

Se você só tem telefone ou email, use a busca reversa para resolver para CPF
2

Buscar dados cadastrais

Nome, endereços, telefones, emails e parentes a partir do CPF
3

Buscar vínculos empresariais

Empresas onde a pessoa é sócia ou funcionária
4

Sinais patrimoniais (opcional)

Imóveis e veículos para qualificar o lead por capacidade financeira

Implementação

Cenário 1 — Tem o CPF

import requests
from concurrent.futures import ThreadPoolExecutor

BASE = "https://221b-api.sherlocker.com.br/api/v1"
TOKEN = "SEU_TOKEN"

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

cpf = "12345678901"

# Busca paralela: cadastro + empresas + patrimônio
with ThreadPoolExecutor(max_workers=4) as pool:
    fut_pessoa   = pool.submit(get, f"/pessoas/cpf/{cpf}")
    fut_empresas = pool.submit(get, f"/empresas/cpf/{cpf}")
    fut_imoveis  = pool.submit(get, f"/imoveis/cpf/{cpf}")
    fut_veiculos = pool.submit(get, f"/veiculos/cpf/{cpf}")

pessoa   = fut_pessoa.result()
empresas = fut_empresas.result()
imoveis  = fut_imoveis.result()
veiculos = fut_veiculos.result()

lead = {
    "cpf": cpf,
    "nome": pessoa.get("nome_completo"),
    "data_nascimento": pessoa.get("data_nascimento"),
    "enderecos": pessoa.get("enderecos", []),
    "telefones": [t.get("numero_completo") for t in pessoa.get("telefones", [])],
    "emails": [e.get("email") for e in pessoa.get("emails", [])],
    "empresas": [s.get("razao_social") for s in empresas.get("socios", [])],
    "imoveis": len(imoveis.get("imoveis", [])),
    "veiculos": len(veiculos.get("veiculos", [])),
}

Cenário 2 — Tem o telefone

telefone = "11987654321"
reverso = get(f"/pessoas/telefone/{telefone}")

for resultado in reverso.get("resultados", []):
    cpf = resultado["cpf"]
    pessoa = get(f"/pessoas/cpf/{cpf}")
    print(f"{cpf}{pessoa.get('nome_completo')}")

Cenário 3 — Enriquecer lista em lote

from concurrent.futures import ThreadPoolExecutor, as_completed

def enriquecer(cpf):
    pessoa = get(f"/pessoas/cpf/{cpf}")
    if not pessoa.get("nome_completo"):
        return None
    enderecos = pessoa.get("enderecos", [])
    telefones = pessoa.get("telefones", [])
    return {
        "cpf": cpf,
        "nome": pessoa["nome_completo"],
        "cidade": enderecos[0].get("cidade") if enderecos else None,
        "uf": enderecos[0].get("uf") if enderecos else None,
        "telefones": [t.get("numero_completo") for t in telefones],
        "emails": [e.get("email") for e in pessoa.get("emails", [])],
    }

lista_de_cpfs = ["12345678901", "98765432100", "11122233344"]

resultados = []
with ThreadPoolExecutor(max_workers=10) as pool:
    futures = {pool.submit(enriquecer, cpf): cpf for cpf in lista_de_cpfs}
    for fut in as_completed(futures):
        r = fut.result()
        if r:
            resultados.append(r)

Dados disponíveis por endpoint

EndpointDados retornados
/pessoas/cpf/{cpf}Nome, endereços, telefones, emails, parentes, data nascimento
/empresas/cpf/{cpf}Sociedades e empregos vinculados ao CPF
/imoveis/cpf/{cpf}Imóveis urbanos registrados
/veiculos/cpf/{cpf}Veículos registrados
/pessoas/telefone/{tel}Busca reversa: telefone → CPF
/emails/email/{email}Busca reversa: email → CPFs

APIs utilizadas

Pessoas

Nome, contatos, endereços, parentes

Busca por telefone

Telefone → CPF

Empresas

Sociedades e empregos

Imóveis

Patrimônio imobiliário

Veículos

Frota registrada