← Volver al blog
APIs .NET C# Backend Polly Integración

APIs Públicas y Gratuitas que Todo Dev Backend Debería Conocer

· 13 min de lectura

Integrar APIs externas es trabajo rutinario en el backend. El reto está en descubrir cuáles existen, qué ofrecen realmente de forma gratuita y cómo integrarlas de manera resiliente. Este artículo es un catálogo comentado — con limitaciones reales y consejos de producción.


🇧🇷 Direcciones y Localidades

ViaCEP

URL: https://viacep.com.br/ws/{cep}/json/
Auth: Ninguna
Límite: No documentado
Países: 🇧🇷 Brasil

Retorna dirección completa (calle, barrio, ciudad, estado) a partir de un código postal brasileño. También admite búsqueda inversa por nombre de calle + municipio + estado.

Ventajas: configuración cero, respuesta consistente, ampliamente adoptada.
Limitaciones: sin SLA público ni rate limit declarado — el caché agresivo es obligatorio.

BrasilAPI

URL: https://brasilapi.com.br/api/
Auth: Ninguna
Límite: No documentado
Países: 🇧🇷 Brasil

Un hub de datos públicos brasileños. Una sola dependencia, múltiples endpoints útiles:

  • GET /cep/v2/{cep} — código postal con múltiples fuentes, más robusto que ViaCEP
  • GET /banks/v1 — lista de bancos con códigos ISPB y COMPE
  • GET /cnpj/v1/{cnpj} — datos de registro completo de empresa
  • GET /ddd/v1/{ddd} — estado y ciudades por código de área
  • GET /feriados/v1/{año} — feriados nacionales por año
  • GET /taxas/v1 — SELIC, CDI, ahorro y otros índices financieros
  • GET /ibge/municipios/v1/{uf} — municipios por estado

Ventajas: API unificada para datos oficiales del gobierno, código abierto, bien mantenida por la comunidad.
Limitaciones: la disponibilidad depende de fuentes de terceros — el circuit breaker es obligatorio en producción.

IBGE — Localidades

URL: https://servicodados.ibge.gov.br/api/v1/localidades/
Auth: Ninguna
Límite: No documentado
Países: 🇧🇷 Brasil

Datos geográficos oficiales: estados, municipios, mesorregiones, microrregiones y distritos. Ideal para validar direcciones, llenar desplegables o generar informes regionales.

Endpoints más usados: /estados, /estados/{uf}/municipios, /municipios/{codigoIbge}.


💰 Datos Financieros

AwesomeAPI — Tipos de Cambio

URL: https://economia.awesomeapi.com.br/last/{pares}
Auth: Ninguna
Límite: No documentado
Países: 🌍 Global

Tipos de cambio en tiempo real para divisas (USD-BRL, EUR-BRL, GBP-BRL), criptomonedas (BTC-BRL, ETH-BRL) y acciones brasileñas (PETR4, VALE3). Ofrece historial vía /daily/{par}/{días}.

Ventajas: configuración cero, cubre cientos de pares, actualización cada pocos minutos.
Limitaciones: sin SLA declarado — no uses como única fuente en sistemas de pago críticos. Un caché de 5–10 min es el mínimo.

BrasilAPI — Tasas e Índices

URL: https://brasilapi.com.br/api/taxas/v1
Auth: Ninguna
Límite: No documentado
Países: 🇧🇷 Brasil

Retorna SELIC, CDI, CDB, tasa de ahorro y otros indicadores financieros. Útil en simuladores de inversión, corrección monetaria y dashboards financieros.

BACEN — PTAX

URL: https://olinda.bcb.gov.br/olinda/servico/PTAX/versao/v1/odata/
Auth: Ninguna
Límite: No documentado
Países: 🇧🇷 Brasil

Cotizaciones oficiales de tipo de cambio del Banco Central de Brasil. La PTAX es la tasa de referencia utilizada en contratos financieros, liquidaciones y correcciones monetarias — más confiable que fuentes comerciales para fines legales o contractuales.

