← Voltar ao blog
APIs .NET C# Backend Polly Integração

APIs Públicas e Gratuitas que Todo Dev Backend Deveria Conhecer

· 13 min de leitura

Integrar APIs externas é rotina no backend. O problema é descobrir quais existem, o que realmente oferecem de graça e como integrá-las de forma resiliente. Este artigo é um catálogo comentado — com limitações reais e dicas de produção.


🇧🇷 Endereços e Localidades

ViaCEP

URL: https://viacep.com.br/ws/{cep}/json/
Auth: Nenhuma
Limite: Não documentado
Países: 🇧🇷 Brasil

Retorna logradouro, bairro, cidade e UF a partir de um CEP. Aceita também busca reversa por logradouro (nome de rua + município + UF).

Vantagens: zero configuração, resposta consistente, amplamente adotado.
Limitações: sem SLA público e sem rate limit declarado — cache agressivo é obrigatório.

BrasilAPI

URL: https://brasilapi.com.br/api/
Auth: Nenhuma
Limite: Não documentado
Países: 🇧🇷 Brasil

Hub de dados públicos brasileiros. Uma única dependência, múltiplos endpoints:

  • GET /cep/v2/{cep} — CEP via múltiplas fontes, mais robusto que ViaCEP
  • GET /banks/v1 — lista de bancos com código ISPB e COMPE
  • GET /cnpj/v1/{cnpj} — dados cadastrais completos de empresa
  • GET /ddd/v1/{ddd} — estado e cidades por código de área
  • GET /feriados/v1/{ano} — feriados nacionais por ano
  • GET /taxas/v1 — SELIC, CDI, poupança e outros índices
  • GET /ibge/municipios/v1/{uf} — municípios por estado

Vantagens: API unificada para dados oficiais, código aberto, bem mantida pela comunidade.
Limitações: uptime depende de fontes de terceiros — circuit breaker é obrigatório em produção.

IBGE — Localidades

URL: https://servicodados.ibge.gov.br/api/v1/localidades/
Auth: Nenhuma
Limite: Não documentado
Países: 🇧🇷 Brasil

Dados geográficos oficiais: estados, municípios, mesorregiões, microrregiões e distritos. Ideal para validar endereços, popular dropdowns ou gerar relatórios regionais.

Endpoints mais usados: /estados, /estados/{uf}/municipios, /municipios/{codigoIbge}.


💰 Dados Financeiros

AwesomeAPI — Câmbio

URL: https://economia.awesomeapi.com.br/last/{pares}
Auth: Nenhuma
Limite: Não documentado
Países: 🌍 Global

Cotações em tempo real de moedas (USD-BRL, EUR-BRL, GBP-BRL), criptomoedas (BTC-BRL, ETH-BRL) e ações (PETR4, VALE3). Oferece histórico via /daily/{par}/{dias}.

Vantagens: zero configuração, cobre centenas de pares, atualiza a cada poucos minutos.
Limitações: sem SLA declarado — não use como fonte única em sistemas de pagamento críticos. Cache de 5–10 min é o mínimo.

BrasilAPI — Taxas e Índices

URL: https://brasilapi.com.br/api/taxas/v1
Auth: Nenhuma
Limite: Não documentado
Países: 🇧🇷 Brasil

Retorna SELIC, CDI, CDB, poupança e outros indicadores financeiros. Útil em simuladores de investimento, cálculos de correção monetária e dashboards financeiros.

BACEN — PTAX

URL: https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/
Auth: Nenhuma
Limite: Não documentado
Países: 🇧🇷 Brasil

Cotações oficiais de câmbio do Banco Central do Brasil. A PTAX é a taxa de referência usada em contratos financeiros, liquidações e correções monetárias — mais confiável que fontes comerciais para fins legais ou contratuais.

Endpoints mais usados:

  • GET /CotacaoDolarDia(dataCotacao=@d)?@d='MM-DD-YYYY' — dólar do dia (compra e venda)
  • GET /CotacaoMoedaDia(moeda=@m,dataCotacao=@d)?@m='EUR'&@d='MM-DD-YYYY' — outras moedas

Vantagens: fonte oficial do governo federal, gratuita, sem autenticação.
Limitações: dados disponíveis apenas nos dias úteis bancários; a API usa OData, o que pode ser verboso para usos simples.


