Como consumir API de CPF em Bun com runtime ultra-rápido

Aprenda a consumir a API de consulta de CPF usando Bun, o runtime JavaScript ultra-rápido, com fetch nativo, servidor HTTP e testes integrados.

Redação CPFHub.io
Redação CPFHub.io
··7 min de leitura
Como consumir API de CPF em Bun com runtime ultra-rápido

Bun é o runtime JavaScript que combina velocidade de startup (~7ms), fetch nativo otimizado e test runner integrado em um único binário. Para consumir a API de CPF da CPFHub.io, o overhead mínimo do Bun garante que o tempo de resposta total seja determinado pela rede, não pelo runtime. Não publicamos um número de latência — meça no seu ambiente. A disponibilidade contratada por plano é Grátis 95%, Pro 99% e Corporativo 99,9%; veja preços.


Consulta básica com fetch nativo

O Bun implementa a Web Fetch API como global, assim como o Deno. A diferença está na performance — o Bun otimiza internamente as conexões HTTP para throughput máximo. Consulte a documentação oficial do Bun para detalhes sobre as otimizações de rede:

// src/cpfhub.ts

interface CPFData {
    cpf: string;
    name: string;
    nameUpper: string;
    gender: string;
    birthDate: string;
    day: number;
    month: number;
    year: number;
}

interface CPFApiResponse {
    success: boolean;
    data?: CPFData;
}

const API_URL = "https://api.cpfhub.io/cpf";
const API_KEY = Bun.env.CPFHUB_API_KEY ?? "";
const TIMEOUT_MS = 10000;

export async function consultarCPF(cpf: string): Promise<{
    sucesso: boolean;
    dados?: CPFData;
    erro?: string;
}> {
    const cpfLimpo = cpf.replace(/\D/g, "");

    if (cpfLimpo.length !== 11) {
    return { sucesso: false, erro: "CPF deve conter 11 digitos" };
    }

    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);

    try {
    const response = await fetch(`${API_URL}/${cpfLimpo}`, {
    method: "GET",
    headers: {
    "x-api-key": API_KEY,
    "Accept": "application/json",
    },
    signal: controller.signal,
    });

    clearTimeout(timeoutId);

    if (!response.ok) {
    return { sucesso: false, erro: `Status ${response.status}` };
    }

    const resultado: CPFApiResponse = await response.json();

    if (!resultado.success || !resultado.data) {
    return { sucesso: false, erro: "CPF nao encontrado" };
    }

    return { sucesso: true, dados: resultado.data };
    } catch (error) {
    clearTimeout(timeoutId);

    if (error instanceof Error && error.name === "AbortError") {
    return { sucesso: false, erro: "Timeout na consulta" };
    }

    return { sucesso: false, erro: String(error) };
    }
}

Note o uso de Bun.env para acessar variáveis de ambiente — a API específica do Bun, embora process.env também funcione por compatibilidade com Node.js.


Servidor HTTP com Bun.serve

O Bun inclui um servidor HTTP integrado que é significativamente mais rápido que o http do Node.js. Veja como criar uma API de validação de CPF:

// src/server.ts
import { consultarCPF } from "./cpfhub";

const PORT = parseInt(Bun.env.PORT ?? "3000");

function jsonResponse(body: object, status = 200): Response {
    return new Response(JSON.stringify(body), {
    status,
    headers: {
    "Content-Type": "application/json",
    "X-Powered-By": "Bun",
    },
    });
}

const server = Bun.serve({
    port: PORT,

    async fetch(req: Request): Promise<Response> {
    const url = new URL(req.url);
    const inicio = performance.now();

    // Health check
    if (url.pathname === "/health") {
    return jsonResponse({
    status: "ok",
    runtime: "bun",
    version: Bun.version,
    timestamp: new Date().toISOString(),
    });
    }

    // Rota de consulta de CPF
    if (req.method === "GET" && url.pathname.startsWith("/api/cpf/")) {
    const cpf = url.pathname.split("/api/cpf/")[1];

    if (!cpf || cpf.replace(/\D/g, "").length !== 11) {
    return jsonResponse(
    { erro: "CPF invalido. Informe 11 digitos na URL." },
    400
    );
    }

    const resultado = await consultarCPF(cpf);
    const duracao = (performance.now() - inicio).toFixed(2);

    if (!resultado.sucesso) {
    return jsonResponse(
    { erro: resultado.erro, duracaoMs: duracao },
    resultado.erro?.includes("nao encontrado") ? 404 : 500
    );
    }

    return jsonResponse({
    valido: true,
    dados: {
    nome: resultado.dados!.name,
    cpf: resultado.dados!.cpf,
    genero: resultado.dados!.gender,
    dataNascimento: resultado.dados!.birthDate,
    },
    duracaoMs: duracao,
    });
    }

    return jsonResponse({ erro: "Rota nao encontrada" }, 404);
    },

    error(error: Error): Response {
    console.error("Erro no servidor:", error);
    return jsonResponse({ erro: "Erro interno do servidor" }, 500);
    },
});