Endpoint más usado: CotacaoDolarDia(dataCotacao=@dataCotacao)?@dataCotacao='MM-DD-YYYY'&$format=json — retorna la cotización oficial del dólar del día.

Ventajas: fuente oficial del Banco Central, sin autenticación.
Limitaciones: API OData con sintaxis particular; el formato de fecha es MM-DD-YYYY (distinto del estándar ISO).


₿ Criptomonedas

CoinGecko

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

La mayor API gratuita de datos de mercado de criptomonedas: precios en tiempo real, historial OHLCV, market cap, volumen y metadatos de más de 10.000 tokens. Importante: CoinGecko es solo datos de mercado — no permite consultar saldos de wallets ni explorar bloques on-chain.

Endpoints más usados:

  • GET /simple/price?ids=bitcoin,ethereum&vs_currencies=usd,brl — precio actual de múltiples tokens
  • GET /coins/{id}/market_chart?vs_currency=usd&days=30 — historial de precios
  • GET /coins/markets?vs_currency=usd&order=market_cap_desc — ranking por market cap

Ventajas: cobertura amplia, sin registro para uso básico, documentación excelente.
Limitaciones: 30 req/min sin API key — caché obligatorio. Para volúmenes mayores de producción, considera el plan de pago.

Etherscan

URL: https://api.etherscan.io/v2/api?chainid=1
Auth: API key gratuita
Límite: 5 req/seg, 100.000 req/día
Países: 🌍 Global (Multi-chain EVM)

Explorador de la blockchain de Ethereum. Consulta saldos de wallets, historial de transacciones, bloques y contratos inteligentes directamente on-chain. El parámetro chainid permite usar el mismo API key en múltiples redes: Ethereum (1), Polygon (137), BNB Chain (56) y decenas de otras redes EVM compatibles.

Endpoints más usados:

  • GET ?chainid=1&module=account&action=balance&address={wallet} — saldo ETH de una wallet
  • GET ?chainid=1&module=account&action=txlist&address={wallet} — historial de transacciones
  • GET ?chainid=1&module=block&action=getblocknobytime&timestamp={ts} — bloque más próximo a un timestamp

Ventajas: documentación extensa, datos on-chain en tiempo real, gratuito para uso básico, una sola API key cubre múltiples redes EVM.
Limitaciones: requiere registro para obtener API key; los límites del plan gratuito pueden ser insuficientes para consultas en lote.

Blockchain.com — Simple API

URL: https://blockchain.info/
Auth: Ninguna
Límite: No documentado
Países: 🌍 Global (Bitcoin)

API on-chain de Bitcoin. Sin autenticación para uso básico.

Endpoints más usados:

  • GET /balance?active={wallet} — saldo de una o más wallets BTC
  • GET /rawblock/{hash} — datos de un bloque
  • GET /rawtx/{hash} — detalles de una transacción

Ventajas: sin autenticación, cubre los casos de uso más comunes de Bitcoin.
Limitaciones: rate limit no documentado — caché obligatorio para evitar bloqueos.


🏢 CNPJ y Empresas

BrasilAPI — CNPJ

URL: https://brasilapi.com.br/api/cnpj/v1/{cnpj}
Auth: Ninguna
Límite: No documentado
Países: 🇧🇷 Brasil

Datos de registro completos vía Receita Federal: razón social, nombre comercial, CNAEs, situación fiscal, tamaño, dirección y lista de socios.

Ventajas: datos oficiales sin necesidad de certificado digital ni convenio especial.
Limitaciones: los datos reflejan la última sincronización con Receita Federal — puede haber un retraso de horas.


🌤 Clima

Open-Meteo

URL: https://api.open-meteo.com/v1/forecast
Auth: Ninguna
Límite: 10.000 req/día
Países: 🌍 Global

Pronóstico meteorológico de código abierto con datos de múltiples modelos climáticos (ECMWF, GFS, DWD). Cubre pronósticos horarios, diarios y datos históricos desde 1940.

Ventajas: sin autenticación, cobertura global, documentación excelente, 80+ años de datos históricos.
Limitaciones: 10k req/día — un caché mínimo de 15 minutos es obligatorio.


