El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Web

Cómo crear una API pública para desarrolladores en tu servidor de MU Online

Diseña y publica una API REST pública para tu servidor de MU Online, con autenticación por clave, límites de solicitudes, endpoints de ranking y personaje, y documentación para desarrolladores de la comunidad.

RO Rodrigo · Actualizado el 9 abr 2019 · ⏱ 16 min de lectura
Respuesta rápida

Una API pública transforma tu servidor de MU Online en una plataforma: sitios de ranking de terceros, bots de Discord, aplicaciones de estadísticas y herramientas de la propia comunidad pasan a consumir datos de tu juego sin necesidad de tocar la base de datos ni pedir acceso especial. Esto aumenta

Una API pública transforma tu servidor de MU Online en una plataforma: sitios de ranking de terceros, bots de Discord, aplicaciones de estadísticas y herramientas de la propia comunidad pasan a consumir datos de tu juego sin necesidad de tocar la base de datos ni pedir acceso especial. Esto aumenta el engagement, genera contenido gratuito (rankings incrustados en otros sitios, alertas de eventos en Discord) y profesionaliza la imagen del proyecto. Pero una API mal diseñada se convierte en una puerta de entrada para el scraping abusivo, la filtración de datos sensibles y la sobrecarga de la base de datos. Este tutorial cubre el diseño completo: arquitectura, autenticación, endpoints, límites de uso y documentación.

Por qué ofrecer una API pública

Los servidores de MU Online que exponen datos vía API tienden a retener a la comunidad por más tiempo, porque terceros empiezan a construir sobre tu ecosistema: un bot de Discord que avisa cuando va a nacer un jefe, un sitio de estadísticas de guild, una extensión de navegador que muestra el ranking PK. Cada una de estas integraciones es difusión gratuita y reduce la carga de soporte, ya que los jugadores dejan de preguntar "cuántos puntos tengo" en el chat y pasan a consultarlo en un panel externo.

Arquitectura recomendada

La API nunca debe tocar directamente la base de datos de producción del GameServer. El patrón más seguro es:

  1. Base de datos de solo lectura replicada o una vista/tabla de caché actualizada periódicamente (cada 1-5 minutos).
  2. Backend intermedio (Node.js/Express, PHP/Laravel o Go) que consulta esa base de datos y serializa en JSON.
  3. Capa de caché (Redis o caché en memoria) para respuestas de ranking, que cambian poco.
  4. Gateway/reverse proxy (Nginx) al frente, encargándose de TLS, rate limiting básico y logs.

Esta separación garantiza que una consulta pesada de un tercero no bloquee la base de datos que usa el GameServer para autenticar el inicio de sesión.

Autenticación por clave de API

Cada desarrollador que quiera consumir la API debe registrarse y recibir una API key única. El flujo típico:

CREATE TABLE api_keys (
  id INT PRIMARY KEY AUTO_INCREMENT,
  developer_email VARCHAR(120) NOT NULL,
  api_key VARCHAR(64) UNIQUE NOT NULL,
  tier VARCHAR(20) DEFAULT 'free',
  requests_per_minute INT DEFAULT 60,
  active TINYINT DEFAULT 1,
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Toda solicitud debe enviar la clave en el header Authorization: Bearer <api_key>. El backend valida la clave, verifica si está activa y aplica el límite del tier correspondiente antes de procesar la consulta.

Endpoints esenciales para comenzar

EndpointMétodoDevuelve
/api/v1/ranking/resetGETTop jugadores por reset, con nombre, clase y guild
/api/v1/ranking/guildGETRanking de guilds por puntuación/territorio
/api/v1/character/:nameGETDatos públicos de un personaje (nivel, clase, guild)
/api/v1/events/statusGETEstado actual de eventos (Blood Castle, Devil Square, boss)
/api/v1/server/statusGETOnline/offline, cantidad de jugadores conectados

Comienza con estos cinco. Cubren los casos de uso más solicitados por la comunidad (bots de Discord y sitios de ranking) sin exponer nada sensible.

Rate limiting y protección contra el abuso

Sin límite de solicitudes, un solo script mal configurado puede generar miles de llamadas por minuto y tumbar tu backend. Configura límites por clave y por IP:

limit_req_zone $http_authorization zone=api_by_key:10m rate=60r/m;

location /api/ {
    limit_req zone=api_by_key burst=20 nodelay;
    proxy_pass http://api_backend;
}

Combina esto con un límite lógico en la aplicación (contador en Redis por clave), ya que Nginx por sí solo no distingue de forma refinada claves inválidas de válidas.

Formato de respuesta y manejo de errores

Estandariza todas las respuestas en JSON con una estructura consistente, incluyendo estado y mensajes de error claros:

{
  "success": true,
  "data": { "character": "DemonSlayer", "level": 400, "class": "Blade Master" },
  "meta": { "cached_at": "2026-07-30T12:00:00Z" }
}

En caso de error, devuelve el código HTTP correcto (400, 401, 404, 429, 500) y un cuerpo explicando el motivo. Esto evita que desarrolladores externos pierdan horas depurando un endpoint que solo devolvía null.

CORS y uso en el navegador

Si esperas que sitios de terceros consuman la API directamente desde el navegador (JavaScript del lado del cliente), configura los headers de CORS para habilitar solo los dominios que tengan sentido, o habilita * únicamente para endpoints públicos de lectura sin datos sensibles. Nunca habilites CORS irrestricto en endpoints autenticados que devuelven datos de cuenta.

Documentación para desarrolladores

Una API sin documentación no se usa. Publica una página /developers o /api/docs en tu sitio con:

  • Cómo solicitar una API key (formulario o Discord).
  • Lista de endpoints, parámetros y ejemplos de respuesta.
  • Límites de uso por tier.
  • Política de uso aceptable (qué se puede y qué no se puede hacer con los datos).

Herramientas como Swagger/OpenAPI generan esta documentación automáticamente a partir del código y permiten que el desarrollador pruebe los endpoints directamente en el navegador.

Monitoreo y registro de uso

Registra cada solicitud (clave, endpoint, tiempo de respuesta, código HTTP) en una tabla o servicio de logs. Esto permite identificar quién está abusando del límite, qué endpoints se usan más (para priorizar optimización) y detectar intentos de acceso a rutas que no existen, una señal común de escaneo malicioso.

Versionamiento y depreciación

Al cambiar el formato de un endpoint, nunca alteres la versión en producción (/v1/) — lanza /v2/ en paralelo y mantén /v1/ funcionando durante un período de transición anunciado (30-60 días), avisando a los desarrolladores registrados por correo o Discord antes de desactivar la versión anterior.

Errores comunes y soluciones

SíntomaCausa probableSolución
Base de datos de producción lenta tras lanzar la APIConsultas pesadas directas a la tabla de personajesUsa réplica de solo lectura o caché con actualización periódica
Terceros quejándose de respuestas inconsistentesFalta de versionamiento de la APIAdopta el prefijo /v1/ y nunca rompas una versión publicada
Clave de API filtrada siendo usada por tercerosClave sin alcance de IP o dominioAgrega validación de origen y permite revocar claves individuales
Picos de tráfico tumbando el backendAusencia de rate limitingConfigura limit_req en Nginx y contador por clave en Redis
Datos sensibles apareciendo en la respuestaEndpoint reflejando columnas de la base de datos sin filtroSerializa siempre manualmente los campos permitidos, nunca hagas SELECT * directo a JSON

Lista de verificación de lanzamiento de la API

  • Backend intermedio creado, sin acceso directo del público a la base de datos de producción.
  • Sistema de API keys con tiers y límites implementado.
  • Rate limiting configurado en el proxy y en la aplicación.
  • Endpoints esenciales (ranking, personaje, eventos, estado) publicados y probados.
  • CORS configurado correctamente por endpoint.
  • Documentación pública publicada en /developers o /api/docs.
  • Logs de uso y monitoreo activos.
  • Plan de versionamiento (/v1/, /v2/) definido antes del lanzamiento.

Con la API pública en marcha, el paso natural siguiente es revisar la seguridad de toda la capa web del servidor, ya que cualquier endpoint expuesto amplía la superficie de ataque — consulta la guía de auditoría de vulnerabilidades web para hacer un escaneo completo antes de difundir la API ampliamente.

Preguntas frecuentes

¿Necesito exponer mi base de datos directamente para la API?

No, y nunca deberías hacerlo. La API debe funcionar como una capa intermedia (backend propio) que consulta la base de datos internamente y devuelve solo JSON procesado. Exponer la base de datos directamente es una de las causas más comunes de filtración de datos y ataques de SQL Injection en servidores de MU.

¿Cómo evito que los bots sobrecarguen mi API?

Implementa rate limiting por clave de API y por IP, con un límite razonable como 60 solicitudes por minuto para uso gratuito. Herramientas como Redis con contadores de ventana deslizante resuelven esto de forma simple y económica.

¿Vale la pena cobrar por el acceso a la API?

Para la mayoría de los servidores privados no conviene cobrar directamente, pero puedes ofrecer planes: un nivel gratuito con límites bajos para la comunidad, y un nivel superior para sitios socios o apps de terceros, sujeto a aprobación manual.

¿Qué datos NUNCA debo exponer por la API pública?

Contraseñas (incluso con hash), correos de jugadores, IPs, tokens de sesión y cualquier información que permita identificar o secuestrar una cuenta. La API pública debe limitarse a datos de juego: rankings, guilds, ítems equipados y estadísticas agregadas.

¿Necesito versionar la API desde el inicio?

Sí. Usa un prefijo como /api/v1/ desde el primer endpoint publicado. Esto evita romper integraciones de terceros cuando necesites cambiar el formato de respuesta en el futuro — basta con lanzar /api/v2/ en paralelo.

RO
Fundador y editor jefe

Rodrigo mantiene ViciadosMU desde los inicios del portal. Especialista en creación y administración de servidores de MU Online, historia del juego y la evolución de las seasons — escribió buena parte del archivo antes de 2024.

Sigue leyendo

Artículos relacionados