Confira o preço antes de iniciar a pesquisa. Envie POST /v1/orcamento/pesquisa-previa-bens com os dados que deseja pesquisar. O orçamento informa o valor e a disponibilidade, sem cobrar.

Documentação

Registro de Imóveis

Pesquisa Prévia de Bens

Busca reversa de imóveis por CPF/CNPJ nos cartórios de registro de imóveis de um estado.

Beta
POST /v1/consultas/pesquisa-previa-bens v1

UFs vendáveis

26/27

Cartórios

3.567

85 indisponíveis

Tempo típico

76s

A partir de

R$ 17,52

por consulta, varia por UF

Cobertura medida na origem em 19/08/2026. Cartório indisponível na medição entra na contagem.

Visão geral

Busca matrículas em que um CPF ou CNPJ aparece nos cartórios de registro de imóveis do estado escolhido.

A pesquisa roda em segundo plano: o POST devolve um protocolo e o GET busca o resultado por ele. Acompanhar não cobra de novo.

Achar o documento em uma matrícula não confirma propriedade atual. O resultado também diz quais cartórios responderam e quais têm acervo incompleto.

Testar no Postman, passo a passo

Você faz um pedido e depois busca o resultado pelo protocolo. A pesquisa continua rodando mesmo depois que a primeira resposta chega. Seu sistema pode fazer esse acompanhamento automaticamente.

1. Configure seu token

Use uma conta com acesso à API liberado e assinatura ativa. Crie um token em Meus tokens, com acesso à Pesquisa Prévia de Bens.

No Postman, abra Authorization → Bearer Token e cole o token. Use essa configuração em todas as requisições abaixo.

Primeiro envie GET https://api.oficialdata.com.br/v1/token. Uma resposta 200 confirma o acesso. Esse teste não cobra.

2. Confira o preço

Envie POST https://api.oficialdata.com.br/v1/orcamento/pesquisa-previa-bens.

Em Body → raw → JSON, informe os dados abaixo. Troque o documento de exemplo pelo CPF ou CNPJ que deseja pesquisar.

{
    "cpf_cnpj": "12345678000190",
    "uf": "SP",
    "imovel_finalidade": 2
}

O orçamento não cobra. Confira data[0].disponivel e data[0].preco.total. Se estiver indisponível, leia motivo e campos_faltando antes de continuar.

Para cadastrar um CPF novo, inclua também finalidade com um texto que descreva o motivo real da pesquisa. Esse texto é diferente de imovel_finalidade, que informa a finalidade ao cartório.

3. Inicie a pesquisa — este passo cobra

Não precisa de script ou identificador extra no Postman. Mantenha o Bearer Token e envie os dados em Body → raw → JSON.

Envie POST https://api.oficialdata.com.br/v1/consultas/pesquisa-previa-bens com o mesmo JSON do orçamento.

Cada POST inicia uma nova consulta, mesmo com os mesmos dados. Se a resposta se perder, confira o histórico antes de reenviar. Recebeu o protocolo? Use o GET abaixo para acompanhar sem nova cobrança.

A resposta 202 significa que o pedido foi aceito. Dentro de data[0], você recebe:

{
    "protocolo": "4713",
    "estado": "processando",
    "consultar_em": "/v1/consultas/4713",
    "intervalo_consulta_segundos": 10
}
  • protocolo: guarde esse número para acompanhar o pedido.
  • consultar_em: caminho que você deve usar no próximo GET.
  • intervalo_consulta_segundos: quantos segundos aguardar antes do próximo GET. É uma orientação de espera, não um prazo garantido de entrega. Você não precisa reenviar esse campo.

4. Busque o resultado — sem nova cobrança

Depois do intervalo indicado, envie o GET abaixo com o mesmo token. Troque 4713 pelo protocolo recebido no passo 3. O GET não precisa de Body.

GET https://api.oficialdata.com.br/v1/consultas/4713
Authorization: Bearer SEU_TOKEN
  • code: 202: ainda está processando. Aguarde o novo intervalo_consulta_segundos e repita o GET no mesmo endereço.
  • code: 200: o resultado está em data[0]. Leia os campos da seção Resposta abaixo. Os comprovantes ficam em site_receipts, na raiz do JSON.
  • code entre 600 e 699: a pesquisa terminou com uma falha ou restrição. Leia code_message e errors. Esses códigos vêm no corpo, mesmo quando o HTTP é 200.

