Da matrícula à estimativa.
Seu projeto extrai os dados do imóvel. Esta API resolve o município e devolve o valor estimado, a referência utilizada e os campos que ainda precisam de confirmação.
POST /api/v2/property-estimates
- No backend consumidor, configure
VALOR_DO_IMOVEL_URL=https://estimabem.com.breVALOR_DO_IMOVEL_KEYcom uma chave de integração emitida pelo administrador desta API. - Envie cidade/UF, código IBGE ou CEP, o tipo do imóvel e as áreas identificadas no documento. CEP aceita
01050-000. Números JSON usam ponto decimal, por exemplo85.5. - Vincule o resultado ao seu registro usando
externalId. Exiba o valor junto ao método e à data da referência. Salve a resposta no seu próprio projeto se precisar de histórico.
Qual área enviar?
| Tipo | Campos em property |
|---|---|
| Apartamento · apartment | privateAreaM2: área privativa |
| Casa · house | builtAreaM2: construída + landAreaM2: terreno |
| Terreno · land | landAreaM2: terreno |
Área total pode ser informada em totalAreaM2, mas não substitui a área exigida. Não envie fração ideal como área privativa. Omita campos não extraídos; não use zero, null ou uma área presumida. Informe apenas os dados do imóvel, sem PDF, texto integral, CPF ou dados dos proprietários.
Exemplo para o backend
// Execute no backend do projeto que lê a matrícula.
const response = await fetch(
process.env.VALOR_DO_IMOVEL_URL + '/api/v2/property-estimates',
{
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.VALOR_DO_IMOVEL_KEY,
'Content-Type': 'application/json'
},
signal: AbortSignal.timeout(12000),
body: JSON.stringify({
"externalId": "imovel-123",
"address": {
"city": "São Paulo",
"state": "SP",
"neighborhood": "Morumbi"
},
"property": {
"type": "apartment",
"privateAreaM2": 100
}
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error.message);
if (result.status === 'estimated') {
// Exiba também método, referenceDate e limitations.
console.log(result.estimate.value, result.currency);
} else if (result.status === 'needs_input') {
console.log('Solicitar confirmação:', result.requiredFields);
} else {
console.log('Sem referência compatível:', result.reason);
}Resposta resumida do exemplo
{
"externalId": "imovel-123",
"status": "estimated",
"currency": "BRL",
"method": "municipal_reference",
"referenceDate": "2026-08-31",
"estimate": {
"value": 1214300,
"pricePerM2": 12143,
"dispersion": null
}
}O exemplo usa a média municipal de São Paulo mesmo quando o bairro informado é Morumbi. O resultado completo inclui benchmark.source, evidence, limitations, datasetId, modelVersion, resolution e normalizedInput.
| status (HTTP 200) | O que fazer |
|---|---|
| estimated | Exibir estimate.value em BRL, método, data e limitações. |
| needs_input | Solicitar os campos de requiredFields e reenviar. estimate é null. |
| insufficient_data | Informar falta de referência compatível ou fornecer comparáveis. estimate é null. |
Cobertura automática: apartamentos nas 56 cidades com média pública de anúncios. A aproximação municipal não ajusta bairro, rua ou características da unidade e não tem intervalo de erro calibrado. Casas, terrenos e outras cidades precisam de comparáveis locais elegíveis. Uma matrícula com endereço completo não garante cobertura de preços.
Autenticação e erros
A chave deve ficar nas variáveis de ambiente do backend, inclusive na Vercel. Não use prefixo NEXT_PUBLIC_ e não exponha a chave no navegador. A chave desta API é diferente da chave do Google Maps. A API não oferece CORS para chamadas autenticadas do navegador.
401: credencial inválida; 422: dados inválidos ou endereço conflitante; 404: CEP não encontrado; 503: serviço indisponível. Use requestId para diagnóstico e não substitua erros por valor zero. O limite do corpo é 16 KiB. O SDK oferece client.estimateProperty(input), timeout e cancelamento.
Administrador: emitir chave para outro projeto
Execute npm run client:create -- leitor-matriculas no repositório. O segredo será salvo em .secrets/leitor-matriculas.json e o hash adicionado a VALUATION_API_KEYS em .env.local. Atualize essa variável no servidor da API preservando os clientes existentes e publique novamente. Configure somente a chave desse cliente no backend consumidor. Não envie o segredo para o Git.
Valor estimado automático · API v2
Envie município, tipo e área para receber a estimativa inicial de apartamentos nas 56 cidades com referência pública. Não é obrigatório cadastrar comparáveis. Fórmula: área privativa × preço médio municipal por m².
{"address":{"municipalityCode":"3550308"},"propertyType":"apartment","areaBasis":"private","areaM2":100}Use POST /api/v2/estimates ou client.estimateNational(input). A resposta identifica method: municipal_reference, origem, data e limitações. dispersion será nulo: não há faixa de erro calibrada. O total é uma aproximação municipal, sem ajuste por bairro, rua ou atributos da unidade.
Com pelo menos 5 comparáveis locais elegíveis, o método passa a user_supplied_comparables. Casas, terrenos, preços de transações e cidades sem referência compatível precisam desses comparáveis. Ausência de cobertura retorna insufficient_data, nunca valor zero. Endereço completo é obrigatório quando há comparáveis. Mesma chave da v1; corpo máximo de 16 KiB.
GET /api/v2/coverage?municipalityCode=3550308 informa a referência disponível. GET /api/v2/postal?cep=30140071 é público e consulta CEP. O modelo do Morumbi continua disponível na API v1.
Contrato nacional OpenAPI v2 · Simulador Brasil · Simulador Morumbi
Uma estimativa.
Vários projetos conectados.
Consuma o mesmo motor do simulador por uma API versionada. Cada resultado acompanha a base utilizada, as limitações e as transações comparáveis.
API v1 · comparables-0.1.0Comece em três passos
- Configure uma chave para o servidor do projeto consumidor.
- Envie rua, número, município e estado para
POST /api/v1/addresses. Confira o distrito e a cobertura; se houver sugestões, peça ao usuário que escolha o lote. - Envie o
addressIdescolhido (ou o endereço completo emaddress), a área construída do IPTU, o ACC e o padrão fiscal; trate o resultadoinsufficient_dataquando faltar evidência.
Endpoints
| Método | Caminho | Retorno |
|---|---|---|
| GET | /api/v1/health | Disponibilidade e versões; público. |
| GET | /api/v1/datasets | Cobertura, fontes e validação. |
| GET | /api/v1/buildings?q=morato&limit=25 | Endereços disponíveis e perfis cadastrais. |
| POST | /api/v1/addresses | Localização, distrito, cobertura e candidatos para confirmação. |
| POST | /api/v1/estimates | Estimativa e comparáveis ou abstenção. |
Exceto health, os endpoints exigem Authorization: Bearer SUA_CHAVE. A integração é entre servidores. Não coloque a chave no código público do navegador.
Exemplo para um servidor JavaScript
O cenário abaixo usa AV PROF FRANCISCO MORATO, 2203, como referência. Os valores são características cadastrais de exemplo, não uma identificação de unidade.
const response = await fetch(
process.env.VALOR_DO_IMOVEL_URL + '/api/v1/estimates',
{
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.VALOR_DO_IMOVEL_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"datasetId": "sp-morumbi-2026-07-v1",
"address": {
"street": "Avenida Professor Francisco Morato",
"number": 2203,
"municipality": "São Paulo",
"state": "SP"
},
"propertyType": "apartment",
"areaM2": 119,
"areaBasis": "iptu_built",
"correctedConstructionYear": 1975,
"standardCode": 22
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error.message);
if (result.status === 'estimated') {
console.log(result.estimate.value, result.estimate.interval);
} else {
console.log(result.reason.message);
}O contrato do resultado
- A busca retorna
resolved,needs_confirmation,not_foundououtside_coverage. Mesmo quando localizado, confiracandidate.coverage. Nunca selecione automaticamente a primeira sugestão ambígua. - O cálculo aceita exatamente um de
address,addressIdou o antigobuildingId. Fora do perímetro e endereços ambíguos retornam 422; endereço não localizado retorna 404. status: estimated: leiaestimate.value, a faixa e os comparáveis.status: insufficient_data:estimateserá nulo. Não substitua por zero.datasetId,modelVersionereferenceDate: salve junto ao resultado no projeto consumidor.requestId: identificador da requisição;ididentifica o cálculo. Esta versão não mantém histórico consultável de cálculos.- Erros de entrada retornam 400/422; chave inválida, 401; base ou endereço inexistente, 404; integração não configurada, 503.
A base contém 624 transações em 178 lotes. O modelo foi testado em 42 das 51 vendas de junho–julho/2026 e teve erro mediano de 22,4%. A referência é julho/2026, com treino congelado em março. Área privativa e outras datas são rejeitadas para evitar interpretações incorretas.
Versões e evolução
Base ativa: sp-morumbi-2026-07-v1. Novas bases devem ser publicadas com novo identificador, após revisão dos dados e validação. O carregamento de fontes municipais ocorre fora das requisições da API. O índice geográfico separado contém 1.215 endereços localizáveis no Morumbi e arredores, dos quais 355 atendem ao recorte geográfico do modelo. Localização pelo centro do lote, com distrito definido por geometria; não é um geocodificador completo de São Paulo. A presença no índice não garante comparáveis suficientes. O nome comercial do bairro não substitui o distrito oficial.
Ambientes Preview da Vercel podem exigir autenticação da plataforma além da chave da API. Integrações devem usar o domínio de produção ou o mecanismo de acesso ao Preview configurado pela equipe.