Simulador

Plano API

API do Simulador Habitacional

Leve o CRM e as simulações para o seu site, CRM, chatbot ou automação: cadastre e altere clientes, imóveis e corretores, receba respostas de formulário, faça simulações completas e receba avisos em tempo real.

Começando

  1. Assine o plano API e entre no painel em API e integrações.
  2. Crie uma chave (ela aparece só uma vez).
  3. Envie a chave em todo pedido: Authorization: Bearer sh_live_…

Endereço base: https://www.simuladorhabitacional.com/api/v1 · JSON em UTF-8 · datas de nascimento em dd/mm/aaaa, demais datas em ISO 8601 · valores em reais (número, ponto decimal).

curl https://www.simuladorhabitacional.com/api/v1/clientes?limite=5 \
  -H "Authorization: Bearer sh_live_SUA_CHAVE"

// JavaScript
const r = await fetch("https://www.simuladorhabitacional.com/api/v1/simulacoes", {
  method: "POST",
  headers: { Authorization: "Bearer sh_live_SUA_CHAVE", "Content-Type": "application/json" },
  body: JSON.stringify({ renda: 3500, nascimento: "10/05/1990", cidade: "Goiânia - GO", valor_imovel: 230000 }),
});
const simulacao = await r.json();   // simulacao.link → página do resultado com a sua marca

Erros e limites

Erros vêm como { "erro": { "codigo": "…", "mensagem": "…" } }.

400JSON inválido ou identificador inválido
401Sem chave, chave inválida ou revogada
403Plano API inativo ou vencido
404Registro ou endereço não encontrado (inclusive de outra conta)
422Dados inválidos (campo obrigatório, etapa/corretor inexistente, cidade não encontrada)
429Mais de 120 requisições por minuto

Listas: até 500 por página. Criação em lote: até 500 registros por pedido. Cada chave só enxerga os dados da própria conta.

Conta

Dados da conta dona da chave.

GET /api/v1/conta

Nome, plano, validade do acesso e o link do formulário.

Resposta

{ "nome": "Juliana Andrade", "plano": "api", "acesso_ate": "2027-10-18", "formulario_url": "https://…/f/juliana-andrade" }

Clientes (CRM)

Os clientes do funil. Campos: nome*, telefone, email, renda, nascimento (dd/mm/aaaa), cidade ("Cidade - UF"), valor_imovel, entrada, saldo_fgts, fgts3, mais_de_um, possui_imovel, observacoes, respostas (objeto livre), etapa_id ou etapa (nome), corretor_id ou corretor (nome), imovel_id, correspondente_id, motivo_perda_id, valor_venda.

GET /api/v1/clientes

Lista paginada (mais novos primeiro).

limite1 a 500 (padrão 100)
paginaa partir de 1
etapa_idsó desta etapa
corretor_idsó deste corretor
telefonebusca pelo número
emaile-mail exato
buscaparte do nome
desdecriados a partir de (ISO 8601)
atualizado_desdealterados a partir de (ISO 8601) — use para sincronizar

Resposta

{ "dados": [ { "id": "…", "nome": "Maria Souza", "telefone": "62999990000", "renda": 3500, "etapa_id": "…", "criado_em": "…" } ], "pagina": 1, "limite": 100, "total": 1 }
POST /api/v1/clientes

Cria um cliente — ou vários, enviando uma lista (até 500). Sem etapa, entra na primeira etapa do funil.

Corpo

{ "nome": "Maria Souza", "telefone": "62999990000", "renda": 3500, "nascimento": "10/05/1990", "cidade": "Goiânia - GO", "valor_imovel": 230000, "etapa": "Simulado", "corretor": "Ana" }
GET /api/v1/clientes/{id}

Um cliente.

PATCH /api/v1/clientes/{id}

Altera só os campos enviados.

Corpo

{ "observacoes": "Ligar amanhã", "valor_venda": 225000 }
POST /api/v1/clientes/{id}/etapa

Move o cliente no funil (aceita nome da etapa). Gera histórico e o webhook cliente.etapa_alterada.

Corpo

{ "etapa": "Aprovado" }
GET /api/v1/clientes/{id}/historico

Mudanças de etapa e de corretor, com data.

GET /api/v1/clientes/{id}/simulacoes

Simulações feitas para o cliente, com o link do resultado.