Não repita o POST para acompanhar. Cada GET apenas lê o pedido existente. Se header.billable vier true, ele informa a cobrança do pedido original; não representa outro desconto.

Guarde o endereço recebido em consultar_em. O protocolo dentro do resultado final é o protocolo do serviço de registro de imóveis e pode ser diferente do número usado para acompanhar a API.

Se provisorio ou cobertura.leitura_parcial vier true, a pesquisa tem limitações. A ausência de registros nessa resposta não confirma ausência de imóveis.

Se o Postman mostrar um erro

401: confira o token. 403: confira a liberação da conta, a assinatura e o acesso do token à pesquisa. 402: confira o saldo. 422: corrija os campos indicados em errors. 429: aguarde o tempo do cabeçalho Retry-After.

Você também pode importar o arquivo OpenAPI no Postman usando Import → Link. Depois, configure seu token e os dados da pesquisa.

Antes de começar

Cobrança, idempotência e leitura do resultado. Leia antes da primeira chamada.

Custa dinheiro se você ignorar 3

Como evitar pedidos duplicados

O POST inicia a pesquisa e desconta o valor do saldo. O GET apenas acompanha o pedido, sem nova cobrança.

Basta enviar token e dados. Cada POST inicia uma nova consulta. Se a resposta se perder, confira o histórico antes de reenviar.

Recebeu o protocolo? Acompanhe pelo GET. Não reenvie o CPF/CNPJ.

Cada estado tem um preço

Cada pedido pesquisa um estado. Para pesquisar em outro, faça um novo pedido, com cobrança separada.

Confira o valor no orçamento antes de iniciar. O preço é o emolumento do cartório mais a taxa do serviço, e o pedido não consome a cota do plano. Sem assinatura vale a taxa do canal API; com assinatura, a do seu plano: R$ 6, R$ 8 e R$ 10 no Essencial, R$ 4, R$ 5 e R$ 7 no Profissional e R$ 2,90, R$ 3,90 e R$ 4,90 do Escritório em diante. Acordos vigentes prevalecem.

O Maranhão está fora da venda: a origem devolve emolumento R$ 0,00, que é preço desconhecido, não gratuito.

Quando o resultado ainda é provisório

Se provisorio ou cobertura.retries_pendentes vier true, o serviço de registro de imóveis ainda tem respostas pendentes. Não trate esse resultado como nada consta definitivo, mesmo sem registros.

Se cobertura.leitura_parcial vier true, nem todos os dados da origem foram lidos. Marque o resultado como incompleto do seu lado.

Vale saber antes de integrar 3

Confira o documento pesquisado

Compare pesquisado_documento com o CPF/CNPJ enviado. pesquisado_nome mostra o nome retornado pela origem e pode ter diferenças de grafia.

Se nome_digitado_manualmente vier true, o nome foi informado no pedido e não serve como confirmação de identidade.

Quando a matrícula vem sem número

Item com matricula: null é ocorrência sem o número informado pelo cartório. Não descarte como se nada tivesse sido achado.

Para chegar ao número, contrate uma Pesquisa Qualificada à parte.

Informe o motivo correto da pesquisa

imovel_finalidade informa o motivo ao cartório. O padrão 2 significa investigação jurídica sobre o imóvel e sua titularidade. O valor 3 só se aplica quando o solicitante é titular de direito real sobre o imóvel.

finalidade é outro campo: um texto com o motivo da pesquisa, exigido para cadastrar um CPF novo. Ele não substitui imovel_finalidade.

Contexto 4

Encontrar uma matrícula não confirma propriedade atual

A pesquisa acha matrículas em que o documento aparece. A pessoa pode ser proprietária, ex-proprietária ou ter outra relação com o imóvel.

Por isso confianca vem sempre como INDICIO. Para confirmar titularidade, use a Pesquisa Qualificada.

A pesquisa pode levar alguns minutos

Os pedidos entram em fila. limites.teto_hora diz a capacidade; acima dela a espera cresce.

A resposta 202 traz o protocolo e intervalo_consulta_segundos. Espere esse intervalo e busque o resultado com GET — é orientação de espera, não prazo garantido.

Período dos registros

A busca alcança registros a partir de 01/01/1976. Registro anterior, em livro de transcrição, fica fora dessa pesquisa.