₿ Criptomoedas

CoinGecko

URL: https://api.coingecko.com/api/v3/
Auth: Nenhuma (demo) / API key gratuita
Limite: 30 req/min
Países: 🌍 Global

A maior API gratuita de dados de mercado de criptomoedas: preços em tempo real, histórico OHLCV, market cap, volume e metadados de mais de 10.000 tokens. Não cobre dados on-chain (saldo de carteiras, transações ou exploração de blocos) — para isso, use Etherscan ou Blockchain.com abaixo.

Endpoints mais usados:

  • GET /simple/price?ids=bitcoin,ethereum&vs_currencies=brl,usd — cotação atual de múltiplos tokens
  • GET /coins/{id}/market_chart?vs_currency=brl&days=30 — histórico de preços
  • GET /coins/markets?vs_currency=usd&order=market_cap_desc — ranking por market cap

Vantagens: cobertura abrangente de mercado, sem cadastro para uso básico, documentação excelente.
Limitações: 30 req/min sem API key — cache obrigatório. Para volumes de produção maiores, considere o plano pago.

Etherscan

URL: https://api.etherscan.io/v2/api?chainid=1
Auth: API key gratuita
Limite: 5 req/seg / 100.000 req/dia
Países: 🌍 Global (Ethereum e compatíveis)

O maior explorador da rede Ethereum. Permite consultar saldo de carteiras, histórico de transações, transferências de tokens ERC-20/ERC-721, contratos verificados e dados de blocos — tudo via API REST. O parâmetro chainid permite usar o mesmo API key em múltiplas redes: Ethereum (1), Polygon (137), BNB Chain (56) e dezenas de outras redes EVM compatíveis.

Endpoints mais usados:

  • GET ?chainid=1&module=account&action=balance&address={address} — saldo ETH de uma carteira
  • GET ?chainid=1&module=account&action=tokentx&address={address} — transferências de tokens ERC-20
  • GET ?chainid=1&module=block&action=getblocknobytime&timestamp={ts} — bloco mais próximo de um timestamp

Vantagens: documentação extensa, dados on-chain em tempo real, gratuito para uso básico, um único API key cobre múltiplas redes EVM.
Limitações: requer cadastro para obter API key; limites do plano gratuito podem ser insuficientes para consultas em lote.

Blockchain.com — Simple API

URL: https://blockchain.info/
Auth: Nenhuma
Limite: Não documentado
Países: 🌍 Global (Bitcoin)

API pública para dados on-chain do Bitcoin. Sem chave, sem cadastro — acesso direto ao saldo de carteiras e histórico de transações.

Endpoints mais usados:

  • GET /balance?active={address} — saldo BTC de uma ou mais carteiras
  • GET /rawaddr/{address} — histórico completo de transações de um endereço
  • GET /latestblock — bloco mais recente confirmado

Vantagens: zero configuração, dados básicos de Bitcoin sem depender de provedor externo.
Limitações: exclusivo para Bitcoin; sem limite documentado, mas suscetível a throttling em volume alto — cache obrigatório.


🏢 CNPJ e Empresas

BrasilAPI — CNPJ

URL: https://brasilapi.com.br/api/cnpj/v1/{cnpj}
Auth: Nenhuma
Limite: Não documentado
Países: 🇧🇷 Brasil

Dados cadastrais via Receita Federal: razão social, nome fantasia, CNAEs, situação cadastral, porte, endereço e quadro societário.

Vantagens: dados oficiais sem necessidade de certificado digital ou convênio.
Limitações: dados refletem a última sincronização com a Receita — pode haver defasagem de horas.


🌤 Clima

Open-Meteo

URL: https://api.open-meteo.com/v1/forecast
Auth: Nenhuma
Limite: 10.000 req/dia
Países: 🌍 Global

Previsão meteorológica de código aberto com dados de múltiplos modelos climáticos (ECMWF, GFS, DWD). Cobre previsão horária, diária e dados históricos desde 1940.

Vantagens: sem auth, cobertura global, documentação excelente, 80+ anos de dados históricos.
Limitações: 10k req/dia — cache de no mínimo 15 minutos é obrigatório.


🌐 Geolocalização por IP

ipapi.co

