Como criar uma API pública para desenvolvedores no seu servidor de MU Online
Projete e publique uma API REST pública para o seu servidor de MU Online, com autenticação por chave, limites de requisição, endpoints de ranking e personagem, e documentação para desenvolvedores da comunidade.
Uma API pública transforma o seu servidor de MU Online em uma plataforma: sites de ranking de terceiros, bots de Discord, aplicativos de estatísticas e ferramentas da própria comunidade passam a consumir dados do seu jogo sem precisar mexer no banco de dados ou pedir acesso especial. Isso aumenta o
Uma API pública transforma o seu servidor de MU Online em uma plataforma: sites de ranking de terceiros, bots de Discord, aplicativos de estatísticas e ferramentas da própria comunidade passam a consumir dados do seu jogo sem precisar mexer no banco de dados ou pedir acesso especial. Isso aumenta o engajamento, gera conteúdo gratuito (rankings embutidos em outros sites, alertas de eventos no Discord) e profissionaliza a imagem do projeto. Mas uma API mal projetada vira porta de entrada para scraping abusivo, vazamento de dados sensíveis e sobrecarga do banco. Este tutorial cobre o desenho completo: arquitetura, autenticação, endpoints, limites de uso e documentação.
Por que oferecer uma API pública
Servidores de MU Online que expõem dados via API tendem a reter comunidade por mais tempo, porque terceiros passam a construir em cima do seu ecossistema: um bot de Discord que avisa quando um boss vai nascer, um site de estatísticas de guild, uma extensão de navegador que mostra o ranking PK. Cada uma dessas integrações é divulgação gratuita e reduz a carga de suporte, já que os jogadores param de perguntar "quantos pontos eu tenho" no chat e passam a checar num painel externo.
Arquitetura recomendada
A API nunca deve tocar diretamente no banco de produção do GameServer. O padrão mais seguro é:
- Banco read-only replicado ou uma view/tabela de cache atualizada periodicamente (a cada 1-5 minutos).
- Backend intermediário (Node.js/Express, PHP/Laravel ou Go) que consulta esse banco e serializa em JSON.
- Camada de cache (Redis ou cache em memória) para respostas de ranking, que mudam pouco.
- Gateway/reverse proxy (Nginx) na frente, cuidando de TLS, rate limiting básico e logs.
Essa separação garante que uma consulta pesada de um terceiro não trave o banco que o GameServer usa para autenticar login.
Autenticação por chave de API
Cada desenvolvedor que quiser consumir a API deve se cadastrar e receber uma API key única. O fluxo 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 requisição deve enviar a chave no header Authorization: Bearer <api_key>. O backend valida a chave, verifica se está ativa e aplica o limite do tier correspondente antes de processar a consulta.
Endpoints essenciais para começar
| Endpoint | Método | Retorna |
|---|---|---|
/api/v1/ranking/reset | GET | Top jogadores por reset, com nome, classe e guild |
/api/v1/ranking/guild | GET | Ranking de guilds por pontuação/território |
/api/v1/character/:name | GET | Dados públicos de um personagem (nível, classe, guild) |
/api/v1/events/status | GET | Status atual de eventos (Blood Castle, Devil Square, boss) |
/api/v1/server/status | GET | Online/offline, quantidade de jogadores conectados |
Comece com esses cinco. Eles cobrem os casos de uso mais pedidos pela comunidade (bots de Discord e sites de ranking) sem expor nada sensível.
Rate limiting e proteção contra abuso
Sem limite de requisições, um único script mal configurado pode gerar milhares de chamadas por minuto e derrubar seu backend. Configure limites por chave e 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;
}
Combine isso com um limite lógico na aplicação (contador em Redis por chave), pois o Nginx sozinho não distingue chaves inválidas de válidas de forma refinada.
Formato de resposta e tratamento de erros
Padronize todas as respostas em JSON com uma estrutura consistente, incluindo status e mensagens de erro claras:
{
"success": true,
"data": { "character": "DemonSlayer", "level": 400, "class": "Blade Master" },
"meta": { "cached_at": "2026-07-30T12:00:00Z" }
}
Em erro, devolva o código HTTP correto (400, 401, 404, 429, 500) e um corpo explicando o motivo. Isso evita que desenvolvedores terceiros gastem horas debugando um endpoint que só devolvia null.
CORS e uso em navegador
Se você espera que sites terceiros consumam a API diretamente do navegador (JavaScript no client-side), configure os headers de CORS para liberar apenas os domínios que fazem sentido, ou libere * apenas para endpoints públicos de leitura sem dados sensíveis. Nunca libere CORS irrestrito em endpoints autenticados que retornam dados de conta.
Documentação para desenvolvedores
Uma API sem documentação não é usada. Publique uma página /developers ou /api/docs no seu site com:
- Como solicitar uma API key (formulário ou Discord).
- Lista de endpoints, parâmetros e exemplos de resposta.
- Limites de uso por tier.
- Política de uso aceitável (o que pode e o que não pode ser feito com os dados).
Ferramentas como Swagger/OpenAPI geram essa documentação automaticamente a partir do código e permitem que o desenvolvedor teste os endpoints direto no navegador.
Monitoramento e logs de uso
Registre cada requisição (chave, endpoint, tempo de resposta, código HTTP) em uma tabela ou serviço de logs. Isso permite identificar quem está abusando do limite, quais endpoints são mais usados (para priorizar otimização) e detectar tentativas de acesso a rotas que não existem, um sinal comum de varredura maliciosa.
Versionamento e depreciação
Ao mudar o formato de um endpoint, nunca altere a versão em produção (/v1/) — lance /v2/ em paralelo e mantenha /v1/ funcionando por um período de transição anunciado (30-60 dias), avisando os desenvolvedores cadastrados por e-mail ou Discord antes de desativar a versão antiga.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Banco de produção lento após lançar a API | Consultas pesadas direto na tabela de personagens | Use réplica read-only ou cache com atualização periódica |
| Terceiros reclamando de respostas inconsistentes | Falta de versionamento da API | Adote prefixo /v1/ e nunca quebre uma versão publicada |
| Chave de API vazada sendo usada por terceiros | Chave sem escopo de IP ou domínio | Adicione validação de origem e permita revogar chaves individualmente |
| Picos de tráfego derrubando o backend | Ausência de rate limiting | Configure limit_req no Nginx e contador por chave no Redis |
| Dados sensíveis aparecendo na resposta | Endpoint espelhando colunas do banco sem filtro | Sempre serialize manualmente os campos permitidos, nunca faça SELECT * direto para JSON |
Checklist de lançamento da API
- Backend intermediário criado, sem acesso direto do público ao banco de produção.
- Sistema de API keys com tiers e limites implementado.
- Rate limiting configurado no proxy e na aplicação.
- Endpoints essenciais (ranking, personagem, eventos, status) publicados e testados.
- CORS configurado corretamente por endpoint.
- Documentação pública publicada em
/developersou/api/docs. - Logs de uso e monitoramento ativos.
- Plano de versionamento (
/v1/,/v2/) definido antes do lançamento.
Com a API pública no ar, o passo natural seguinte é revisar a segurança de toda a camada web do servidor, já que qualquer endpoint exposto amplia a superfície de ataque — veja o guia de auditoria de vulnerabilidades web para uma varredura completa antes de divulgar a API amplamente.
Perguntas frequentes
Preciso expor meu banco de dados diretamente para a API?
Não, e você nunca deve fazer isso. A API deve rodar como uma camada intermediária (backend próprio) que consulta o banco internamente e devolve apenas JSON tratado. Expor o banco diretamente é uma das causas mais comuns de vazamento de dados e ataques de SQL Injection em servidores de MU.
Como evito que bots sobrecarreguem minha API?
Implemente rate limiting por chave de API e por IP, com um limite razoável como 60 requisições por minuto para uso gratuito. Ferramentas como Redis com contadores de janela deslizante resolvem isso de forma simples e barata.
Vale a pena cobrar por acesso à API?
Para a maioria dos servidores privados não compensa cobrar diretamente, mas você pode oferecer planos: nível gratuito com limites baixos para a comunidade, e um nível maior para sites parceiros ou apps de terceiros, sujeito a aprovação manual.
Que dados NUNCA devo expor pela API pública?
Senhas (mesmo com hash), e-mails de jogadores, IPs, tokens de sessão e qualquer informação que permita identificar ou sequestrar uma conta. A API pública deve limitar-se a dados de jogo: rankings, guilds, itens equipados e estatísticas agregadas.
Preciso versionar a API desde o início?
Sim. Use um prefixo como /api/v1/ desde o primeiro endpoint publicado. Isso evita quebrar integrações de terceiros quando você precisar mudar o formato de resposta no futuro — basta lançar /api/v2/ em paralelo.