Ir para o conteúdo
estimabemencontre o valor certo

ESTIMA BEM / PARA DESENVOLVEDORES

O valor do bem.
Na sua aplicação.

Integre consultas de imóveis, veículos e outros bens com exemplos prontos para o seu backend. Comece pelo imóvel e avance conforme as categorias do seu projeto.

HTTPS + JSONRequisições entre servidoresBRLValores em reais18 classesCobertura própria por categoria

Base de produção: https://estimabem.com.br. Para imóveis, use POST /api/v2/property-estimates. Para veículos e catálogos, use as rotas públicas de bens e direitos.

Primeira consulta em JavaScript

Baixe estimabem-client.mjs e as definições TypeScript para a mesma pasta do seu script. O cliente não exige instalação de dependências e foi testado com Node.js 24. Execute seu arquivo .mjs no backend, com a credencial na variável ESTIMABEM_API_KEY.

JavaScript · Node.js · execução no servidor
import { createEstimaBemClient, readEstimate, EstimaBemApiError }
  from "./estimabem-client.mjs";

const api = createEstimaBemClient({
  apiKey: process.env.ESTIMABEM_API_KEY,
});

try {
  const result = await api.estimateProperty({
  "externalId": "imovel-123",
  "address": {
    "city": "São Paulo",
    "state": "SP"
  },
  "property": {
    "type": "apartment",
    "privateAreaM2": 100
  }
});
  const value = readEstimate(result);
  if (value.hasValue) {
    console.log(value.amount, value.currency, value.referenceDate);
  } else if (result.status === "needs_input") {
    console.log("Complete os dados:", result.requiredFields);
  } else {
    console.log("Sem estimativa disponível", result.limitations);
  }
} catch (error) {
  if (!(error instanceof EstimaBemApiError)) throw error;
  console.error(error.code, error.message, error.requestId);
}

O SDK mantém as respostas originais. readEstimate(result) oferece um resumo comum com hasValue, amount, currency, referenceDate e limitations. O valor do resumo é sempre string decimal ou null.

01 / ACESSO

Autenticação por tipo de consulta

ConsultaAcessoContrato
Imóveis por características e cobertura municipalAuthorization: Bearer SUA_CHAVEOpenAPI imobiliária v2
CEP, catálogos e consultas públicas de outros bensSem chaveOpenAPI pública
Cadastro, documentos, carteiras e revisão de ativosChave com organização e permissões de gestãoOpenAPI de gestão

Solicite uma credencial no formulário de integração, informando o projeto e as categorias desejadas. O envio do formulário registra o interesse; não libera uma chave automaticamente. Configure a credencial nas variáveis de ambiente do servidor consumidor. Não a coloque em URL, código do navegador ou variáveis expostas ao frontend.

Em outro site, envie a consulta pelo seu backend. As rotas não oferecem um contrato geral de CORS para chamadas entre origens no navegador. O cliente envia a chave somente às consultas imobiliárias autenticadas e não segue redirecionamentos.

02 / IMÓVEIS

Endereço + tipo + área

POST /api/v2/property-estimates

Envie JSON com dados do imóvel. Para identificar o município, prefira o código IBGE ou cidade e UF; também é possível usar CEP. Use endereço detalhado quando disponível. O serviço estima a partir dos dados enviados e da cobertura existente; não confirma a porta do imóvel ou sua titularidade.

CampoFormatoComo preencher
externalIdTexto opcional, 1–120 caracteresID do imóvel no seu sistema. É devolvido para correlação e não cria um cadastro.
address.municipalityCodeTexto de 7 dígitosCódigo IBGE, como 3550308. Alternativa a cidade/UF ou CEP.
address.city + address.stateTexto + UF de 2 letrasNome completo do município e UF, como São Paulo e SP. Não use um bairro no campo cidade.
address.postalCodeTexto01050-000 ou 01050000. Gera consulta de endereço. Se enviar também cidade/UF, os dados devem concordar.
address.street / neighborhoodTextos opcionaisRua (3–160 caracteres) e bairro (2–160). O bairro não garante referência específica daquela vizinhança.
address.numberNúmero inteiro opcionalDe 1 a 99999; omita quando não confirmado. Não envie "s/n" ou zero.
property.typeTexto de enumeraçãoapartment (apartamento), house (casa) ou land (terreno).
property.*AreaM2Número JSON em m²Use 85.5, sem aspas ou unidade. Veja a área exigida abaixo.
priceBasisTexto opcionalasking (padrão, anúncio) ou transaction (transação). A segunda opção exige comparáveis compatíveis.
comparablesLista opcional, até 20 itensReferências estruturadas fornecidas pela aplicação. Consulte Comparable no contrato. Não envie anúncios em texto livre.