Comprovante da pesquisa

site_receipts traz os comprovantes da pesquisa, inclusive quando nada foi encontrado. Leia na raiz do JSON, fora de data.

Requisição

Autentique com token no cabeçalho. Parâmetro obrigatório ausente é recusado com 422, antes de qualquer cobrança.

cpf_cnpj string obrigatório

CPF (11 dígitos) ou CNPJ (14 dígitos) da pessoa ou empresa pesquisada. Aceita com ou sem pontuação.

uf string(2) obrigatório

Informe um estado por pedido, por exemplo SP. Cada estado pesquisado tem uma cobrança separada.

nome string opcional

Nome do alvo. **Obrigatório quando cpf_cnpj é um CPF** (a origem não aceita o pedido sem ele) — a chamada sem nome é recusada com 422, sem cobrança. Para CNPJ é opcional: usamos a razão social da Receita Federal. Volta na resposta como pesquisado_nome, para conferência.

imovel_finalidade integer opcional

Declaração AO CARTÓRIO, não preferência técnica. 1 = avaliação de crédito · 2 = investigação jurídica sobre o imóvel e sua titularidade (padrão) · 3 = o solicitante É titular de direito real. Ver a nota "Finalidade é declaração legal".

finalidade string opcional

Motivo da consulta, em texto livre. **Obrigatória (mínimo 10 caracteres) quando cpf_cnpj é um CPF que ainda não está no seu cadastro**: cadastrar uma pessoa física exige finalidade declarada, e a chamada sem ela é recusada com 422, sem cobrança. Para CNPJ, e para CPF já cadastrado, é opcional. Não confundir com imovel_finalidade, que é a declaração ao cartório.

Nova consulta e acompanhamento

Envie apenas o token e os dados. Cada POST inicia uma nova consulta, mesmo com dados iguais, com protocolo e cobrança próprios.

Use os exemplos no backend. Guarde o protocolo recebido e acompanhe por GET. Se a resposta do POST se perder, confira o histórico antes de reenviar: outro POST é outro pedido.

// Execute somente no backend (Node.js 22+). Configure o token no servidor.
// const pedido = await consultarOficialData(process.env.OFICIALDATA_TOKEN, dados);
// Guarde pedido.protocolo. Depois use acompanharOficialData(token, pedido.protocolo).
// Cada POST inicia uma nova consulta, mesmo com dados iguais.
// Resposta perdida: confira o histórico antes de reenviar; outro POST é outro pedido.

export async function consultarOficialData(token, dados = {"cpf_cnpj":"12345678000190","uf":"SP","nome":"EMPRESA EXEMPLO LTDA","imovel_finalidade":2}) {
  const corpo = await enviar(token, "https://api.oficialdata.com.br/v1/consultas/pesquisa-previa-bens", dados);
  const protocolo = corpo.data?.[0]?.protocolo;
  if (corpo.code !== 202 || !protocolo) throw new Error(JSON.stringify(corpo));
  return { protocolo: String(protocolo), resposta: corpo };
}

export async function acompanharOficialData(token, protocolo) {
  if (!/^\d+$/.test(String(protocolo))) throw new Error('Informe o protocolo recebido.');
  const corpo = await enviar(token, "https://api.oficialdata.com.br" + '/v1/consultas/' + encodeURIComponent(protocolo));
  // code 202: aguarde intervalo_consulta_segundos e consulte novamente por GET.
  // code 200/6xx: confira o resultado. Não repita o POST para acompanhar.
  return { protocolo: String(protocolo), resposta: corpo };
}

async function enviar(token, url, dados) {
  if (!token) throw new Error('Informe o token de acesso.');
  const post = dados !== undefined;
  const resposta = await fetch(url, {
    method: post ? 'POST' : 'GET',
    headers: {
      Authorization: 'Bearer ' + token, Accept: 'application/json',
      ...(post && { 'Content-Type': 'application/json' }),
    },
    ...(post && { body: JSON.stringify(dados) }),
    signal: AbortSignal.timeout(30000),
  });
  const corpo = await resposta.json();
  // Não repita POST automaticamente após timeout: o pedido pode ter sido aceito.
  if (!resposta.ok) throw new Error('HTTP ' + resposta.status + ': ' + JSON.stringify(corpo));
  return corpo;
}

A consulta aceita responde HTTP 202 com protocolo. Acompanhe até a conclusão e confira o campo code do resultado.

