Como criar uma Minimal API em .NET para consulta de CPF

Crie uma Minimal API em .NET para consulta de CPF com poucos arquivos, validação e integração com a API do CPFHub.

Redação CPFHub.io
Redação CPFHub.io
··6 min de leitura
Como criar uma Minimal API em .NET para consulta de CPF

As Minimal APIs do .NET permitem criar um endpoint de consulta de CPF com apenas um arquivo Program.cs, integrando diretamente com a CPFHub.io via HttpClient e entregando resposta JSON em ~900ms. A abordagem elimina controllers, reduz a cerimônia de configuração e é ideal para microsserviços e provas de conceito que precisam ir a produção rapidamente.

Introdução

As Minimal APIs do .NET permitem criar endpoints HTTP com o mínimo de cerimônia, eliminando a necessidade de controllers e configurações extensas. Este guia mostra como construir um microsserviço funcional em .NET, integrado com o serviço do CPFHub.io.


Estrutura do projeto

Crie o projeto e instale as dependências necessárias:

dotnet new web -n CpfMinimalApi
cd CpfMinimalApi

A principal vantagem das Minimal APIs é que todo o código pode ser organizado em poucos arquivos, mantendo a simplicidade sem sacrificar funcionalidade.

CaracterísticaMinimal APIController-based API
Arquivos necessários1-35+
Configuração inicialMínimaExtensa
PerformanceLevemente superiorPadrão
Curva de aprendizadoBaixaModerada
Ideal paraMicrosserviçosAplicações grandes

Definindo os modelos

Utilize records para definir os modelos de forma concisa e imutável:

public record CpfResponse(bool Success, CpfData Data);

public record CpfData(
    string Cpf,
    string Name,
    string NameUpper,
    string Gender,
    string BirthDate,
    string Day,
    string Month,
    string Year
);

public record CpfResult(
    bool Valid,
    string Cpf,
    string? Name,
    string? BirthDate,
    string? Gender,
    string Message
);

public record ErrorResponse(string Message, int StatusCode);

Construindo a Minimal API completa

No arquivo Program.cs, configure todos os serviços e endpoints:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpClient("CpfHub", client =>
{
    client.BaseAddress = new Uri("https://api.cpfhub.io/");
    client.DefaultRequestHeaders.Add("x-api-key",
    builder.Configuration["CpfHub:ApiKey"]);
    client.Timeout = TimeSpan.FromSeconds(10);
});

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.MapGet("/api/cpf/{cpf}", async (
    string cpf,
    IHttpClientFactory httpClientFactory) =>
{
    var cpfLimpo = new string(cpf.Where(char.IsDigit).ToArray());

    if (cpfLimpo.Length != 11)
    return Results.BadRequest(new ErrorResponse(
    "CPF deve conter exatamente 11 dígitos", 400));

    var client = httpClientFactory.CreateClient("CpfHub");

    try
    {
    var response = await client.GetAsync($"cpf/{cpfLimpo}");

    if (!response.IsSuccessStatusCode)
    return Results.NotFound(new ErrorResponse(
    "CPF não encontrado", 404));

    var dados = await response.Content
    .ReadFromJsonAsync<CpfResponse>();

    if (dados is not { Success: true })
    return Results.NotFound(new ErrorResponse(
    "CPF não encontrado na base", 404));

    return Results.Ok(new CpfResult(
    true, dados.Data.Cpf, dados.Data.Name,
    dados.Data.BirthDate, dados.Data.Gender,
    "CPF encontrado com sucesso"
    ));
    }
    catch (TaskCanceledException)
    {
    return Results.StatusCode(504);
    }
    catch (HttpRequestException)
    {
    return Results.StatusCode(502);
    }
})
.WithName("ConsultarCpf")
.WithOpenApi()
.Produces<CpfResult>(200)
.Produces<ErrorResponse>(400)
.Produces<ErrorResponse>(404);

app.Run();

Adicionando validação e middleware

Crie um filtro de endpoint para validar o CPF antes de processar a requisição:

app.MapGet("/api/cpf/validar/{cpf}", (string cpf) =>
{
    var cpfLimpo = new string(cpf.Where(char.IsDigit).ToArray());

    if (cpfLimpo.Length != 11)
    return Results.BadRequest(new { valid = false, message = "CPF incompleto" });

    if (cpfLimpo.Distinct().Count() == 1)
    return Results.BadRequest(new { valid = false, message = "CPF com dígitos repetidos" });

    var soma = 0;
    for (int i = 0; i < 9; i++)
    soma += (cpfLimpo[i] - '0') * (10 - i);
    var d1 = soma % 11 < 2 ? 0 : 11 - (soma % 11);

    soma = 0;
    for (int i = 0; i < 10; i++)
    soma += (cpfLimpo[i] - '0') * (11 - i);
    var d2 = soma % 11 < 2 ? 0 : 11 - (soma % 11);

    var valido = cpfLimpo[9] - '0' == d1 && cpfLimpo[10] - '0' == d2;

    return valido
    ? Results.Ok(new { valid = true, message = "CPF válido" })
    : Results.BadRequest(new { valid = false, message = "Dígitos verificadores inválidos" });
})
.WithName("ValidarCpf")
.WithOpenApi();

Testando com HTTP files

O .NET suporta arquivos .http para testar endpoints diretamente no Visual Studio ou VS Code. Consulte a documentação oficial da Microsoft para mais detalhes sobre o formato:

// Arquivo: requests.http

### Consultar CPF
GET https://localhost:5001/api/cpf/12345678900

### Validar formato do CPF
GET https://localhost:5001/api/cpf/validar/12345678900

### CPF inválido
GET https://localhost:5001/api/cpf/validar/11111111111

Perguntas frequentes

A CPFHub.io retorna HTTP 429 quando o limite de consultas é atingido?

Não. A API nunca retorna HTTP 429 nem bloqueia requisições. Ao atingir o limite do plano (50 consultas/mês no gratuito ou 1.000 no Pro), as consultas adicionais são cobradas a R$0,15 cada, garantindo que o microsserviço .NET continue funcionando sem interrupções. O controle de consumo fica disponível em app.cpfhub.io/settings/billing.

Como armazenar a API key com segurança em uma Minimal API .NET?

Use builder.Configuration["CpfHub:ApiKey"] combinado com dotnet user-secrets em desenvolvimento e variáveis de ambiente (ou Azure Key Vault) em produção. Nunca coloque a chave diretamente no código-fonte ou em arquivos appsettings.json versionados. O IHttpClientFactory já injeta o header x-api-key de forma centralizada, evitando duplicação.

Qual é a latência esperada da API CPFHub.io em um microsserviço .NET?

A latência média da CPFHub.io é ~900ms por consulta. Configure o Timeout do HttpClient para pelo menos 10 segundos para absorver variações de rede. O tratamento de TaskCanceledException no exemplo acima já garante que timeouts sejam propagados como HTTP 504, mantendo a API bem comportada.

Posso usar essa Minimal API como back-end intermediário para proteger a chave de API?

Sim, e é a abordagem recomendada. Expor a API key diretamente no front-end ou em aplicativos móveis é um risco de segurança. O microsserviço .NET recebe o CPF do cliente, chama a CPFHub.io com a chave guardada em segredos e devolve apenas os dados necessários, sem expor credenciais.


Conclusão

As Minimal APIs do .NET são ideais para criar microsserviços focados como a consulta de CPF. Com poucas linhas de código, você obtém um endpoint funcional, documentado com Swagger e pronto para produção.

Cadastre-se em cpfhub.io — 50 consultas mensais gratuitas, sem cartão de crédito — e integre a consulta de CPF ao seu projeto .NET em menos de duas horas.

CPFHub.io

Pronto para integrar a API?

50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.

Redação CPFHub.io

Sobre a redação

Redação CPFHub.io

Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.

WhatsAppFale conosco via WhatsApp