API de ganancias de socio
Clave privada de solo lectura mek_live_: saldo, disponible para retirar, ganancias de un periodo en todos los servicios de Millida y suscriptores de tus modpacks. La clave funciona solo desde la IP de tu servidor.
Actualizado 28 de septiembre de 2026
Si quieres ver tus ganancias en tu propio sitio web o en un panel, conecta la API de ganancias. Devuelve las mismas cifras que tu cartera en Millida: saldo, importe disponible para retirar y ganancias del periodo seleccionado desglosadas por servicio: suscripciones a modpacks, hosting, donaciones, mercado y otros.
La API es de solo lectura. No puedes retirar dinero, cambiar los datos de pago ni pagar nada a través de ella. La clave solo ve tu cartera; con ella no puedes acceder a los datos de otras personas.
Clave
La clave se emite en el panel de socio: Perfil → sección con el nombre de tu estudio → API de ganancias. Al emitirla, indica la dirección IP del servidor desde el que se enviarán las solicitudes. La clave no funciona desde ninguna otra dirección, aunque te la roben.
- Puedes indicar hasta diez direcciones o subredes. La subred no debe ser más amplia que
/24para IPv4 y/48para IPv6. - Las direcciones locales y domésticas (
127.0.0.1,10.x,192.168.x) no se aceptan: necesitas la dirección pública del servidor. - La clave se muestra una sola vez. Guárdala en el servidor, en variables de entorno o en un gestor de secretos, y nunca la expongas al navegador.
- Puedes tener hasta cinco claves activas. Si pierdes una clave o cambias de servidor, revoca la clave antigua y emite una nueva. Una clave revocada deja de funcionar de inmediato.
Todos los endpoints son relativos a https://api.millida.net/v2. La clave se pasa en la cabecera:
Authorization: Bearer mek_live_…
Resumen
GET /earnings-api/v1/summary?from=2026-09-01T00:00:00.000Z&to=2026-09-30T23:59:59.999Z
from y to son los límites del periodo en formato ISO 8601. Ambos parámetros
son opcionales: sin ellos, el periodo abarca todo el tiempo.
{
"currency": "RUB",
"balance": {
"balanceKopecks": 1254000,
"availableKopecks": 1204000,
"withdrawableKopecks": 980000,
"heldKopecks": 50000,
"pendingPayoutKopecks": 0,
"tradeHoldKopecks": 0,
"tradeHoldReadyAt": null,
"marketHoldKopecks": 0,
"marketWithdrawalReadyAt": null
},
"period": {
"from": "2026-09-01T00:00:00.000Z",
"to": "2026-09-30T23:59:59.999Z",
"earnedKopecks": 3108000,
"heldKopecks": 0,
"spentKopecks": 0,
"toppedUpKopecks": 0,
"paidOutKopecks": 2000000,
"refundKopecks": 0,
"netKopecks": 1108000,
"operations": 142,
"earnedBySource": [
{ "source": "catalog", "amountKopecks": 2950000, "operations": 131 },
{ "source": "hosting", "amountKopecks": 158000, "operations": 11 }
],
"truncated": false
},
"subscriptions": {
"subscribers": 14,
"bundleSubscribers": 2,
"packSubscribers": 12
}
}
Todos los importes están en kopecks: 1254000 significa 12 540 ₽.
| Campo | Significado |
|---|---|
balance.balanceKopecks | todo lo que hay en la cartera, incluidos los fondos congelados |
balance.availableKopecks | se puede gastar dentro de Millida |
balance.withdrawableKopecks | se puede retirar ahora mismo — el mismo importe que en el botón «Retirar» |
balance.heldKopecks | congelado hasta que termine el periodo de retención |
period.earnedKopecks | ganado durante el periodo en todos los servicios |
period.earnedBySource | ganancias durante el periodo por servicio, de mayor a menor |
period.paidOutKopecks | retirado durante el periodo |
period.truncated | true — hay demasiadas transacciones en el periodo y los importes están incompletos: reduce el periodo |
subscriptions | suscriptores de tus modpacks ahora mismo, de forma resumida; los detalles están en la sección «Suscriptores» |
Los valores de source:
source | Servicio |
|---|---|
catalog | catálogo de modpacks: suscripciones y compras |
hosting | hosting |
trade | donaciones de Trade |
market | mercado |
skins | Millida Skins |
rating | rating |
admin | acumulaciones de Millida |
Con el tiempo pueden añadirse nuevos valores. Si no reconoces un valor, muéstralo tal cual y no lo trates como un error.
Suscriptores
GET /earnings-api/v1/subscriptions?from=2026-09-01T00:00:00.000Z&to=2026-09-30T23:59:59.999Z
Cuántas personas están jugando ahora mismo a tus modpacks con una suscripción de Millida y qué ha pasado con las suscripciones durante el periodo. Los suscriptores se cuentan por acceso activo, no por pagos: una persona cuenta mientras pueda iniciar el modpack, incluidos los tres días posteriores a la fecha de pago dados para el reintento del cobro. El acceso mediante claves de tu sitio web, el acceso de equipo y las compras puntuales no cuentan como suscripciones.
La API solo devuelve números. A través de ella no puedes saber quién está suscrito exactamente.
from y to definen el periodo igual que en el resumen. Solo afectan al bloque period; los bloques total, active, renewal y packs siempre muestran el estado en el momento de la solicitud.
{
"from": "2026-09-01T00:00:00.000Z",
"to": "2026-09-30T23:59:59.999Z",
"generatedAt": "2026-09-28T16:30:00.000Z",
"total": {
"subscribers": 14,
"bundleSubscribers": 2,
"packSubscribers": 12
},
"partners": [
{
"partner": { "slug": "arcania-labs", "name": "Arcania Labs" },
"active": {
"subscribers": 14,
"bundleSubscribers": 2,
"packSubscribers": 12,
"packSubscriptions": 12
},
"renewal": {
"autoRenewing": { "bundle": 2, "packs": 12 },
"canceledStillActive": { "bundle": 0, "packs": 0 }
},
"packs": [
{ "slug": "arcania", "title": "Arcania 1.4.3", "published": true, "activeSubscribers": 14, "viaPack": 12, "viaBundle": 2 },
{ "slug": "dread", "title": "DREAD - A Horror Survival Pack", "published": true, "activeSubscribers": 2, "viaPack": 0, "viaBundle": 2 }
],
"period": {
"newSubscriptions": { "bundle": 2, "packs": 12 },
"canceled": { "bundle": 0, "packs": 0 },
"expired": { "bundle": 0, "packs": 0 },
"refunded": { "bundle": 0, "packs": 0 }
},
"truncated": false
}
]
}
packs enumera todos tus modpacks, incluidos los que no tienen suscriptores.
| Campo | Significado |
|---|---|
total.subscribers | cuántas personas distintas están suscritas ahora mismo a al menos uno de tus modpacks |
total.bundleSubscribers | de esas, con una suscripción «Todos los modpacks» |
total.packSubscribers | de esas, con una suscripción a un modpack individual |
partners[] | una fila por cada estudio que tengas; si no eres socio, la lista está vacía |
active.packSubscriptions | total de suscripciones a modpacks individuales: una persona puede tener varias |
renewal.autoRenewing | suscripciones que se renovarán automáticamente: el pago automático está activado |
renewal.canceledStillActive | el pago automático está desactivado, pero el plazo pagado sigue activo; el acceso terminará después |
packs[].activeSubscribers | cuántas personas pueden jugar a este modpack por suscripción |
packs[].viaPack / packs[].viaBundle | de esas, por suscripción a este modpack y por la suscripción «Todos los modpacks» |
period.newSubscriptions | suscripciones cuyo primer cobro se produjo durante el periodo |
period.canceled | suscripciones para las que se desactivó el pago automático durante el periodo |
period.expired | el acceso terminó durante el periodo y no se renovó |
period.refunded | el acceso se cerró durante el periodo por un reembolso |
truncated | true — hay demasiados datos y las cifras están incompletas: reduce el periodo |
bundle cuenta personas, mientras que packs cuenta suscripciones a modpacks individuales.
Si se cancela una suscripción, aparece en canceled el día de la cancelación, y en
expired cuando termina el plazo pagado.
Errores
| Código | code | Qué hacer |
|---|---|---|
| 401 | INVALID_KEY | falta la clave, tiene una errata o es una clave de otro tipo |
| 401 | REVOKED | la clave se ha revocado — emite una nueva |
| 401 | OWNER_UNAVAILABLE | la cuenta del propietario de la clave está bloqueada o eliminada |
| 403 | IP_NOT_ALLOWED | la solicitud no llegó desde una dirección incluida en la clave; el texto del error muestra la dirección que vimos |
| 429 | — | se ha superado el límite de solicitudes, vuelve a intentarlo en un minuto |
Límites
Una sola clave puede enviar hasta 30 solicitudes por minuto. Las cifras cambian junto con los pagos, así que no tiene sentido consultar la API más de una vez por minuto. Es mejor cachear la respuesta en tu servidor.
Ejemplo
curl -s https://api.millida.net/v2/earnings-api/v1/summary \
-H "Authorization: Bearer $MILLIDA_EARNINGS_KEY"
curl -s https://api.millida.net/v2/earnings-api/v1/subscriptions \
-H "Authorization: Bearer $MILLIDA_EARNINGS_KEY"