DELETE /api/v1/clientes/{id}

Exclui o cliente.

Simulações

Simulação completa com as regras oficiais da Caixa e do Minha Casa Minha Vida (subsídio do FGTS, PRICE e SAC) e comparação com os outros bancos.

POST /api/v1/simulacoes

Simula com os dados enviados ou com os de um cliente (cliente_id). Por padrão salva e devolve o link do resultado com a sua marca (salvar: false para não salvar).

renda*renda bruta familiar
nascimento*dd/mm/aaaa do mais velho
cidade*"Cidade - UF" ou código IBGE
valor_imovel*valor de avaliação
valor_vendase diferente da avaliação
operacaonovo | usado
tipoapartamento | casa
metragemárea privativa (deixa o subsídio exato)
entradavalor disponível
saldo_fgtssaldo do FGTS
fgts33 anos de FGTS (true/false)
mais_de_ummais de um comprador ou dependente
prazo_mesesprazo desejado (limitado ao máximo pela idade)
parcela_maxparcela máxima desejada — mostra quanto libera
cliente_idusa os dados do cliente
salvarpadrão true
sugerir_imoveistrue: devolve imoveis_ideais — o cliente simulado em cada imóvel à venda, ordenado por caber no bolso e proximidade
cidade_preferenciaonde o cliente quer morar (para a proximidade)
bairro_preferenciabairro ou região preferida

Corpo

{ "renda": 3500, "nascimento": "10/05/1990", "cidade": "Goiânia - GO", "valor_imovel": 230000, "fgts3": true, "saldo_fgts": 8000 }

Resposta

{ "id": "…", "link": "https://…/s/…", "programa": "Minha Casa Minha Vida – Faixa 2", "subsidio": 9850.2, "prazo_maximo_meses": 420,
  "sac": { "financiamento": 176000, "primeira_parcela": 1049.6, "taxa_efetiva": 0.0723, "prazo_meses": 420, "limitado_por": "renda" },
  "price": { … }, "bancos": [ { "banco": "Caixa", "taxa_efetiva": 0.0723, "sac": { "financiamento": 176000, "primeira_parcela": 1049.6 } }, … ],
  "renda_ideal": { "price": 3700, "sac": 4100, "credito_price": 186553, "credito_sac": 184000 }, "avisos": [ … ] }
GET /api/v1/simulacoes

Últimas simulações (filtro opcional cliente_id).

GET /api/v1/simulacoes/{id}

Uma simulação salva.

Formulários

Cada conta tem um formulário (/f/<link>) e cada corretor da equipe tem o seu. Pela API você lê e configura as perguntas e envia respostas como se o cliente tivesse preenchido.

GET /api/v1/formulario

Link, mensagem, cor e perguntas do formulário principal (perguntas null = padrão).

PUT /api/v1/formulario

Configura o formulário. Perguntas: id, rotulo, tipo (texto, longo, numero, dinheiro, data, sim_nao, escolha, marcar), opcoes, obrigatorio, oculto. Ids padrão (alimentam a simulação): nome, telefone, email, renda, nascimento, cidade, valor_imovel, entrada, saldo_fgts, vinculo, estado_civil, conjuge_renda, divida, aluguel, fgts3, mais_de_um, possui_imovel, observacao.

Corpo

{ "mensagem": "Preencha e receba sua simulação", "cor": "#0e7490", "perguntas": [ { "id": "nome", "rotulo": "Seu nome" }, { "id": "telefone", "rotulo": "WhatsApp" }, { "rotulo": "Tem carro financiado?", "tipo": "sim_nao", "obrigatorio": true } ] }
GET /api/v1/formularios

Todos os formulários da conta (o principal e o de cada corretor da equipe).

POST /api/v1/formulario/respostas

Envia uma resposta (cria o cliente no funil, como o formulário do site). Use "formulario" para mandar para o formulário de um corretor da equipe.

Corpo

{ "nome": "Carlos Lima", "telefone": "62988887777", "renda": "4100", "cidade": "Anápolis - GO", "Tem carro financiado?": "Não", "formulario": "ana-corretora" }

Imóveis e páginas de captação