Resposta

Dentro de data[]: 27 campos em 3 blocos.

27

Campo que a origem não informou volta null — nunca 0 nem string vazia. Trate null como dado ausente, não como zero.

data[] object
13 campos
status string

Positiva quando houve achado, Negativa quando não houve.

nada_consta boolean

true quando a busca terminou sem registros encontrados. Confira também as limitações de cobertura.

provisorio boolean

true quando ainda há respostas pendentes na origem. O resultado pode mudar.

confianca string

Sempre INDICIO. A prévia não confirma titularidade.

total_registros integer

Quantidade de ocorrências encontradas nas matrículas.

protocolo string null

Protocolo do serviço de registro de imóveis. Pode ser diferente do protocolo de acompanhamento recebido no POST.

data_pesquisa string (ISO 8601) null

Quando a origem executou a busca.

uf string(2) null

UF efetivamente pesquisada.

pesquisado_nome string null

Nome retornado pela origem. Confira junto com o documento.

pesquisado_documento string null

CPF/CNPJ pesquisado, com pontuação. Compare com o documento enviado.

nome_digitado_manualmente boolean

true quando a origem apenas repetiu o nome informado no pedido, sem confirmar a identidade.

mensagem string

Resumo em português do que aconteceu, pronto para exibir ao usuário final.

site_receipts[] array<string>

Links dos comprovantes oficiais. Ficam na raiz da resposta, fora de data.

imoveis[] array

Matrículas em que o documento aparece. A lista não confirma que a pessoa seja proprietária atual.

6 campos
imoveis[].matricula string null

Número da matrícula. null significa que o cartório não informou o número.

imoveis[].cartorio string null

Nome do cartório onde o registro foi encontrado.

imoveis[].cns string null

Código Nacional de Serventia do cartório.

imoveis[].uf string(2) null

Estado do cartório.

true quando o cartório informou que sua base de registros está incompleta.

imoveis[].indisponivel boolean

true quando o cartório não respondeu nesta pesquisa.

cobertura object

Informa o alcance da pesquisa e as limitações dos dados.

8 campos

Quantidade de cartórios distintos que responderam à pesquisa.

Quantidade de linhas retornadas pela origem. Um cartório pode aparecer em várias linhas.

Campo antigo, igual a linhas_na_origem. Para contar cartórios, use cartorios_consultados.

cobertura.indisponiveis integer

Quantidade de cartórios que não responderam.

Quantidade de cartórios com base de registros incompleta.

cobertura.leitura_parcial boolean

true quando parte dos dados da origem não foi lida. Um resultado sem registros pode ser incompleto.

A origem ainda não fechou a busca.

Quantas retentativas a origem já fez.

Códigos de erro

O mesmo mapa que o motor usa em produção. Leia as colunas Estorna e Retenta antes de integrar: nem toda falha devolve o dinheiro.

Classe Códigos Significa Estorna Retenta
sucesso 200 A origem respondeu e entregou. — —
nao_encontrado 612 A origem respondeu: nada consta para este alvo. Não Não
indeterminado 611 A origem não conseguiu emitir pela internet. Não é irregularidade. Não Não
erro_participante 608 619 620 A origem recusou os DADOS do pedido. Não Sim
retry 600 605 609 610 613 614 615 618 Instabilidade momentânea da origem ou do transporte. Sim Sim
fatal 601 602 603 604 606 607 617 621 622 Defeito de integração — nosso, não seu. Sim Não

Estorno: erro_participante é a única classe que não devolve o dinheiro — nela a origem respondeu recusando os dados do pedido. Corrija o alvo antes de repetir. fatal é falha nossa e sempre estorna.

Permanentes: não retente 602 e 603. A fonte sai do ar na hora e a nossa equipe é avisada.

Preço por UF

Emolumento de cartório, fixado por lei estadual. Orce em POST /v1/orcamento/pesquisa-previa-bens antes de disparar em lote.

Mais barata

R$ 17,52

SP

Mediana

R$ 39,07

26 UFs vendáveis

Mais cara

R$ 132,29

RJ — 7,6× a mais barata

Estes são os preços da sua conta: emolumento do cartório, execução aplicável e taxa de serviço do canal API. Acordos vigentes prevalecem.

AC

35,15

AL

53,46

AM

59,38

AP

46,50

BA

