O site buscarcep.com.br oferece um serviço de consulta de CEP gratuíto para até 5 consultas por minuto ou até 20 consultas por minuto para quem é cadastrado. Para quem necessita realizar mais que 20 consultas por minuto, é possível fazer um plano pago com a quantidade que desejar.

O serviço disponível neste site, permite que através do CEP recebamos o retorno de todas as informações do endereço (cep, uf, cidade, bairro, tipo de logradouro, logradouro, código IBGE da UF e o código IBGE do município).

Inicie uma nova aplicação no Delphi (File - New - Application) e adicione1 componente TMaskEdit,10componentes do tipo TEdit, 1 componente do tipo TMemo e1 componentes do tipo TButton. Adicione também um componente IdHTTP que está na aba Indy e um componente TXMLDocument que está disponível na aba Internet. A tela ficará com a aparência da imagem abaixo.

Selecione o componente MaskEdit1, altere a propriedade name para edtCep e também a propriedade EditMask para 00000\-999;1;_ . Nos componetes TEdit, coloque os seguintes nomes: edtCepResp, edtUF, edtCidade, edtBairro, edtTipoLog, edtLogradouro, edtResultado, edtResultadoTXT, edtUFIBGE, edtCidadeIBGE. Altere o propriedade caption docomponente Button1 para Consultar CEP. Altere a propriedade name do componente Memo1 para memoRes.

Dê um duplo clique no Button1 e acrescente o seguinte código:

memoRes.Clear;
memoRes.Text := IdHTTP1.Get('http://www.buscarcep.com.br/?cep='+StringReplace(edtCep.Text,'-','',[rfReplaceAll])+'&formato=xml');
XMLDocument1.Active := False;
XMLDocument1.LoadFromFile('http://www.buscarcep.com.br/?cep='+StringReplace(edtCep.Text,'-','',[rfReplaceAll])+'&formato=xml');
XMLDocument1.Active := True;
edtCepResp.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['cep'].Text;
edtUF.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['uf'].Text;
edtCidade.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['cidade'].Text;
edtBairro.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['bairro'].Text;
edtTipoLog.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['tipo_logradouro'].Text;
edtLogradouro.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['logradouro'].Text;
edtResultado.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['resultado'].Text;
edtResultadoTXT.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['resultado_txt'].Text;
edtUFIBGE.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['ibge_uf'].Text;
edtCidadeIBGE.Text := XMLDocument1.ChildNodes['webservicecep'].ChildNodes['ibge_municipio'].Text;

Pronto, basta compilar o programa, digitar um cep no componente edtCep e clicar no botão Consultar CEP.

ATENÇÃO: código de município do IBGE, é retornado sem o dígito verificador, para usá-lo na geração do XML da NFe, basta calcular o dígito do município conforme orientação do Manual de Integração - Contribuinte disponível no site NFe. Um exemplo de como efetuar o calculo você encontra clicando aqui.