🌐 Geolocalización por IP

ipapi.co

URL: https://ipapi.co/{ip}/json/
Auth: Ninguna
Límite: 1.000 req/día
Países: 🌍 Global

Retorna ciudad, país, región, zona horaria, latitud/longitud, organización (ASN) y moneda local. Omitir {ip} usa automáticamente la IP del solicitante — útil para detectar el país del usuario sin login.

Ventajas: datos ricos (ASN, moneda, zona horaria), HTTPS gratuito.
Limitaciones: 1k req/día es bajo para producción con alto tráfico — caché por sesión o por IP es esencial.

ip-api.com

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

Atención: el plan gratuito es solo HTTP — no lo uses en contextos donde se requiera HTTPS. El plan de pago habilita HTTPS y eleva el límite.


🔒 Seguridad

Have I Been Pwned

URL: https://api.pwnedpasswords.com/range/{prefijo}
Auth: Ninguna (contraseñas) / API key de pago (emails)
Límite: No documentado (devuelve 429 ante abuso)
Países: 🌍 Global

Verifica si una contraseña apareció en filtraciones de datos conocidas mediante k-anonymity: envías solo los 5 primeros caracteres del hash SHA-1. El servidor devuelve todos los hashes con ese prefijo y la comparación se hace localmente — la contraseña nunca viaja por la red.

Ventajas: privacidad by design, base de datos con miles de millones de contraseñas filtradas, completamente gratuito para contraseñas.
Limitaciones: verificar emails comprometidos requiere API key de pago ($3,50/mes).

VirusTotal

URL: https://www.virustotal.com/api/v3/
Auth: API key gratuita
Límite: 4 req/min / 500 req/día
Países: 🌍 Global

Analiza URLs, archivos, dominios e IPs contra 70+ motores antivirus. Útil para validar enlaces enviados por usuarios o escanear archivos subidos antes de procesarlos.

Hudson Rock — Cavalier

URL: https://cavalier.hudsonrock.com/api/json/v2/osint-tools/
Auth: Ninguna
Límite: No documentado
Países: 🌍 Global

Inteligencia de cibercrimen enfocada en malware del tipo infostealer. A diferencia de HIBP — que indexa datos de brechas y dumps públicos —, Cavalier cubre credenciales robadas directamente de los dispositivos de las víctimas por malware como RedLine, Raccoon y Vidar.

Endpoints públicos:

  • GET /search-by-email?email={email} — verifica si un email aparece en logs de infostealer
  • GET /search-by-domain?domain={domain} — identifica empleados y sistemas comprometidos de un dominio

Ventajas: cubre un vector de ataque distinto al de HIBP; sin autenticación requerida.
Limitaciones: dominios genéricos de gran escala (ej: google.com) pueden retornar 400; rate limit no documentado.


🌍 Geocodificación y Datos Geográficos

Nominatim (OpenStreetMap)

URL: https://nominatim.openstreetmap.org/
Auth: Ninguna
Límite: 1 req/seg (política oficial de la OSM Foundation)
Países: 🌍 Global

Geocodificación y geocodificación inversa basadas en OpenStreetMap. Convierte direcciones en coordenadas y coordenadas en direcciones; retorna geometría, categoría del lugar y datos estructurados.

Endpoints más usados:

  • GET /search?q={dirección}&format=json — dirección → coordenadas
  • GET /reverse?lat={lat}&lon={lon}&format=json — coordenadas → dirección

Ventajas: sin registro, cobertura global, datos abiertos.
Limitaciones: 1 req/seg es un límite duro impuesto por la OSM Foundation — superar este límite resulta en bloqueo permanente de la IP. Para producción con volumen, implementa una cola con rate limiting y caché agresivo, o evalúa una instancia self-hosted.

CountriesNow

URL: https://countriesnow.space/api/v0.1/
Auth: Ninguna
Límite: No documentado
Países: 🌍 Global (222 países)