A área correta para cada imóvel

TipoÁrea exigidaIntervalo aceito
ApartamentoprivateAreaM2: área privativa15 a 2.000 m²
CasabuiltAreaM2: área construída, e landAreaM2: terrenoConstruída: 15 a 2.000 m²; terreno: 30 a 20.000 m²
TerrenolandAreaM2: área do terreno30 a 20.000 m²
Área total não substitui área privativa.

totalAreaM2 é aceito como dado adicional, mas não preenche a área exigida pelo cálculo. Se uma informação não foi confirmada, omita o campo. Campos desconhecidos, null em campos numéricos e números formatados como texto são rejeitados.

Consulte a cobertura antes de prometer uma estimativa

GET /api/v2/coverage?municipalityCode=3550308, com a mesma chave, informa a cobertura do município. O catálogo territorial nacional não significa disponibilidade de preço para todos os imóveis. A referência municipal automática atende apartamentos onde houver dados compatíveis. Casas, terrenos e consultas por transação dependem de comparáveis compatíveis; sem eles, a API informa dados insuficientes.

A consulta por CEP isolada é pública: GET /api/v2/postal?cep=01050000. Nesta rota, use exatamente oito dígitos. Ela resolve endereço, não estima valor. O SDK oferece postalAddress("01050000") e propertyCoverage("3550308").

03 / EXEMPLO PERSONALIZADO

Monte a requisição do seu imóvel

Preencha o mínimo necessário e gere o código para executar no seu servidor. Este formulário prepara a requisição localmente; não consulta preços nem recebe uma chave de acesso.

De 15 a 2.000 m². Use vírgula ou ponto para decimais.

Requisição preparada · execute no backend
import { createEstimaBemClient, readEstimate, EstimaBemApiError }
  from "./estimabem-client.mjs";

const api = createEstimaBemClient({
  apiKey: process.env.ESTIMABEM_API_KEY,
});

try {
  const result = await api.estimateProperty({
  "externalId": "imovel-123",
  "address": {
    "city": "São Paulo",
    "state": "SP"
  },
  "property": {
    "type": "apartment",
    "privateAreaM2": 100
  }
});
  const value = readEstimate(result);
  if (value.hasValue) {
    console.log(value.amount, value.currency, value.referenceDate);
  } else if (result.status === "needs_input") {
    console.log("Complete os dados:", result.requiredFields);
  } else {
    console.log("Sem estimativa disponível", result.limitations);
  }
} catch (error) {
  if (!(error instanceof EstimaBemApiError)) throw error;
  console.error(error.code, error.message, error.requestId);
}

Os dados ficam apenas nesta página, sem envio para a API. O código inicial consulta um apartamento de 100 m² em São Paulo. Após editar, gere novamente.

04 / RESULTADOS

HTTP 200 não significa valor disponível

A consulta imobiliária tem três estados de negócio. Verifique status antes de ler estimate.value. Os trechos abaixo foram gerados com o motor do projeto durante a construção desta documentação, usando o exemplo de apartamento e uma casa sem comparáveis. São exemplos datados, não uma cotação atual para qualquer imóvel.

estimated · valor disponível

Trecho da resposta · campos selecionados
{
  "status": "estimated",
  "externalId": "imovel-123",
  "currency": "BRL",
  "referenceDate": "2026-08-31",
  "estimate": {
    "value": 1214300,
    "pricePerM2": 12143,
    "dispersion": null
  },
  "requiredFields": []
}

estimate.value é um número JSON em reais. pricePerM2 usa a área correspondente ao tipo do imóvel. dispersion pode ser null; não crie uma faixa de valores quando a API não a fornece.

needs_input · complete os dados