URL: https://ipapi.co/{ip}/json/
Auth: Nenhuma
Limite: 1.000 req/dia
Países: 🌍 Global

Retorna cidade, país, região, timezone, latitude/longitude, organização (ASN) e moeda local. Omitir {ip} usa o IP do solicitante automaticamente — útil para detectar o país do usuário sem login.

Vantagens: dados ricos (ASN, moeda, timezone), HTTPS gratuito.
Limitações: 1k req/dia é pouco para produção com alto tráfego — cache por sessão ou por IP é essencial.

ip-api.com

URL: http://ip-api.com/json/{ip}
Auth: Nenhuma
Limite: 45 req/min
Países: 🌍 Global

Atenção: o plano gratuito é HTTP puro — não use em contextos que requeiram HTTPS. O plano pago habilita HTTPS e eleva o limite.


🌍 Geocodificação e Dados Geográficos

Nominatim — OpenStreetMap

URL: https://nominatim.openstreetmap.org/
Auth: Nenhuma
Limite: 1 req/seg (máximo absoluto por política da OpenStreetMap Foundation)
Países: 🌍 Global

Geocodificação e geocodificação reversa baseada nos dados do OpenStreetMap. Converte endereços em coordenadas geográficas e vice-versa — sem custo e sem registro.

Endpoints mais usados:

  • GET /search?q={endereco}&format=json — endereço → coordenadas
  • GET /reverse?lat={lat}&lon={lon}&format=json — coordenadas → endereço completo

Vantagens: gratuito, sem auth, cobertura global, dados open source.
Limitações: o limite de 1 req/s é rígido e aplica-se a toda a aplicação (soma de todos os usuários). Não adequado para geocodificação em lote — para volumes maiores, considere auto-hospedar o Photon ou usar o Geoapify.

CountriesNow

URL: https://countriesnow.space/api/v0.1/
Auth: Nenhuma
Limite: Não documentado
Países: 🌍 Global (222 países)

Dados estruturados de 222 países e territórios: nome, capital, código ISO, discagem, fuso horário, população, moeda, idioma e bandeiras (SVG). API gratuita, sem registro, ativamente mantida.

Endpoints mais usados:

  • GET /countries — lista completa com ISO2, ISO3 e cidades (227 países)
  • GET /countries/flag/images — lista com URLs das bandeiras (SVG)
  • GET /countries/currency — lista com moeda e código ISO por país
  • POST /countries/capital — capital de um país específico (body: {"country":"Brazil"})

Vantagens: sem auth, cobertura global, inclui bandeiras e dados demográficos, JSON limpo.
Limitações: sem paginação nativa — retorna listas completas; mantenha cache local (TTL 24h+) para não repetir a chamada a cada request.


🔒 Segurança

Have I Been Pwned

URL: https://api.pwnedpasswords.com/range/{prefixo}
Auth: Nenhuma (senhas) / API key paga (e-mails)
Limite: Não documentado (retorna 429 em caso de abuso)
Países: 🌍 Global

Verifica se uma senha apareceu em vazamentos conhecidos usando k-anonymity: você envia apenas os 5 primeiros caracteres do hash SHA-1. O servidor retorna todos os hashes com aquele prefixo e a comparação é feita localmente — a senha nunca trafega pela rede.

Vantagens: privacidade by design, banco com bilhões de senhas, totalmente gratuito para senhas.
Limitações: verificar e-mails comprometidos exige API key paga ($3,50/mês).

VirusTotal

URL: https://www.virustotal.com/api/v3/
Auth: API key gratuita
Limite: 4 req/min / 500 req/dia
Países: 🌍 Global

Analisa URLs, arquivos, domínios e IPs contra 70+ engines antivírus. Útil para validar links enviados por usuários ou inspecionar arquivos recebidos via upload antes de processá-los.

Hudson Rock — Cavalier

URL: https://cavalier.hudsonrock.com/api/json/v2/osint-tools/
Auth: Nenhuma
Limite: Não documentado
Países: 🌍 Global

Inteligência de cibercrime com foco em malware do tipo infostealer. Diferente do HIBP — que indexa dados de breaches e dumps públicos —, o Cavalier cobre credenciais roubadas diretamente dos dispositivos das vítimas por malware como RedLine, Raccoon e Vidar.

