API REST + SSE para cotizaciones de criptomonedas en tiempo real-ish (polling + broadcast), con:
- API Keys + planes (FREE/BUSINESS)
- Rate limit con headers “pro”
- Catálogo de symbols/fiats desde PostgreSQL
- SSE con token (para evitar headers en EventSource/curl)
- Hardening para /admin con doble header
- Java 17
- Spring Boot (WebMVC, Actuator)
- PostgreSQL (Railway)
- Flyway (migraciones)
- Prometheus metrics (opcional)
GET /v1/pingGET /v1/metaGET /v1/symbolsGET /v1/fiats
GET /v1/me(info del plan/límites del API key actual)GET /v1/price?symbol=BTC&fiat=USDGET /v1/prices?symbols=BTC,ETH,SOL&fiat=EURGET /v1/auth/sse-token(genera token para SSE)
GET /v1/stream/prices?token=...&symbols=BTC,ETH&fiat=USD
POST /admin/v1/keys(crear key)POST /admin/v1/keys/{apiKey}/revokePOST /admin/v1/keys/{apiKey}/planPOST /admin/v1/keys/{apiKey}/expires
Headers requeridos:
x-admin-secretx-master-admin
En respuestas protegidas vas a ver headers tipo:
X-Plan: FREE|BUSINESSX-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset(epoch seconds)X-RateLimit-UsedRetry-After(solo cuando pega 429)
- Java 17
- Maven
- PostgreSQL local (o cualquier Postgres)
Crea un archivo local.properties (NO se sube al repo) y agrégalo a .gitignore.
Ejemplo local.properties:
# DB (local)
spring.datasource.url=jdbc:postgresql://localhost:5432/cryptolink
spring.datasource.username=postgres
spring.datasource.password=postgres
# Admin (solo para ti)
cryptolink.admin.secret=CHANGE_ME_ADMIN
cryptolink.master.admin.key=CHANGE_ME_MASTER
# CoinGecko
cryptolink.coingecko.base-url=https://api.coingecko.com/api/v3
cryptolink.coingecko.timeout-ms=5000
# SSE
cryptolink.sse.keepalive-ms=25000
## Billing (Stripe)
CryptoLink usa **Stripe** para suscripciones mensuales y emite/actualiza el **API Key** automáticamente al confirmar el pago.
### Planes
- **FREE**: 60 req/min, 1 SSE connection, maxSymbols=3
- **BUSINESS**: 600 req/min, 5 SSE connections, maxSymbols=20
- **PRO**: 1200 req/min, 10 SSE connections, maxSymbols=25
> Puedes ver tu plan y límites actuales en:
`GET /v1/me` (requiere `x-api-key`)
---
## Opción A: Comprar con Stripe Payment Links (rápido)
- PRO: <https://buy.stripe.com/test_aFabJ1cd251ofD87AR3F601>
- BUSINESS: <https://buy.stripe.com/test_3cI7sLcd2ctQ0Ie5sJ3F600>
Después del pago, recibirás tu **API Key** por correo (y también podrás verla con `/v1/me` si ya la tienes).
---
## Opción B: Checkout desde la API (recomendado para integración)
### 1) Crear sesión de Checkout
(El backend crea la sesión y te regresa un `url` de Stripe Checkout)
**Ejemplo: BUSINESS**
```bash
curl -s -X POST "https://cryptolink-production.up.railway.app/v1/billing/checkout?plan=BUSINESS" \
-H "Content-Type: application/json" \
-d '{"email":"tu_correo@dominio.com"}'
# CryptoLink (by evi_link.dev)
CryptoLink is a simple, production-ready crypto pricing API powered by CoinGecko.
It supports **multiple symbols**, **multiple fiats (USD/MXN/EUR)**, **SSE streaming**, **rate limits**, and **plans** (BUSINESS / PRO).
**Base URL (PROD):**
https://cryptolink-production.up.railway.app
---
## Features
- ✅ `/v1/prices` multi-quote endpoint
- ✅ `/v1/stream/prices` real-time streaming via **SSE**
- ✅ API keys + plans (FREE / BUSINESS / PRO)
- ✅ Rate limit headers (`X-RateLimit-*`)
- ✅ Max symbols per plan (enforced)
- ✅ Supported symbols/fiats from DB catalog
- ✅ Health endpoints via actuator
---
## Quick Start
### 1) Ping
```bash
curl -i https://cryptolink-production.up.railway.app/v1/ping