Trecho da resposta · apartamento sem área privativa
{
  "status": "needs_input",
  "externalId": null,
  "currency": "BRL",
  "estimate": null,
  "requiredFields": [
    {
      "field": "property.privateAreaM2",
      "message": "Informe a área privativa do apartamento. Área total, área comum e fração ideal não a substituem."
    }
  ]
}

Use requiredFields[].field para identificar o campo e message para orientar a pessoa. Reenvie o objeto completo após a confirmação. Não substitua uma informação desconhecida por zero.

insufficient_data · sem suporte para estimar

Trecho da resposta · casa sem comparáveis
{
  "status": "insufficient_data",
  "externalId": null,
  "currency": "BRL",
  "referenceDate": "2026-10-26",
  "estimate": null,
  "requiredFields": [],
  "reason": {
    "code": "INSUFFICIENT_COMPARABLES",
    "message": "Não há referência automática compatível com este município e tipo de imóvel. O cálculo local exige pelo menos 5 endereços distintos do mesmo bairro, perfil e base de preço, nos últimos 12 meses."
  }
}

Informe “Não há estimativa disponível para estes dados” e preserve as limitações. Repetir imediatamente o mesmo corpo não resolve uma ausência de cobertura.

Como ler veículos e outros bens

Campo ou estadoSignificado para a integração
amountString decimal, por exemplo "118904.00"; este número é apenas ilustrativo. Formate em BRL somente na apresentação. Para cálculos financeiros, preserve a precisão decimal.
ESTIMATEDHá valor calculado com base na referência da categoria. Leia também basis, data e limitações.
SIMULATEDCenário que depende das premissas enviadas, não uma cotação individual de mercado.
REFERENCE / REFERENCE_LIMITEDReferência de preço anunciado de aeronave ou embarcação. A segunda sinaliza suporte limitado; não apresente como venda realizada.
INSUFFICIENT_DATAValor ausente. amount: null não equivale a "0.00".
DatasImóveis: referenceDate. Veículos: source.as_of. Aeronaves e embarcações: reference_period. A data da consulta não substitui a data da referência.

Os formatos originais são preservados por compatibilidade: imóveis usam estados em minúsculas e número JSON; outros bens usam estados em maiúsculas e strings decimais. O SDK normaliza erros e a leitura do valor sem alterar o JSON original.

05 / SEU LEITOR DE MATRÍCULAS

Do documento aos dados da consulta

  1. Seu sistema extrai tipo, endereço e áreas da matrícula.
  2. Confirme a correspondência de cada área: privativa, construída ou terreno. Converta unidades de forma explícita antes do envio.
  3. Monte address e property com os fatos confirmados. Use externalId para relacionar o resultado ao registro interno.
  4. Chame estimateProperty pelo backend. Se receber needs_input, peça a confirmação dos campos pendentes.
  5. Apresente valor, data e contexto; guarde o resultado no seu sistema se precisar de histórico.

A rota recebe fatos estruturados. Ela não faz OCR, não recebe PDF e não precisa de nomes de proprietários, CPF ou inteiro teor da matrícula. id identifica o cálculo retornado; requestId identifica a requisição. Nenhum dos dois cria um histórico consultável nesta rota.

JavaScript · mapeamento dos fatos confirmados
// Exemplo de mapeamento no backend do seu leitor de matrículas.
// confirmed contém apenas fatos conferidos, já normalizados em m².
function propertyFromRegistry(confirmed) {
  const areas = {
    apartment: { privateAreaM2: confirmed.privateAreaM2 },
    house: { builtAreaM2: confirmed.builtAreaM2, landAreaM2: confirmed.landAreaM2 },
    land: { landAreaM2: confirmed.landAreaM2 },
  };
  if (!areas[confirmed.type]) throw new Error("Confirme o tipo do imóvel.");
  const property = { type: confirmed.type };
  for (const [field, value] of Object.entries(areas[confirmed.type])) {
    if (value !== undefined && value !== null) property[field] = value;
  }
  return {
    externalId: confirmed.internalId,
    address: confirmed.address,
    property,
  };
}
// api.estimateProperty(propertyFromRegistry(confirmed));