console.log(`Servidor Bun rodando em http://localhost:${server.port}`);

Execute com:

CPFHUB_API_KEY=sua_chave bun run src/server.ts

Testes com bun:test

O Bun inclui um test runner nativo que é até 30x mais rápido que o Jest:

// src/cpfhub.test.ts
import { describe, test, expect, mock } from "bun:test";
import { consultarCPF } from "./cpfhub";

describe("consultarCPF", () => {
    test("rejeita CPF com menos de 11 digitos", async () => {
    const resultado = await consultarCPF("12345");
    expect(resultado.sucesso).toBe(false);
    expect(resultado.erro).toBe("CPF deve conter 11 digitos");
    });

    test("remove formatacao do CPF", async () => {
    const resultado = await consultarCPF("123.456.789-01");
    expect(resultado.erro).not.toBe("CPF deve conter 11 digitos");
    });

    test("retorna timeout apos limite", async () => {
    const fetchOriginal = globalThis.fetch;
    globalThis.fetch = mock(() =>
    new Promise((_, reject) => {
    setTimeout(() => reject(new DOMException("Aborted", "AbortError")), 100);
    })
    );

    const resultado = await consultarCPF("12345678901");
    expect(resultado.sucesso).toBe(false);
    expect(resultado.erro).toContain("Timeout");

    globalThis.fetch = fetchOriginal;
    });
});

Execute os testes:

bun test

Comparativo de performance entre runtimes

O Bun se destaca em cenários de alta concorrência e baixa latência:

MétricaNode.js 20Deno 1.38Bun 1.1
Tempo de startup~50ms~30ms~7ms
Requisições/s (HTTP)~45.000~55.000~105.000
Fetch (latência)~2ms~1.8ms~0.8ms
Install de pacotes~15s~12s~3s

Para uma API de validação de CPF, o overhead mínimo do Bun significa que a maior parte do tempo de resposta é determinada pela rede e pela API, não pelo runtime. Não publicamos um número de latência da CPFHub.io — meça no seu ambiente. A disponibilidade por plano está em preços.


Configuração para produção

Para deploy em produção, crie um Dockerfile otimizado:

FROM oven/bun:1.1 AS base
WORKDIR /app

COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production

COPY src ./src

ENV NODE_ENV=production
EXPOSE 3000

CMD ["bun", "run", "src/server.ts"]

Perguntas frequentes

O Bun é compatível com pacotes npm existentes para chamadas HTTP?

Sim. O Bun mantém compatibilidade com o ecossistema npm — pacotes como axios e node-fetch funcionam sem modificação. Dito isso, o fetch nativo do Bun já é otimizado e não requer bibliotecas externas para a maioria dos casos de uso, incluindo integração com a CPFHub.io.

Como lidar com o limite de consultas do plano gratuito no Bun?

O plano gratuito da CPFHub.io oferece 50 consultas por mês. Ao atingir esse limite, a API não bloqueia as requisições — cobra R$0,15 por consulta adicional. Para controlar o consumo no Bun, implemente um contador em memória com Bun.env e persista o estado em um arquivo JSON usando Bun.write() se precisar sobreviver a restarts.

Como configurar variáveis de ambiente no Bun para a chave de API?

O Bun lê automaticamente arquivos .env na raiz do projeto — sem necessidade de bibliotecas como dotenv. Use Bun.env.CPFHUB_API_KEY para acessar a chave. Em produção, defina a variável diretamente no ambiente de execução (Docker, systemd, etc.) e nunca commite o arquivo .env no repositório.

O Bun suporta TypeScript nativamente para integração com APIs?

Sim. O Bun executa TypeScript sem transpilação prévia — basta rodar bun run arquivo.ts. Isso acelera o desenvolvimento e elimina a necessidade de configurar tsc ou ts-node. Os tipos TypeScript para as respostas da CPFHub.io podem ser definidos diretamente no projeto, como demonstrado nos exemplos acima.


Conclusão

O Bun traz uma proposta convincente para integrações com APIs externas: performance excepcional, fetch nativo otimizado, servidor HTTP integrado e testes rápidos — tudo em um único runtime. Para aplicações que precisam validar CPF com overhead mínimo de runtime, a combinação do Bun com a API da CPFHub.io é uma escolha sólida. A CPFHub.io não publica um número de latência — meça no seu ambiente — e oferece disponibilidade contratada por plano (Grátis 95%, Pro 99%, Corporativo 99,9%); detalhes em preços.

Cadastre-se em cpfhub.io

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