Pesquisa Prévia de Bens
Busca reversa: em quais matrículas este CPF/CNPJ aparece, numa UF. Encontra o imóvel a partir da pessoa.
OficialData · API v1 · Guia de integração
Três chamadas que respondem, em sequência, as três perguntas de uma diligência imobiliária: onde essa pessoa tem imóvel, o que está escrito na matrícula e como provar isso com fé pública.
As três APIs funcionam isoladas, mas foram desenhadas para encadear. A Pesquisa Prévia devolve exatamente os quatro campos que as outras duas exigem como entrada — matrícula, cartório, município e UF.
Busca reversa: em quais matrículas este CPF/CNPJ aparece, numa UF. Encontra o imóvel a partir da pessoa.
O conteúdo da matrícula: titular, ônus, penhoras, cadeia de atos. Sem fé pública.
O mesmo conteúdo, assinado pelo oficial do registro. Oponível a terceiros.
O conteúdo é o mesmo. A diferença é jurídica: a visualização serve para decidir (due diligence, triagem, análise interna); a certidão serve para provar — instruir processo, registrar ato, fechar financiamento. Se o seu caso não vai a juízo nem a cartório, compare o preço e o prazo cotados para cada serviço antes de confirmar.
A prévia responde indício, não titularidade. Ela diz que o documento aparece na matrícula — pode ser proprietário atual, ex-proprietário, cônjuge que deu anuência, credor hipotecário ou herdeiro. Quem confirma quem é dono hoje é a matrícula ou a certidão.
Cadastro público em oficialdata.com.br/cadastro. Não precisa de convite. A conta
é grátis. O formulário no painel permite solicitar 7 dias de trial do plano Comercial,
concedidos após aprovação administrativa, sem bônus de saldo.
O acesso à API depende só da liberação da conta pela nossa equipe — sem plano obrigatório e sem depósito mínimo. O saldo é pré-pago, consumido nas próprias consultas, a partir de R$ 0,30 cada; quem assina usa primeiro as consultas do plano, sem pagar. O trial não concede saldo para consultas: adicione saldo antes de executar pedidos pagos. Pesquisa prévia, visualização e inteiro teor têm taxas fixas, mais emolumentos e execução aplicável; dentro da cota do plano, a taxa é reduzida.
O saldo é pré-pago, em reais, e cada consulta debita dele na aceitação. Recarga em
/app/saldo, por Pix ou cartão. Sem saldo, o endpoint responde
402 dizendo quanto falta — e não cria pedido nem cobra nada.
Em /app/apis/tokens, com a conta do titular. Escolha os escopos das APIs que
vai usar; o segredo aparece uma única vez. Até 20 tokens por conta,
validade máxima de 365 dias.
| API | Escopo |
|---|---|
| Pesquisa Prévia de Bens | consultas:pesquisa-previa-bens |
| Visualização de Matrícula | consultas:visualizacao-matricula |
| Certidão de Inteiro Teor | consultas:certidao-inteiro-teor |
Um token só abre as fontes cujos escopos ele carrega. Token sem o escopo da rota recebe
403 — inclusive ao consultar o resultado ou baixar o documento daquela consulta.
Todo endpoint pede o token no cabeçalho padrão:
Authorization: Bearer od_SEU_TOKEN_AQUI
Confira as credenciais antes de escrever qualquer integração — essa chamada é grátis e não toca em nenhuma origem:
# Quem sou eu, o que posso, até quando
curl https://api.oficialdata.com.br/v1/token \
-H "Authorization: Bearer od_SEU_TOKEN"
Resposta:
{
"code": 200,
"header": { "billable": false, "price": 0.0, "api_version": "v1",
"request_id": "9f2c…" },
"data": [{
"conta": "Parceiro Integrador LTDA",
"escopos": ["consultas:pesquisa-previa-bens", …],
"expira_em": "2027-09-01T00:00:00-03:00"
}]
}
Toda resposta traz header.request_id, e ele também vem no cabeçalho HTTP
Request-Id. Guarde-o no seu log: é o número que resolve um chamado em minutos
em vez de horas.
A outra rota que não cobra. As consultas do registro de imóveis são endereçadas à serventia,
e errar o cartório não é retrabalho: o emolumento é do cartório e não
estorna. Use GET /v1/cartorios para achar a serventia e copiar os
campos do pedido — ela lê só o nosso catálogo medido, sem falar com o cartório.
# Por cidade (uf obrigatório), por CNS, por CNM ou por parte do nome
curl "https://api.oficialdata.com.br/v1/cartorios?uf=RJ&municipio=niteroi" \
-H "Authorization: Bearer od_SEU_TOKEN"
Resposta:
{
"code": 200,
"header": { "billable": false, "price": 0.0, "api_version": "v1" },
"data": [{
"medido_em": "2026-10-29",
"cartorios": [{
"nome": "2º Registro de Imóveis de Niterói",
"cns": "062661",
"params_pedido": {
"imovel_cartorio": "2",
"imovel_municipio": "NITERÓI - 2º REGISTRO DE IMÓVEIS DA 1º CIRCUNSCRIÇÃO",
"imovel_uf": "RJ"
}
}, …]
}]
}
Copie o bloco inteiro no POST da consulta. O imovel_municipio é a grafia
exata da opção do portal, e é ela que separa serventias de mesmo número —
em Niterói existem dois “2º RI”. Serventia sem número de ordem publicado vem com
motivo e sem params_pedido: não há pedido a montar para ela, e
nós não inventamos um 1.
Filtros: uf + municipio, uf + termo
(parte do nome), cns (busca nacional, ignora uf) ou
matricula com um CNM completo — o CNM carrega o CNS do cartório, e um número
de matrícula solto não identifica serventia nenhuma. servico aceita
matricula ou certidao; a cobertura das duas difere.
Toda consulta paga segue o mesmo desenho: orçar, pedir, acompanhar, baixar. Os passos 1 e 4 não cobram.
Envie os mesmos dados que pretende consultar. O orçamento informa o preço previsto para a conta e o alvo, explica a cobrança e mostra a situação da cota. Não executa, não cobra e não reserva cota.
curl -X POST https://api.oficialdata.com.br/v1/orcamento/pesquisa-previa-bens \
-H "Authorization: Bearer od_SEU_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "cpf_cnpj": "19131243000197", "uf": "SP" }'
{
"code": 200,
"header": { "billable": false, "price": 0.0 },
"data": [{
"disponivel": true,
"motivo": null,
"campos_faltando": [],
"preco": {
"total": 17.52,
"moeda": "BRL",
"estimado": true,
"desconto_plano_percentual": 0,
"motivo": "emolumentos_e_servico",
"justificativa": "O valor inclui os emolumentos do cartório e a cobrança pelo serviço. O plano não possui cota para esta consulta. O orçamento não reserva cota; preço e disponibilidade serão revalidados na execução.",
"piso_minimo_aplicado": false
},
"cota": {
"status": "plano_sem_cota",
"eixo": "consultas",
"limite": 0,
"restante": 0,
"unidades_necessarias": 1,
"unidades_previstas": 0,
"origem": "plano",
"reservada": false
},
"limites": { "latencia_p50_s": 72, "teto_hora": 50 }
}]
}
Quando não dá para vender, a resposta continua 200 —
disponivel: false, com motivo em português e
campos_faltando nomeando o que faltou. O status HTTP fala de transporte;
o desfecho do negócio vive no corpo. O exemplo acima ilustra uma conta sem cota
e mostra um recorte da resposta.
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_cotafonte_gratuitacortesiacobranca_avulsapreco_negociadopreco_ao_custosomente_emolumentostaxa_na_cotataxa_do_planotaxa_integradoremolumentos_e_servico
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.
Envie seu token e os dados para iniciar uma nova consulta;
você não precisa criar nem enviar outra chave. A resposta é 202
com um protocolo: a consulta roda na fila, e segurar a conexão até a origem responder é o
que cria pedido órfão pago quando o seu HTTP desiste.
Use os exemplos de backend abaixo: envie os dados, guarde o protocolo recebido e acompanhe por GET.
{
"code": 202,
"header": { "billable": true, "price": 17.52 },
"data": [{
"protocolo": "4713",
"estado": "processando",
"consultar_em": "/v1/consultas/4713",
"intervalo_consulta_segundos": 72,
"escada_polling_s": [72, 30, 60, 120]
}]
}
header.billable já vem true: o saldo caiu na aceitação. Não some o
preço de novo quando o resultado chegar.
| Campo | Tipo | Prévia | Matrícula | Certidão | Observação |
|---|---|---|---|---|---|
| cpf_cnpj | string | obrig. | obrig. | obrig. | Com ou sem máscara |
| uf | string(2) | obrig. | — | — | Uma UF por chamada |
| nome | string | opcional | — | — | Ajuda a desambiguar |
| imovel_finalidade | integer | opcional | — | — | Padrão 2 |
| imovel_matricula | string | — | obrig. | obrig. | Número da matrícula ou CNM |
| imovel_cartorio | integer | — | obrig. | obrig. | 1 = 1º RI |
| imovel_municipio | string | — | obrig. | obrig. | Do cartório, não do imóvel |
| imovel_uf | string(2) | — | obrig. | obrig. | Do cartório |
| imovel_finalidade | integer | — | opcional | — | Padrão 2 |
O campo é declarado ao cartório, em nome de quem pede — não é filtro nem
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 sobre o imóvel.
Diligência sobre imóvel de terceiro não é titularidade. Mandar 3 ali é
declaração falsa feita em nome do seu cliente. Na dúvida, omita: o padrão é 2.
Não cobra e não fala com a origem — lê o que o motor já escreveu. Pode consultar à vontade, respeitando o limite de requisições.
curl https://api.oficialdata.com.br/v1/consultas/4713 \
-H "Authorization: Bearer od_SEU_TOKEN"
Três desfechos possíveis, distinguidos pelo code:
| code | Significa | O que fazer |
|---|---|---|
| 202 | estado: "processando" — ainda rodando | Aguardar intervalo_consulta_segundos segundos e repetir o GET no mesmo protocolo, sem nova cobrança |
| 202 | estado: "em_emissao" — protocolado no cartório, documento a caminho | Idem. Vem com numero_pedido e previsao_entrega_em |
| 200 | Terminou, com o resultado | Ler os dados; baixar o documento, se houver |
| 6xx | Terminou sem entregar | Ver a tabela de códigos |
A certidão de inteiro teor sempre passa por esse estado — o cartório leva cerca
de 4 horas úteis (expediente 9h–16h, seg–sex). O 200 com o documento chega
depois. Quem trata em_emissao como desfecho final paga a certidão e nunca a
recebe.
Guarde numero_pedido do seu lado assim que ele aparecer. É o protocolo no
cartório, e para a certidão não existe rota de recuperação: perder o
número é perder o documento e o emolumento.
Exemplo de 200 concluído — os campos vêm na raiz de data[0]:
{
"code": 200,
"header": { "billable": true, "price": 97.36 },
"data": [{
"status_consulta": "SUCESSO",
"status": "Emitida",
"identificadores": { "numero_pedido": "CT030158741" },
"certidao_codigo": "1234-5678-9012",
"documento_url": "https://api.oficialdata.com.br/v1/consultas/4713/documento",
"mensagem": "Certidão emitida com fé pública…"
}],
"site_receipts": ["https://origem/…"]
}
Não cobra. Baixar de novo o que já foi pago não é uma segunda consulta.
curl -L https://api.oficialdata.com.br/v1/consultas/4713/documento \
-H "Authorization: Bearer od_SEU_TOKEN" \
-o certidao.pdf
site_receipts[] é a URL na origem, e ela expira em cerca de
7 dias — está ali para auditoria. documento_url aponta para o nosso
arquivo, autentica com o mesmo Bearer e não expira. Guardar o link errado transforma todo
documento pago em link morto na semana seguinte.
Todas as consultas: basta enviar o token e os dados. Cada POST inicia uma nova consulta, mesmo com dados iguais, com protocolo e cobrança próprios. Não há reaproveitamento automático por CPF/CNPJ ou imóvel.
O protocolo identifica o pedido aceito. As travas internas protegem seu processamento. Use GET para acompanhar esse pedido sem iniciar outra consulta.
Um pedido novo de cartório protocola um ato e debita o emolumento. Não existe estorno do ato já praticado. Outro POST é outro pedido.
Exemplo: o ERP envia um POST, recebe o protocolo e acompanha por GET. Se precisar consultar novamente o mesmo alvo, envia outro POST e recebe outro protocolo.
Guarde o protocolo no seu sistema. O token fica somente no backend; estes exemplos não são para rodar no navegador.
// 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;
}
<?php
// Salve como oficialdata.php no backend Laravel. Configure o token no servidor.
// $consultar = require base_path('oficialdata.php');
// $pedido = $consultar(config('services.oficialdata.token'), $dados);
// Guarde $pedido['protocolo']; acompanhe com $consultar($token, null, $protocolo).
// Cada POST inicia uma nova consulta, mesmo com dados iguais.
// Resposta perdida: confira o histórico antes de reenviar; outro POST é outro pedido.
use Illuminate\Support\Facades\Http;
return function (string $token, ?array $dados = null, ?string $protocolo = null): array {
if ($token === '') {
throw new RuntimeException('Informe o token de acesso.');
}
$http = Http::withToken($token)->acceptJson()->timeout(30);
if ($protocolo !== null) {
if (! ctype_digit($protocolo)) {
throw new RuntimeException('Informe o protocolo recebido.');
}
$resposta = $http->get("https://api.oficialdata.com.br".'/v1/consultas/'.rawurlencode($protocolo));
} else {
$dados ??= json_decode('{"cpf_cnpj":"12345678000190","uf":"SP","nome":"EMPRESA EXEMPLO LTDA","imovel_finalidade":2}', true, flags: JSON_THROW_ON_ERROR);
$resposta = $http->post("https://api.oficialdata.com.br/v1/consultas/pesquisa-previa-bens", $dados);
}
// Não repita POST automaticamente após timeout: o pedido pode ter sido aceito.
$resposta->throw();
$corpo = $resposta->json();
if ($protocolo === null) {
$protocolo = $corpo['data'][0]['protocolo'] ?? null;
if (($corpo['code'] ?? null) !== 202 || ! $protocolo) {
throw new RuntimeException(json_encode($corpo, JSON_THROW_ON_ERROR));
}
}
// code 202: aguarde intervalo_consulta_segundos e faça GET; code 200/6xx: leia o resultado.
return ['protocolo' => (string) $protocolo, 'resposta' => $corpo];
};
Um timeout de rede do seu lado não significa que o pedido não foi protocolado do nosso — significa apenas que você não viu a resposta. Confira o histórico antes de reenviar.
Fora da cota, a taxa é fixa por pedido: R$ 9,90 na Pesquisa Prévia, R$ 14,90 na Visualização e R$ 19,90 no Inteiro Teor. Some o emolumento e o custo de execução aplicável. Pedidos de cartório não consomem a cota do plano: com assinatura, paga-se o emolumento mais a taxa do seu plano, sem custo de execução — 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 (pesquisa prévia, visualização e inteiro teor). Não há faixas de volume. Acordos vigentes podem alterar o orçamento da conta. Orçamento e acompanhamento não cobram novamente. O emolumento é fixado por lei estadual, e é por isso que a mesma consulta custa 16× mais no Rio de Janeiro que em São Paulo.
| Consulta | Referência | Varia com |
|---|---|---|
| Visualização de Matrícula | R$ 38,46 | Tabela do cartório |
| Certidão de Inteiro Teor | R$ 97,36 | Tabela do cartório |
Valores medidos no 1º RI de Taquaritinga/SP. Cada serventia tem a sua tabela — sempre orce antes.
A origem busca por estado, não nacionalmente. Varredura Brasil inteiro são 26 chamadas e 26 cobranças — de R$ 17,52 a R$ 132,29 cada. Não existe parâmetro que faça isso numa só.
O Maranhão está fora: a origem devolve emolumento R$ 0,00 — preço
desconhecido, não gratuito. O orçamento responde disponivel: false nessa UF.
O status HTTP fala de transporte. O desfecho do negócio vive em
code, no corpo — inclusive quando a resposta HTTP é 200. Assim
404 de rota errada nunca se confunde com "nada consta".
| HTTP | Quando | O que fazer |
|---|---|---|
| 401 | Token ausente, inválido, expirado ou revogado | Conferir com GET /v1/token |
| 403 | Token sem o escopo daquela fonte | Emitir token com o escopo certo |
| 402 | Saldo insuficiente | Recarregar. Nada foi cobrado |
| 422 | Payload inválido, ou chave de idempotência reusada com corpo diferente | Ler errors[]. Nada foi cobrado |
| 429 | Limite de requisições | Esperar o Retry-After |
Chegam com HTTP 200. A coluna que importa para a sua conciliação é a última.
| code | Classe | Significa | Cobrado |
|---|---|---|---|
| 200 | sucesso | Consulta concluída | Sim |
| 612 | nada consta | Procurou e não achou ocorrência | Sim |
| 611 | indeterminado | A origem não conseguiu concluir por dados insuficientes | Sim |
| 608 · 619 · 620 | erro do alvo | A origem respondeu recusando o alvo | Sim |
| 600 · 605 · 609 · 610 · 613 · 614 · 615 · 618 | transitório | Origem instável ou fora do ar | Não — estornado |
| 601 · 602 · 603 · 604 · 606 · 607 · 617 · 621 · 622 | fatal | Falha conclusiva | Não — estornado |
"Nada consta" é trabalho feito: o cartório foi consultado e respondeu que não há ocorrência.
Ele é cobrado, e vem com comprovante — que é justamente a peça que sustenta um laudo de
ausência de bens. Não trate 612 como erro na sua integração.
Todo desfecho declara header.billable e header.price, inclusive as
falhas. Concilie por esses dois campos, nunca pelo status HTTP.
O webhook ainda não está disponível. Acompanhe a conclusão pelo protocolo em
GET /v1/consultas/{protocolo}, respeitando o intervalo indicado na resposta.
| Limite | Valor | Comportamento |
|---|---|---|
| Requisições por token | 60 / min | 429 com Retry-After |
| Requisições por conta (todos os tokens somados) | 120 / min | 429 com Retry-After |
| Consultas em andamento por conta | 5 | 429 com Retry-After, nada cobrado |
| Consultas em andamento, total da API | 15 | 429 com Retry-After, nada cobrado |
| Pesquisa Prévia, por conta | ~50 / hora | Atendidas em ordem, uma por vez |
| Tokens vivos por conta | 20 | Revogue os que não usa |
| Validade do token | 365 dias | Máximo por emissão |
É limite físico, não cota comercial: a sessão do portal do registro é única por conta, e dois pedidos simultâneos se atropelariam no meio de um ato pago. Por isso as chamadas passam enfileiradas, uma a uma.
Por isso a API aceita até 5 consultas em andamento por conta.
A partir daí responde 429 com Retry-After, sem cobrar e sem criar
protocolo: espere uma concluir e repita os mesmos dados
— essa recusa não fica gravada como resposta do pedido. Para lotes grandes, envie em ondas de 5.
Se o seu volume for maior de forma sustentada, fale conosco
antes de contratar: ampliar a capacidade é operacional do nosso lado e
não muda uma linha da sua integração.
Erros de leitura que custam caro, em ordem de quanto já custaram.
em_emissao como desfecho
É o mais caro da lista. A certidão fecha o pedido em 202 · em_emissao e entrega
horas depois. Pare de acompanhar aí e você pagou ~R$ 85 por um documento que não buscou.
site_receipts
Expira em ~7 dias. A entrega é documento_url, que não expira.
matricula: null como "não tem imóvel"
Na Pesquisa Prévia, um item de imoveis[] com matricula: null
significa que o cartório devolveu "matrícula não informada". O imóvel existe e
o documento consta nele — o que falta é o número.
A resposta traz um bloco cobertura com quantos cartórios responderam, quantos
estavam fora do ar e se a busca fechou. nada_consta só vem true
quando a busca fechou sem achado. Com cobertura.retries_pendentes: true
ou cobertura.leitura_parcial: true, um "não achamos" não cobre o estado inteiro —
e não sustenta laudo.
nome_digitado_manualmente como prova de identidade
A origem repete no resultado o nome que foi enviado no pedido, sem conferi-lo contra o
documento. A única chave da busca é o CPF/CNPJ. Compare pesquisado_documento
programaticamente antes de arquivar: divergência de um dígito invalida a busca inteira.
A busca alcança registros a partir de 01/01/1976. O que é anterior está em livro de transcrição, fora da base indexada, e não aparece por nenhum parâmetro.
imovel_municipio é o do cartório. Um imóvel em Fernando Prestes
pode estar registrado em Taquaritinga — e é Taquaritinga que vai no campo. Se você não sabe
qual é, a Pesquisa Prévia devolve exatamente esse dado.
GET /v1/token responde 200 com os escopos que você espera.POST /v1/consultas/*.code for 202 — incluindo em_emissao.numero_pedido gravado do seu lado assim que aparece.documento_url, não site_receipts.header.billable e header.price, não por status HTTP.612 tratado como resposta válida, com comprovante.request_id no seu log, em toda chamada.402: saldo acabando interrompe a operação inteira.