Se houver uma referência municipal, o nome do bairro não transforma automaticamente essa referência em uma avaliação específica do condomínio. O resultado não comprova a situação registral ou a titularidade do imóvel.

06 / VEÍCULOS

Marca, modelo, versão e ano

Carros e motos usam cars e motorcycles; caminhões e ônibus usam trucks. As consultas são públicas. Não use texto livre para substituir os identificadores do catálogo.

EtapaGET /api/v1/asset-valuation/market/vehiclesResposta
1. Montadora?type=carsitems com code e name.
2. Modelo e versão?type=cars&brand=CODIGO_DA_MARCAmodel_groups agrupa famílias; versions contém as versões. items preserva a lista completa.
3. Ano-modelo e combustível?type=cars&brand=CODIGO_DA_MARCA&model=CODIGO_DA_VERSAOCódigos de ano completos, que também distinguem combustível.

Envie POST /api/v1/asset-valuation/market/vehicle-estimates com type, brand, model e year, todos textos. model é o código da versão. year é o código completo retornado pela etapa anterior, não apenas o ano de fabricação. Para zero-quilômetro, use a opção disponível no catálogo; a resposta terá asset.zero_km: true e asset.model_year: null.

JavaScript · fluxo para seletores encadeados
import { createEstimaBemClient, readEstimate }
  from "./estimabem-client.mjs";

const api = createEstimaBemClient(); // Catálogos e veículos são públicos.
const type = "cars"; // motorcycles: motos; trucks: caminhões e ônibus.

// Etapa 1: apresente brands.items para a pessoa selecionar a marca.
const brands = await api.vehicleCatalog({ type });

// Etapa 2: passe o code da marca selecionada.
async function modelsFor(brand) {
  return api.vehicleCatalog({ type, brand });
  // model_groups: famílias de modelos; versions: versões de cada família.
  // Use o code de versions, nunca o code "family:..." do agrupamento.
}

// Etapa 3: após selecionar a versão, apresente seus anos e combustíveis.
async function yearsFor(brand, model) {
  return api.vehicleCatalog({ type, brand, model });
}

// Etapa 4: envie exatamente o code do ano retornado no catálogo.
async function estimateSelection(brand, model, year) {
  const result = await api.estimateVehicle({ type, brand, model, year });
  return { value: readEstimate(result), vehicle: result.asset };
}

console.log(brands.items);
// Limpe modelo/versão/ano sempre que a pessoa alterar a marca.
// Trate erros com EstimaBemApiError, como no exemplo de imóveis.

Ao mudar marca ou versão, limpe as escolhas dependentes. Não escolha automaticamente a primeira versão como se fosse o veículo identificado. A referência mensal não ajusta quilometragem, conservação, avarias, opcionais ou localização. O contrato contém um esquema tipado da resposta em vehicle-estimates.

07 / COBERTURA

Um caminho para cada uma das 18 classes

Comece com GET /api/v1/asset-valuation/market/coverage. Ele descreve os modos de consulta; os catálogos e a resposta da estimativa confirmam a disponibilidade da seleção. As rotas abreviadas da tabela usam o prefixo /api/v1/asset-valuation/market/. Todas as rotas de estimativa abaixo usam POST.