Datos estructurados de 222 países y territorios: nombre, capital, código ISO, código de discado, zona horaria, población, moneda, idioma y banderas (SVG). API gratuita, sin registro, activamente mantenida.

Endpoints más usados:

  • GET /countries — lista completa con ISO2, ISO3 y ciudades (227 países)
  • GET /countries/flag/images — lista con URLs de banderas (SVG)
  • GET /countries/currency — lista con moneda y código ISO por país
  • POST /countries/capital — capital de un país específico (body: {"country":"Brazil"})

Ventajas: sin autenticación, cobertura global, incluye banderas y datos demográficos, JSON limpio.
Limitaciones: sin paginación nativa — retorna listas completas; mantén caché local (TTL 24h+) para no repetir la llamada en cada request.


📅 Días Festivos

Nager.Date

URL: https://date.nager.at/api/v3/PublicHolidays/{año}/{pais}
Auth: Ninguna
Límite: No documentado
Países: 🌍 100+ países

Festivos públicos nacionales y regionales en 100+ países. Esencial para calcular días hábiles, SLAs y programación de tareas. Soporta BR, US, DE, PT, ES y decenas de otros códigos ISO 3166-1.


🧪 Dev y Prototipado

JSONPlaceholder

URL: https://jsonplaceholder.typicode.com/
Auth: Ninguna
Límite: Sin límite declarado
Países: 🌍 Global

API falsa completa: posts, users, todos, photos, albums, comments. Soporta todos los verbos HTTP — PUT/PATCH/DELETE simulan sin persistir. Ideal para probar pipelines de HttpClient o generar datos de muestra en demos sin levantar infraestructura.

PokeAPI

URL: https://pokeapi.co/api/v2/
Auth: Ninguna
Límite: 100 req/min
Países: 🌍 Global

Catálogo completo del universo Pokémon. Tiene una de las mejores documentaciones de API REST disponibles — excelente para practicar paginación con limit/offset, caché y relaciones en APIs RESTful.


⚙️ Integración Resiliente

El patrón de producción es siempre el mismo: HttpClient tipado o Refit para el cliente HTTP, Polly para resiliencia y caché por TTL para reducir latencia y respetar los rate limits. Solo cambia el endpoint.

HttpClient Tipado

IHttpClientFactory resuelve dos problemas clásicos del new HttpClient() directo: agotamiento de socketsHttpClient debe reutilizarse entre peticiones, nunca instanciarse por llamada — y DNS obsoleto — sin la factory, el DNS resuelto queda atrapado en el socket indefinidamente. El cliente tipado encapsula el HttpClient en una clase de servicio específica; inyectas la clase, no el HttpClient directamente.

Cuándo usar: proyectos con pocos endpoints externos, o cuando quieres control total sobre la serialización y el manejo de errores sin añadir dependencias externas.

// El HttpClient es inyectado ya configurado por IHttpClientFactory
public class ViaCepClient(HttpClient httpClient)
{
    public Task<ViaCepResponse?> GetAddressAsync(string postalCode)
    {
        // Elimina caracteres no numéricos antes de construir la URL
        var digits = new string(postalCode.Where(char.IsDigit).ToArray());
        return httpClient.GetFromJsonAsync<ViaCepResponse>($"/ws/{digits}/json/");
    }
}

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

Refit

Refit genera la implementación del cliente HTTP a partir de una interfaz anotada con atributos de ruta. Describes el contrato de la API como interfaz — Refit crea la clase concreta en tiempo de ejecución vía source generators. La interfaz también sirve como documentación viva del contrato.

Cuándo usar en vez del HttpClient tipado: cuando la API tiene muchos endpoints o quieres eliminar el boilerplate de serialización y construcción de URL. Desventajas: es una dependencia externa y tiene menos flexibilidad para escenarios muy personalizados (streaming de respuestas grandes, uploads multipart complejos).

// dotnet add package Refit.HttpClientFactory

// La interfaz declara los endpoints — Refit genera la implementación en tiempo de ejecución
public interface IViaCepApi
{
    [Get("/ws/{cep}/json/")]
    Task<ViaCepResponse> GetAddressAsync(string cep);
}

