pnclFEED Clave gratuita

Notas de quickstart

Una página de cuotas mínima con el servidor nativo de Node

Los navegadores no pueden llamar a la API de cuotas sin mostrar tu clave. Un servidor Node de treinta líneas obtiene el tablero, lo cachea y sirve una tabla.

Quieres una página web que muestre cuotas actuales, y el primer instinto es llamar desde el navegador. Eso filtra tu clave a cada visitante, así que la página tiene que construirse en el servidor. La versión más pequeña de ese servidor son unas treinta líneas de Node sin nada que instalar: obtén el tablero, renderiza una tabla, guarda la respuesta en caché un minuto.

La forma de esto

El navegador habla con tu servidor; tu servidor habla con la API. La clave queda en el entorno del servidor, enviada en el encabezado x-portal-apikey, exactamente como lo hace el bucle de sondeo del quickstart de Node, verificado el 2026-10-26. La página que vuelve al visitante contiene solo cuotas.

Node 18 en adelante incluye fetch y un servidor HTTP propio, así que todo cabe en un archivo:

import http from "node:http";

const HOST = process.env.ODDS_BASE_URL;
const KEY = process.env.ODDS_API_KEY;
let cache = { at: 0, rows: [] };

async function board() {
  if (Date.now() - cache.at < 60_000) return cache.rows;
  const url = HOST + "/kit/v1/markets?event_type=prematch&sport_id=1";
  const r = await fetch(url, { headers: { "x-portal-apikey": KEY } });
  if (!r.ok) return cache.rows; // sirve la última respuesta buena
  const data = await r.json();
  cache = {
    at: Date.now(),
    rows: data.events.map((ev) => {
      const ml = (ev.periods?.num_0 || {}).money_line || {};
      return `<tr><td>${ev.home} v ${ev.away}</td>` +
        `<td>${ml.home ?? ""}</td><td>${ml.draw ?? ""}</td>` +
        `<td>${ml.away ?? ""}</td></tr>`;
    }),
  };
  return cache.rows;
}

http.createServer(async (req, res) => {
  const rows = await board();
  res.setHeader("content-type", "text/html; charset=utf-8");
  res.end(`<table>${rows.join("")}</table>`);
}).listen(8080);

Ejecútalo con las dos variables de entorno exportadas, y el puerto 8080 responde con una tabla del tablero de prepartido de fútbol.

La caché es la cuota

Cada vista de página que llegara a la API gastaría tu permiso. Una llamada por minuto son 1.440 llamadas al día, y el presupuesto diario de la clave gratuita es mucho menor que eso, como las notas del quickstart dejan claro, verificado el 2026-10-26. La caché de un minuto delante del fetch es lo que hace viable la página: cien visitantes en un minuto cuestan una llamada.

La misma caché sirve como modo de fallo. Cuando la API responde un error, el servidor devuelve el último tablero bueno en lugar de una página en blanco, y las marcas de tiempo en tus registros dicen qué tan viejo quedó.

Lo que la página nunca debe contener

El HTML que sirves es público por definición. Las cuotas pertenecen a él. La clave, la URL base con credenciales incrustadas y el estado de tu cursor, no. Si algún día haces ver código fuente en la página y ves algo más que la tabla, la frontera se rompió.

Esto también resuelve la cuestión de la actualización: la página recarga, el servidor sirve la caché, y el horario del poller sigue siendo el único reloj que gasta cuota.

Dónde se detiene este diseño

Un proceso, un deporte, una tabla, un minuto de desfase. Eso cubre una página de estado, un panel de casa, una mirada rápida en el móvil. Cuando la página necesita reaccionar en segundos en lugar de minutos, el trabajo sube corriente arriba: sondea más rápido o lee el stream de caídas en el servidor, y deja que la página siga exactamente así de simple. El quickstart de Node es donde ese bucle empieza.

Un servidor de treinta líneas no es un producto. Es la respuesta honesta más pequeña a la pregunta que todo proyecto web hace primero: cómo muestro estas cuotas sin mostrar mi clave.