ClasseRotaDados e alcance
Imóveis
REAL_ESTATE
/api/v2/property-estimatesEndereço, tipo e área. Apartamentos com referência municipal conforme cobertura; casas e terrenos dependem de comparáveis compatíveis.
Veículos leves
LIGHT_VEHICLE
vehicle-estimatesCatálogo vehicles: cars ou motorcycles; marca, versão e código do ano. Referência mensal, sem ajuste por conservação.
Veículos pesados
HEAVY_VEHICLE
vehicle-estimatesCatálogo vehicles: trucks. Apenas modelos e anos disponíveis; implementos separados não estão incluídos.
Máquinas agrícolas
AGRICULTURAL_MACHINERY
equipment-estimatesCatálogo equipment, família tractor. Configuração e condição; usados exigem idade, vida útil e residual para o cenário.
Equipamentos industriais
INDUSTRIAL_EQUIPMENT
equipment-estimatesCatálogo equipment: compressor e screw-compressor. Cobertura por configuração; falta de referência retorna valor ausente.
Equipamentos médicos
MEDICAL_EQUIPMENT
equipment-estimatesCatálogo equipment: autoclave, ultrasound, patient-monitor, defibrillator. Referência de equivalente novo; usado é cenário de custo depreciado.
Estoques
INVENTORY
/api/v1/asset-valuation/inventory/quick-estimatesCatálogo inventory/presets: product_id e quantidade decimal na unidade indicada. Cobertura inicial de produtos agrícolas; não precifica qualquer produto acabado.
Commodities armazenadas
STORED_COMMODITY
/api/v1/asset-valuation/inventory/quick-estimatesMesmo catálogo de produtos. Respeite unidade, região, disponibilidade e data da referência.
Rebanhos
LIVESTOCK
guided-estimatesEspécies cobertas no esquema, quantidade de cabeças e peso vivo por animal. Não há cobertura automática para todo rebanho.
Ativos biológicos
BIOLOGICAL_ASSET
guided-estimatesCultura, produção esperada, prazo e custos restantes. Cenário de produção, dependente das premissas enviadas.
Títulos financeiros
FINANCIAL_SECURITY
treasury-estimatesCatálogo treasury: identificador do título e quantidade, inclusive frações. Referência bruta; cobertura inicial de títulos públicos.
Recebíveis
RECEIVABLE
credit-estimatesValor nominal e data futura. Cenário de valor presente; não determina desconto por risco de inadimplência.
Créditos judiciais
JUDICIAL_CREDIT
credit-estimatesValor nominal e data prevista. Cenário financeiro; não prevê pagamento nem preço de cessão.
Aeronaves
AIRCRAFT
knowledge-estimatesCatálogo knowledge-catalog: fabricante, modelo, ano e configuração. Preços anunciados, cobertura inicial de usados.
Embarcações
VESSEL
knowledge-estimatesMesmo fluxo com asset_class VESSEL. Embarcação completa; sem ajuste automático por horas ou conservação.
Participações societárias
PRIVATE_EQUITY_INTEREST
guided-estimatesGeração anual de caixa, horizonte e participação. Cenário com premissas, sem tabela automática de empresas.
Propriedade intelectual
INTELLECTUAL_PROPERTY
guided-estimatesTipo do direito, geração anual de caixa e horizonte. Cenário econômico; não avalia automaticamente registro ou transferibilidade.
Metais e bens preciosos
PRECIOUS_ASSET
guided-estimatesMetal, peso em gramas e pureza. Estima conteúdo metálico de ouro ou prata, sem pedras, marca ou valor artístico.

Aeronaves e embarcações

Repita a seleção por fabricante, modelo, ano e configuração. Cada consulta retorna opções disponíveis. Se vier NO_COVERAGE, apresente a indisponibilidade e permita outra seleção. A referência corresponde ao conjunto descrito em item e context.

JavaScript · use os imports do exemplo inicial
const api = createEstimaBemClient();
const asset_class = "AIRCRAFT"; // Use VESSEL para embarcações.
const brands = await api.knowledgeCatalog({ asset_class });
// Após cada escolha, acrescente o code retornado à próxima consulta:
// { asset_class, brand_id } → modelos
// { asset_class, brand_id, model_id } → anos
// { asset_class, brand_id, model_id, year } → configurações
// NO_COVERAGE: não prossiga com códigos inventados.

async function estimateSelection(brand_id, model_id, year, configuration_id) {
  const result = await api.estimateKnowledge({
    asset_class, brand_id, model_id, year, configuration_id,
  });
  return readEstimate(result);
}

Equipamentos e estoques

Para equipamentos, busque GET /market/equipment?family=tractor e envie a configuração escolhida em {"family":"tractor","product_code":"CODIGO_DO_CATALOGO","condition":"new"}. Para usados, o cenário exige age_years, useful_life_years e residual_percent, em strings decimais. Vida útil é o total desde novo; não estime essas premissas silenciosamente.

Para estoques, busque GET /api/v1/asset-valuation/inventory/presets e envie {"product_id":"ID_DO_PRODUTO","quantity":"100"} a /inventory/quick-estimates, sob o mesmo prefixo /api/v1/asset-valuation. Confira available e a unidade; 100 sacas não é a mesma quantidade que 100 kg.