// Program.cs — Refit y Polly se encadenan en la misma pipeline de HttpClient
builder.Services.AddRefitClient<IViaCepApi>()
    .ConfigureHttpClient(client =>
        client.BaseAddress = new Uri("https://viacep.com.br"));

Refit y Polly se integran en la misma chain: AddRefitClient<T>().ConfigureHttpClient(...).AddResilienceHandler(...).

Caché

El caché almacena localmente las respuestas de llamadas externas durante un período determinado (TTL — Time to Live), evitando peticiones repetidas. Además de reducir la latencia, protege contra rate limits y aísla tu aplicación de inestabilidades momentáneas de la dependencia externa.

IMemoryCache — almacena en la memoria del propio proceso. Simple, sin latencia adicional. Limitación crítica: no se comparte entre instancias. En entornos con escala horizontal (múltiples pods/contenedores), cada instancia mantiene su propio caché aislado — las inconsistencias son inevitables y el beneficio del caché se pierde en parte.

IDistributedCache con Redis — caché externo compartido entre todas las instancias. Obligatorio cuando la aplicación escala horizontalmente. Añade latencia de red (~1ms en LAN), pero garantiza consistencia y permite que el caché sobreviva a reinicios del pod.

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

// En el servicio:
public async Task<ExchangeRate?> GetRateAsync(string pair)
{
    var cacheKey = $"rate:{pair.ToUpper()}";

    // Retorna inmediatamente si el valor ya está en caché
    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
        {
            // Expiración máxima absoluta, independiente del acceso
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5),
            // Renueva el TTL en cada lectura — expira solo si queda inactivo
            SlidingExpiration = TimeSpan.FromMinutes(2),
        });

    return result;
}

Resiliencia con Polly

Polly es la biblioteca de resiliencia para .NET. Implementa patrones de estabilidad — retry, circuit breaker, timeout y bulkhead — que protegen tu aplicación cuando las dependencias externas fallan o se vuelven lentas. En .NET 8+, Polly v8 se integra directamente vía Microsoft.Extensions.Http.Resilience, sin necesidad de configuración manual de pipeline.

Retry reintenta automáticamente en fallos transitorios (timeouts de red, 503 momentáneos). Circuit Breaker deja de intentarlo cuando la dependencia está claramente no disponible — evita que una API lenta derribe toda tu aplicación y da tiempo al servicio externo para recuperarse. El orden de las estrategias es crítico: de adentro hacia afuera, cada capa envuelve a la anterior.

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

        pipeline.AddRetry(new HttpRetryStrategyOptions
        {
            // Número máximo de reintentos tras el fallo inicial
            MaxRetryAttempts = 3,
            // Delay base antes del primer reintento
            Delay = TimeSpan.FromMilliseconds(500),
            // Exponencial: cada reintento duplica el delay anterior (500ms → 1s → 2s)
            BackoffType = DelayBackoffType.Exponential,
            // Variación aleatoria en el delay para evitar tormentas de reintentos simultáneos
            UseJitter = true,
            // Activa reintento en excepciones de red o respuestas 5xx
            ShouldHandle = args => ValueTask.FromResult(
                args.Outcome.Exception is not null ||
                args.Outcome.Result?.StatusCode >= HttpStatusCode.InternalServerError),
        });

        pipeline.AddCircuitBreaker(new HttpCircuitBreakerStrategyOptions
        {
            // Ventana de tiempo para calcular la tasa de fallos
            SamplingDuration = TimeSpan.FromSeconds(30),
            // Mínimo de peticiones en la ventana antes de evaluar el circuito
            MinimumThroughput = 5,
            // Abre el circuito si el 50% o más de las peticiones fallan
            FailureRatio = 0.5,
            // Tiempo que el circuito permanece abierto antes de intentar recuperarse
            BreakDuration = TimeSpan.FromSeconds(15),
        });
    });

El orden de las estrategias importa: timeout → retry → circuit breaker, de adentro hacia afuera.

Referencias Oficiales