Latinos GG · Integración Minecraft ↔ Economía

API Minecraft — contrato v1

Rutas, autenticación y ejemplos de datos para el plugin de Minecraft: vinculación de cuentas y reporte de actividad. Con esto el plugin puede avanzar mientras implementamos nuestro lado.

Borrador · 21/10/2026 Plugin: Alessandro API y bot: Spark

Cómo funciona

El plugin solo informa: quién se vincula y quién está conectado y activo. El bot de economía es el que paga, en su ciclo de voice de cada minuto, a quien esté a la vez en Minecraft y en voice. La cantidad, cada cuánto se paga y el tope diario se configuran desde el panel web (apartado Minecraft).

Como el plugin nunca dispara pagos, reenviar un reporte o reintentar una petición no puede pagar dos veces.

1 reporte por minutoCada servidor manda su lista completa de jugadores cada 60 s.
Caduca a los 3 minSi un servidor deja de reportar, sus jugadores dejan de contar (configurable en el panel).
1 clave por servidorCada servidor (lobby, skyblock…) tiene su propia clave; la clave identifica al servidor.
Pago aparteEl intervalo de pago no depende del de reporte; lo configuramos en el panel.

Autenticación y URL base

EntornoURL base
Producciónhttps://api.latinos.gg/api (a confirmar)
PruebasTe la pasamos junto con la clave de pruebas.

Todas las peticiones del plugin llevan estas cabeceras:

Cabeceras
X-Minecraft-Key: mc_k7Hq2…(clave del servidor)
Content-Type: application/json
User-Agent: LatinosMC-Plugin/1.0

Flujo de vinculación

  1. El jugador, ya con la sesión iniciada (premium, o no premium tras poner su contraseña), escribe /vincular en el juego.
  2. El plugin llama a POST /minecraft/link-codes y le muestra el código (por ejemplo K7P2QX), que dura 10 minutos.
  3. El jugador lo confirma en Discord con /minecraft vincular código:K7P2QX, o en su perfil de la web.
  4. Desde ese momento su UUID aparece en linked en la respuesta de /minecraft/activity. El plugin puede avisarle «Cuenta vinculada» cuando lo detecte.
sequenceDiagram
  participant J as Jugador
  participant P as Plugin
  participant A as API Latinos
  participant B as Bot (Discord)
  J->>P: /vincular
  P->>A: POST /minecraft/link-codes {uuid, name}
  A-->>P: 201 {code: "K7P2QX", expiresAt}
  P-->>J: "Tu código es K7P2QX"
  J->>B: /minecraft vincular código:K7P2QX
  B->>A: confirma el código (ruta interna)
  A-->>B: vinculado
  P->>A: POST /minecraft/activity (cada 60 s)
  A-->>P: 200 {linked: [uuid, …]}
  P-->>J: "Cuenta vinculada"

Regla: una cuenta de Minecraft por usuario de Discord y un usuario por UUID. Para cambiar de cuenta, primero se desvincula desde Discord o la web.

GET/minecraft/whoami

Para comprobar al arrancar el plugin que la clave es válida y a qué servidor pertenece. Sin cuerpo.

200 OK
{
  "server": "skyblock",
  "bonusEnabled": false,
  "reportIntervalSeconds": 60,
  "staleAfterSeconds": 180
}
POST/minecraft/activity

La foto de todos los jugadores conectados en este servidor, cada 60 segundos. Quien no viene en la lista se considera desconectado de este servidor.

Petición
{
  "sentAt": "2026-10-21T19:05:00.000Z",
  "players": [
    { "uuid": "3f8c1e2a-5b7d-4c9e-a1f0-6d2b8e4c7a90", "name": "SparkMC",  "active": true },
    { "uuid": "b21d7f04-9a3e-4f6b-8c55-0e7a1d9c3f12", "name": "Blackk",   "active": false },
    { "uuid": "e94a6c18-2f0b-4d7a-9e31-5c8b7a2d0f46", "name": "lia_mc",   "active": true }
  ]
}
CampoTipoRegla
sentAtstring ISOObligatorio. Hora en que el plugin armó la foto. Si llega una foto más vieja que la última aceptada de este servidor, se ignora.
playersarrayObligatorio, 0–1000 elementos. Lista vacía = no hay nadie (úsala también al apagar el servidor).
players[].uuidstringObligatorio. Solo jugadores con la sesión iniciada.
players[].namestringObligatorio. Nick actual.
players[].activebooleanObligatorio. false si está AFK según el criterio del plugin.
200 OK
{
  "server": "skyblock",
  "accepted": 3,
  "ignored": 0,
  "linked": [
    "3f8c1e2a-5b7d-4c9e-a1f0-6d2b8e4c7a90",
    "e94a6c18-2f0b-4d7a-9e31-5c8b7a2d0f46"
  ],
  "staleAfterSeconds": 180
}
  • linked: de los jugadores enviados, los que tienen cuenta vinculada. Sirve para avisar «Cuenta vinculada» cuando un UUID aparece por primera vez.
  • ignored: entradas con datos inválidos (UUID mal formado, repetidos). El resto se procesa igual.
  • Si un jugador pasa de lobby a skyblock, aparece en la foto de skyblock y desaparece en la siguiente de lobby. No hace falta avisar del cambio.
  • Si la foto llega fuera de orden, la respuesta es 200 con "stale": true y no se procesa.

Errores y reintentos

Todos los errores tienen la forma { "error": "texto", "code": "CODIGO" }.

HTTPcodeQué hacer
400VALIDATION_ERRORDatos mal formados; el cuerpo trae details con el campo. No reintentar igual.
401UNAUTHORIZEDClave ausente, incorrecta o revocada. Avisar en consola y dejar de enviar hasta corregir la config.
409ALREADY_LINKEDDecirle al jugador con qué Discord está vinculado.
429RATE_LIMITED / TOO_MANY_CODESEsperar lo que diga la cabecera Retry-After o retryAfterSeconds.
5xx o timeout—activity: no reintentar, la foto del minuto siguiente la reemplaza. link-codes: un reintento tras 2 s; si falla, decir al jugador que pruebe más tarde.

Timeout recomendado: 5 segundos. Las peticiones deben ir fuera del hilo principal del servidor (async) para no causar lag.

Reglas para el plugin

Pendiente de confirmar

  • Bedrock: ¿entran jugadores por Geyser/Floodgate? Su UUID tiene otro formato; habría que aceptarlo igual o excluirlo.
  • Qué es «activo»: el criterio AFK del plugin (por ejemplo, se movió, escribió o interactuó en los últimos 5 minutos).
  • Lista de servidores: los nombres que tendrán clave (lobby, skyblock…) y si el de login reporta.
  • URL de producción y de pruebas: la confirmamos al darte la primera clave.