Os corpos completos de equipamentos, títulos, créditos e cenários por classe estão no OpenAPI público. Os campos mudam conforme a classe; não envie o formulário de imóvel a uma rota de outro bem. A coleção Postman inclui consultas de catálogo e exemplos para começar.

08 / OPERAÇÃO

Erros que seu projeto consegue tratar

HTTPCausa típicaAção
400JSON malformado, parâmetro repetido ou enviado no lugar erradoCorrija a requisição. Em POST, os parâmetros devem estar no corpo JSON.
401 / 403Credencial ausente/inválida ou falta de permissão de gestãoConfira a configuração do backend. Não repita automaticamente.
404Rota inexistente ou CEP não encontradoConfira o caminho ou os oito dígitos do CEP.
405Método incorretoUse o método documentado. As rotas de mercado informam o método aceito em Allow.
413 / 415Corpo muito grande ou tipo de conteúdo incorretoReduza o corpo e envie Content-Type: application/json.
422Campo inválido, endereço conflitante ou seleção indisponívelLeia o código e os detalhes, confira dados e atualize o catálogo quando necessário.
429 / 502 / 503 / 504Limite ou indisponibilidade temporária da infraestrutura/consultaConsidere nova tentativa com espera e limite de tentativas. Configuração ausente em 503 exige correção administrativa.

Exemplos de erros, com IDs substituídos por texto ilustrativo:

API imobiliária · envelope de erro
{
  "requestId": "ID_DA_REQUISICAO",
  "error": {
    "code": "INVALID_AREA",
    "message": "A área deve ser um número positivo em m²."
  }
}

Rotas públicas de bens · envelope de erro
{
  "code": "INVALID_INPUT",
  "message": "Confira os códigos da seleção.",
  "request_id": "ID_DA_REQUISICAO",
  "retryable": false,
  "details": []
}

O SDK converte ambos em EstimaBemApiError: status, code, message, requestId, details, retryable e retryAfterSeconds. Erros de rede usam status: 0. O cabeçalho X-Request-Id ajuda a identificar a consulta em suporte; o SDK também o usa quando o corpo não traz o ID.

Timeout, repetição e limites

  • O cliente usa 20 segundos de timeout por padrão, configurável de 1 a 60.000 milissegundos com timeoutMs. Catálogos de equipamentos podem exigir um prazo maior. Use { signal } para cancelar uma consulta obsoleta.
  • O SDK não repete requisições automaticamente. Para falhas temporárias, faça poucas tentativas com espera crescente e variação aleatória. Respeite Retry-After quando houver. A indicação retryable por HTTP não substitui a leitura do código do erro.
  • Corpos: imóveis até 16 KiB; consultas de mercado e estoque rápido até 4 KiB. Outros limites constam no contrato da rota. Essas consultas não persistem ativos e não exigem Idempotency-Key.
  • Não há uma quota ou SLA geral publicado nesta documentação. Combine volume e condições de uso pelo contato de integração. Não envie consultas em massa sem controle de concorrência.
  • A API de gestão tem regras próprias de idempotência, permissões e processamento assíncrono. Use o contrato de gestão se precisar cadastrar e guardar ativos.

Versionamento e histórico

Guarde a resposta original, seu identificador interno e os metadados de versão/data disponíveis. apiVersion, modelVersion, datasetId e schema_version identificam contextos diferentes; não os substitua pela data de hoje. Campos adicionais podem surgir: leia os campos de que precisa e trate estados desconhecidos de forma explícita. O SDK lança INVALID_RESPONSE se o resumo recebe um estado desconhecido.

09 / FERRAMENTAS

Contratos e arquivos para integrar

A API imobiliária v3 recebe as 24 famílias, condomínio, torre, unidade e áreas separadas. Use estimatePropertyV3 e propertyCoverageV3 no SDK. Consulte a cobertura de fontes por família e município antes de prometer um resultado numérico.

As rotas anteriores continuam disponíveis: integração imobiliária detalhada e API v1 do Morumbi e guia de gestão de bens. A v2 permanece compatível; a ampliação de famílias está na v3.

Pronto para conectar seu projeto?

Conte quais bens deseja consultar e como pretende apresentar o resultado. Solicitar acesso e informações ↗