49,48

CE

40,89

DF

22,80

ES

18,00

GO

48,34

MG

54,80

MS

26,80

MT

34,88

PA

42,95

PB

84,33

PE

48,95

PI

25,91

PR

48,59

RJ

132,29

RN

25,63

RO

23,61

RR

18,86

RS

74,40

SC

32,44

SE

34,33

SP

17,52

TO

37,24

Fora da venda: MA. A origem devolve emolumento R$ 0,00 — preço desconhecido, não gratuito. O orçamento responde disponivel: false nessas UFs; não dispare o POST.

Como interpretar o orçamento

Motivo do preço, piso mínimo e situação da cota.

Leia data[0].preco.total para saber o valor previsto da consulta. header.price é zero porque orçar não cobra. preco.motivo é um slug estável para sua integração; preco.justificativa é o texto para exibir ao usuário e pode evoluir.

coberto_pela_cota
A cota cobre a consulta, sem débito de saldo. A execução consumirá as unidades previstas.
fonte_gratuita
A regra de preço aplicada considera a fonte gratuita. Confira se o piso do canal permanece cobrado.
cortesia
Aplica-se uma cortesia comercial. Ela pode continuar sujeita ao piso mínimo da API.
cobranca_avulsa
Aplica-se o preço avulso da consulta no canal API.
preco_negociado
Aplica-se uma condição negociada para a conta.
preco_ao_custo
Aplica-se a condição de preço ao custo da conta, com o piso do canal quando indicado.
somente_emolumentos
A cota cobre o serviço; permanece o emolumento do cartório.
taxa_na_cota
A cota cobre o pedido com a taxa reduzida do plano; soma-se o emolumento do cartório.
taxa_do_plano
Aplica-se a taxa de cartório do plano, com a execução por nossa conta; soma-se o emolumento. O pedido não consome cota.
taxa_integrador
Aplica-se a taxa de cartório do plano Integrador; soma-se o emolumento do cartório.
emolumentos_e_servico
O valor inclui emolumentos do cartório e a cobrança pelo serviço.

Quando preco.piso_minimo_aplicado é true, o mínimo da API permanece cobrado. Use sempre preco.total: cortesia, custo zero da origem ou plano Gratuito não garantem uma consulta a R$ 0.

cota.status informa disponivel, esgotada, insuficiente (restam unidades, mas não bastam para a operação), fonte_fora_da_cota ou plano_sem_cota. cota.restante é a quantidade livre agora; unidades_necessarias é o peso da operação e unidades_previstas é o consumo previsto na execução. Uma consulta gratuita por outra regra pode ter cota disponível e prever consumo zero.

cota.eixo identifica a franquia e cota.limite o limite do ciclo. cota.origem distingue plano de trial. cota.reservada é sempre false: o orçamento não reserva nem consome unidades. Preço, cota e disponibilidade serão revalidados ao executar.

Se disponivel for false, leia o motivo_codigo e a mensagem motivo da resposta. Nesse caso, preco.total, preco.motivo, preco.justificativa e cota vêm null. Preço desconhecido não significa gratuidade. Disponibilidade e preço também não dispensam saldo ou os demais requisitos da execução.

Limites e desempenho

Números medidos em produção. "Não medido" é falta de amostra — nenhum valor aqui é estimativa.

Tempo típico

76s

p95

130s

Teto por hora

50

Timeout máximo

180s

De onde vem o tempo: cerca de 85% dos ~76s típicos é a origem varrendo os cartórios. Dimensione o seu timeout por esse número e não conte com redução.

Sobre o teto: a origem exige sessão única por conta, então os pedidos são serializados. É limite técnico, não cota comercial: acima dele a fila cresce e paralelizar do seu lado não acelera. Para volume maior, combine antes.

Versionamento

O contrato de resposta é v1, e a versão viaja em header.api_version em toda resposta.

  • Campo novo opcional pode entrar a qualquer momento e não muda a versão. Seu parser precisa ignorar campo que não conhece.
  • Remover campo, renomear campo ou mudar tipo é versão nova, publicada em paralelo, com prazo de desligamento anunciado da anterior.
  • Nunca alteramos o significado de um campo existente mantendo o nome. Se o significado muda, o nome muda junto.

Vai integrar?

Diga o volume que você espera e em quais UFs. A ordem de liberação segue a demanda.

Falar com a gente →