Endpoints públicos:

  • GET /search-by-email?email={email} — verifica se um e-mail aparece em logs de infostealer
  • GET /search-by-domain?domain={domain} — identifica funcionários e sistemas comprometidos de um domínio

Vantagens: cobre um vetor de ataque distinto do HIBP; sem autenticação nos endpoints básicos.
Limitações: domínios genéricos de grande porte (ex: google.com) podem retornar 400; rate limit não documentado.


📅 Feriados

Nager.Date

URL: https://date.nager.at/api/v3/PublicHolidays/{ano}/{pais}
Auth: Nenhuma
Limite: Não documentado
Países: 🌍 100+ países

Feriados públicos nacionais e regionais em 100+ países. Essencial para cálculos de dias úteis, SLAs e agendamento. Suporta BR, US, DE, PT, ES e dezenas de outros códigos ISO 3166-1.


🧪 Dev e Prototipagem

JSONPlaceholder

URL: https://jsonplaceholder.typicode.com/
Auth: Nenhuma
Limite: Sem limite declarado
Países: 🌍 Global

API fake completa: posts, users, todos, photos, albums, comments. Suporta todos os verbos HTTP (PUT/PATCH/DELETE simulam sem persistir). Ideal para testar pipelines de HttpClient ou gerar dados de exemplo em demos sem subir infraestrutura.

PokeAPI

URL: https://pokeapi.co/api/v2/
Auth: Nenhuma
Limite: 100 req/min
Países: 🌍 Global

Catálogo completo do universo Pokémon. Tem uma das melhores documentações de API REST disponíveis — excelente para praticar paginação com limit/offset, cache e relacionamentos em APIs RESTful.


⚙️ Integrando de Forma Resiliente

O padrão de produção é sempre o mesmo: HttpClient tipado ou Refit para o cliente HTTP, Polly para resiliência e cache por TTL para reduzir latência e respeitar rate limits. O que muda é só o endpoint.

HttpClient Tipado

IHttpClientFactory resolve dois problemas clássicos do new HttpClient() direto: vazamento de sockets — o HttpClient deve ser reutilizado entre requisições, nunca instanciado por chamada — e DNS stale — sem factory, o DNS resolvido fica preso no socket indefinidamente. O cliente tipado encapsula o HttpClient em uma classe de serviço específica; você injeta a classe, não o HttpClient diretamente.

Quando usar: projetos com poucos endpoints externos, ou quando você quer controle total sobre serialização e tratamento de erros sem adicionar dependências externas.

// O HttpClient é injetado já configurado pelo IHttpClientFactory
public class ViaCepClient(HttpClient httpClient)
{
    public Task<ViaCepResponse?> GetAddressAsync(string postalCode)
    {
        // Remove caracteres não-numéricos antes de montar a URL
        var digits = new string(postalCode.Where(char.IsDigit).ToArray());
        return httpClient.GetFromJsonAsync<ViaCepResponse>($"/ws/{digits}/json/");
    }
}

// Program.cs — registra o cliente tipado com a URL base centralizada
builder.Services.AddHttpClient<ViaCepClient>(client =>
    client.BaseAddress = new Uri("https://viacep.com.br"));

Refit

Refit gera a implementação do cliente HTTP a partir de uma interface anotada com atributos de rota. Você descreve o contrato da API como interface — Refit cria a classe concreta em tempo de execução via source generators. A interface serve também como documentação viva do contrato.

Quando usar em vez do HttpClient tipado: quando a API tem muitos endpoints ou você quer eliminar o boilerplate de serialização e construção de URL. Desvantagem: é uma dependência externa e tem menor flexibilidade para cenários muito customizados (streaming de respostas grandes, uploads multipart complexos).

// dotnet add package Refit.HttpClientFactory

// A interface declara os endpoints — Refit gera a implementação em tempo de execução
public interface IViaCepApi
{
    [Get("/ws/{cep}/json/")]
    Task<ViaCepResponse> GetAddressAsync(string cep);
}

// Program.cs — Refit e Polly se encadeiam na mesma pipeline de HttpClient
builder.Services.AddRefitClient<IViaCepApi>()
    .ConfigureHttpClient(client =>
        client.BaseAddress = new Uri("https://viacep.com.br"));