Campos: nome*, construtora, cidade, bairro, valor, valor_avaliacao, tipo (apartamento|casa|terreno), metragem, operacao (novo|usado), observacoes, ativo, foto_url, site_url. Página do imóvel (/i/<slug>): publicado, slug, finalidade (venda|aluguel), titulo, descricao, fotos (lista de URLs, a primeira é a capa), diferenciais (lista), quartos, banheiros, vagas, endereco, video_url, valor_aluguel, condominio, iptu, unidades_disponiveis, entrega, corretor_id (quem recebe os clientes da página). Clientes vindos da página chegam com origem "landing" e imovel_id.

GET /api/v1/imoveis

Lista.

POST /api/v1/imoveis

Cria (ou vários, em lista).

Corpo

{ "nome": "Residencial Ipê", "cidade": "Anápolis - GO", "valor": 215000, "tipo": "casa", "metragem": 52 }
GET /api/v1/imoveis/{id}

Um imóvel.

PATCH /api/v1/imoveis/{id}

Altera.

DELETE /api/v1/imoveis/{id}

Exclui.

Corretores e correspondentes

Campos: nome*, telefone, email, empresa, ativo. O acesso (login) de cada corretor é criado no painel.

GET /api/v1/corretores

Lista os corretores.

POST /api/v1/corretores

Cadastra.

Corpo

{ "nome": "Ana Corretora", "telefone": "62999990000" }
PATCH /api/v1/corretores/{id}

Altera.

DELETE /api/v1/corretores/{id}

Exclui.

GET /api/v1/correspondentes

Mesmos endereços para correspondentes bancários (/correspondentes/{id}).

Depoimentos

Depoimentos exibidos nas páginas. Campos: nome*, texto*, foto_url, nota (1 a 5), publicado, imovel_id (vazio = geral: vitrine e todas as páginas), ordem.

GET /api/v1/depoimentos

Lista.

POST /api/v1/depoimentos

Cria.

Corpo

{ "nome": "Fernanda Lima", "texto": "Consegui meu subsídio!", "nota": 5 }
PATCH /api/v1/depoimentos/{id}

Altera.

DELETE /api/v1/depoimentos/{id}

Exclui.

Etapas, motivos de perda e mensagens

Configuração do funil.

GET /api/v1/etapas

Etapas do funil, em ordem. POST/PATCH/DELETE em /etapas e /etapas/{id} (campos: nome, ordem, cor).

GET /api/v1/motivos-perda

Motivos de perda. POST/PATCH/DELETE disponíveis (campo: nome).

GET /api/v1/mensagens

Modelos de mensagem por etapa (somente leitura).

Webhooks

Avisos enviados para o seu sistema em até 1 minuto. Eventos: cliente.criado, cliente.atualizado, cliente.etapa_alterada, cliente.excluido, simulacao.criada. Se o seu endereço não responder 2xx, tentamos de novo até 6 vezes.

POST /api/v1/webhooks

Cadastra (url com https://; eventos opcional). A resposta traz o segredo para conferir a assinatura.

Corpo

{ "url": "https://seusistema.com.br/webhooks/simulador", "eventos": ["cliente.criado", "cliente.etapa_alterada"] }
GET /api/v1/webhooks

Lista, com o status do último envio.

DELETE /api/v1/webhooks/{id}

Remove.

POST /api/v1/webhooks/teste

Envia um evento "teste" para todos os webhooks ativos.

Conferir a assinatura dos webhooks

Cada aviso traz X-Simulador-Evento e X-Simulador-Assinatura: sha256=… — o HMAC-SHA256 do corpo com o segredo do webhook. Corpo: { "id", "evento", "criado_em", "dados" }. Responda 2xx em até 10 segundos.

// Node.js (Express)
import crypto from "node:crypto";
app.post("/webhooks/simulador", express.raw({ type: "application/json" }), (req, res) => {
  const esperado = "sha256=" + crypto.createHmac("sha256", process.env.SEGREDO).update(req.body).digest("hex");
  if (req.get("x-simulador-assinatura") !== esperado) return res.sendStatus(401);
  const aviso = JSON.parse(req.body);   // { id, evento, criado_em, dados }
  res.sendStatus(200);
});

// PHP
$corpo = file_get_contents("php://input");
$ok = hash_equals("sha256=" . hash_hmac("sha256", $corpo, $segredo), $_SERVER["HTTP_X_SIMULADOR_ASSINATURA"] ?? "");