Refit e Polly se integram na mesma chain: AddRefitClient<T>().ConfigureHttpClient(...).AddResilienceHandler(...).

Cache

Cache armazena localmente a resposta de chamadas externas por um período determinado (TTL — Time to Live), evitando requisições repetidas. Além de reduzir latência, protege contra rate limits e isola sua aplicação de instabilidades momentâneas da dependência externa.

IMemoryCache — armazena em memória do próprio processo. Simples e sem latência adicional. Limitação crítica: não compartilhado entre instâncias. Em ambientes com escala horizontal (múltiplos pods/containers), cada instância mantém seu próprio cache isolado — inconsistências são inevitáveis e o benefício do cache se perde em parte.

IDistributedCache com Redis — cache externo compartilhado entre todas as instâncias. Obrigatório quando a aplicação escala horizontalmente. Adiciona latência de rede (~1ms em LAN), mas garante consistência e permite que o cache sobreviva a reinicializações do pod.

// Program.cs
builder.Services.AddMemoryCache();

// No serviço:
public async Task<ExchangeRate?> GetRateAsync(string pair)
{
    var cacheKey = $"rate:{pair.ToUpper()}";

    // Retorna imediatamente se o valor já estiver em cache
    if (_cache.TryGetValue(cacheKey, out ExchangeRate? cached))
        return cached;

    var result = await _api.GetRateAsync(pair);

    if (result is not null)
        _cache.Set(cacheKey, result, new MemoryCacheEntryOptions
        {
            // Garante expiração máxima absoluta independente de uso
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5),
            // Renova o TTL a cada leitura — expira só se ficar inativo
            SlidingExpiration = TimeSpan.FromMinutes(2),
        });

    return result;
}

Resiliência com Polly

Polly é a biblioteca de resiliência para .NET. Implementa padrões de estabilidade — retry, circuit breaker, timeout e bulkhead — que protegem sua aplicação quando dependências externas falham ou ficam lentas. No .NET 8+, o Polly v8 é integrado diretamente via Microsoft.Extensions.Http.Resilience, sem necessidade de pipeline manual.

Retry tenta novamente automaticamente em falhas transitórias (timeouts de rede, 503 momentâneos). Circuit Breaker para de tentar quando a dependência está claramente indisponível — evita que uma API lenta derrube sua aplicação e dá tempo para o serviço externo se recuperar. A ordem das estratégias é crítica: de dentro para fora, cada camada envolve a anterior.

builder.Services.AddHttpClient<ViaCepClient>(client =>
        client.BaseAddress = new Uri("https://viacep.com.br"))
    .AddResilienceHandler("viacep-pipeline", pipeline =>
    {
        // Timeout aplicado individualmente a cada tentativa
        pipeline.AddTimeout(TimeSpan.FromSeconds(4));

        pipeline.AddRetry(new HttpRetryStrategyOptions
        {
            // Número máximo de novas tentativas após a falha inicial
            MaxRetryAttempts = 3,
            // Delay base antes da primeira nova tentativa
            Delay = TimeSpan.FromMilliseconds(500),
            // Exponencial: cada tentativa dobra o delay anterior (500ms → 1s → 2s)
            BackoffType = DelayBackoffType.Exponential,
            // Variação aleatória no delay para evitar pico simultâneo de requisições
            UseJitter = true,
            // Aciona retry em exceções de rede ou respostas 5xx
            ShouldHandle = args => ValueTask.FromResult(
                args.Outcome.Exception is not null ||
                args.Outcome.Result?.StatusCode >= HttpStatusCode.InternalServerError),
        });

        pipeline.AddCircuitBreaker(new HttpCircuitBreakerStrategyOptions
        {
            // Janela de tempo usada para calcular a taxa de falhas
            SamplingDuration = TimeSpan.FromSeconds(30),
            // Mínimo de requisições na janela antes de avaliar o circuito
            MinimumThroughput = 5,
            // Abre o circuito se 50% ou mais das requisições falharem
            FailureRatio = 0.5,
            // Tempo que o circuito fica aberto antes de tentar se recuperar
            BreakDuration = TimeSpan.FromSeconds(15),
        });
    });

A ordem das estratégias importa: timeout → retry → circuit breaker, de dentro para fora.

Referências Oficiais