Serverové API pre botov
Klientske API Millida Hosting: vydanie kľúča, oprávnenia, správa servera a streamovanie konzoly z vlastného bota alebo skriptu.
Aktualizované 13. októbra 2026
Všetko, čo vie ovládací panel, sa dá robiť aj z vlastného kódu: naštartovať server podľa plánu, zobraziť stav v Discord, posielať príkazy z bota.
Kľúč
API je dostupné na každom platenom pláne — na tom istom mieste, kde sú súbory, SFTP a prístup pre tím. Na bezplatnom pláne sa kľúč nevydáva: kľúč je ten istý zdieľaný prístup, len pre bota.
Sekcia „Hráči a prístup“ → „API kľúče“ → „Vydať“. Skontroluj, čo kľúč smie robiť — oprávnenia sú rovnaké ako pri zdieľanom prístupe.
Kľúč sa zobrazí raz: ukladáme len jeho odtlačok. Ak ho stratíš, vydaj nový a starý odvolaj.
Kľúč sa odovzdáva v hlavičke Authorization: Bearer mhk_live_....
Metódy
Základná URL — https://millida.net/v2/hosting/api.
| Metóda | Čo robí | Požadované oprávnenie |
|---|---|---|
GET /server | Karta servera | console |
GET /status | Stav a online | console |
POST /start | Štart | start |
POST /stop | Zastavenie | start |
POST /restart | Reštart | start |
POST /command | Príkaz do konzoly | console |
GET /console | Živý log (SSE) | console |
GET /files?path= | Zoznam súborov | files |
GET /files/configs | Ktoré konfigy číta formulár | files |
GET /files/config?path= | Nastavenia súboru s typmi | files |
POST /files/config | Zmena nastavení súboru | files |
GET /backups | Zoznam záloh | backups |
POST /backups | Vytvorenie zálohy | backups |
GET /antibot | Nastavenia anti-bota, backendy a pravidlá firewallu | protection |
PUT /antibot | Zmena nastavení ochrany | protection |
GET /antibot/overview?range= | Pripojenia a odmietnutia za hour, day alebo week | protection |
POST /antibot/backends | Pridanie backendu {"address":"host:port","label":"..."} | protection |
DELETE /antibot/backends/{id} | Odstránenie backendu | protection |
POST /antibot/rules | Pravidlo firewallu {"kind":"allow"|"deny","cidr":"1.2.3.0/24"} | protection |
DELETE /antibot/rules/{id} | Odstránenie pravidla | protection |
POST /antibot/verify-domain/check | Kontrola DNS pre doménu tvojej overovacej stránky | protection |
Príklad: naštartuj server a počkaj, kým nabehne online
KEY="mhk_live_xxx"
API="https://millida.net/v2/hosting/api"
curl -sX POST "$API/start" -H "Authorization: Bearer $KEY"
until curl -s "$API/status" -H "Authorization: Bearer $KEY" | grep -q RUNNING; do
sleep 5
done
echo "server online"
Zálohy sa vytvárajú na pozadí
POST /backups vráti {"id":"..."} okamžite, zatiaľ čo samotný archív sa skladá na node: svet s niekoľkými gigabajtmi trvá minúty. Pripravenosť skontroluj v GET /backups cez pole status: pending — ešte sa skladá, ready — uložená v storage (vtedy sa objaví reálne sizeMb), failed — skladanie zlyhalo.
ID=$(curl -sX POST "$API/backups" -H "Authorization: Bearer $KEY" | jq -r .id)
until curl -s "$API/backups" -H "Authorization: Bearer $KEY" \
| jq -e --arg id "$ID" '.[] | select(.id==$id) | select(.status=="ready")' >/dev/null; do
sleep 15
done
echo "backup ready"
Kým záloha prebieha, na tom istom serveri sa nedá vytvoriť druhá — node ich robí po jednej.
Živá konzola
GET /console vracia Server-Sent Events stream: každý riadok prichádza s prefixom data:. WebSocket netreba — SSE prejde cez akúkoľvek proxy.
Čo by si mal vedieť
- Každá akcia kľúča sa loguje v logu servera s autorom „API key N“. Presne to potrebuješ, keď servery prevádzkujú aj ľudia, aj boti.
- Rate limiting sa počíta na kľúč, nie na adresu: zmena IP neobíde limit a sused v office sieti ho nespotrebúva. Pre bežnú automatizáciu je štedrý, ale polling stavu raz za sekundu naň narazí — raz za 10–15 sekúnd stačí. Stream konzoly sa dá otvoriť až desaťkrát za minútu: drž jedno spojenie namiesto otvárania nového pre každú správu.
- Kľúč prestane fungovať okamžite, ak je server pozastavený alebo plán už nie je platený. Ručne ho na to odvolávať netreba.
- Až päť kľúčov na server. Tie, ktoré nepotrebuješ, odvolaj.
Anti-bot ochrana
GET /antibot vracia nastavenia v dvoch poliach. config — vlastné nastavenia servera; kým neexistujú, je to null a server je chránený predvolene (pole default). effective je prítomné vždy: to sú nastavenia, ktoré práve platia alebo s ktorými bude server pracovať po prvej úprave — hodnoty čítaj z neho.
PUT /antibot prijíma len polia, ktoré chceš zmeniť:
curl -sX PUT "$API/antibot" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"preset":"balanced"}'
Úrovne (preset): off, under_attack, balanced, aggressive, custom. Úroveň si sama rozbalí hodnoty kontrol, takže pri ručnej konfigurácii zvoľ custom a pošli kontroly: checkCaptcha, checkPhysics, checkKeepAlive, checkTeleport, checkBrand, checkPing, checkTransfer, checkClientSettings — každá z nich off, under_attack alebo always. Zoznamy adries (vpnMode, datacenterMode, torMode) — off, log alebo block. Geo filter — geoMode (off, allow, deny) a geoCountries (kódy krajín, napr. ["RU","BY"]).
Forwarding secret sa cez API nevydáva ani nemení: zobrazuje sa len vlastníkovi v paneli.
Nastavenia konfigov
GET /files/config?path=server.properties vráti naparsovaný súbor — každý záznam s typom, aktuálnou hodnotou a príznakom „vyžaduje reštart“:
{
"path": "server.properties",
"format": "properties",
"options": [
{ "key": "pvp", "type": "boolean", "value": "true", "owner": "sync", "requiresRestart": false },
{ "key": "difficulty", "type": "select", "value": "normal", "values": ["peaceful", "easy", "normal", "hard"], "owner": "sync", "requiresRestart": false },
{ "key": "server-port", "type": "integer", "value": "25565", "owner": "platform", "requiresRestart": true }
]
}
owner ti povie, čo sa so záznamom dá robiť: platform — hodnotu nastavuje hosting, úpravy sa odmietnu; sync — záznam existuje aj v paneli, aj v súbore; file — vie o ňom len súbor.
Zápis mení len kľúče, ktoré pošleš; všetko ostatné v súbore zostáva nedotknuté:
curl -sX POST "$API/files/config" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"path":"server.properties","values":{"pvp":"false","difficulty":"hard"}}'
Formulár číta .properties, .yml/.yaml a .toml — vrátane konfigov pluginov, o ktorých panel nič nevie: typ poľa sa odvodí z hodnoty. Vnorené kľúče sa adresujú bodkou: settings.bungeecord, advanced.compression-threshold.
Celý súbor je stále dostupný cez GET/PUT /files/content?path= — obe cesty zapisujú na to isté miesto.
Hotový klient v Node.js a Pythone
Nižšie je minimálny klient: skontroluje stav, spustí server a napíše do chatu. Kľúč sa načítava z premennej prostredia MILLIDA_KEY — nevkladaj ho do kódu, ktorý skončí v gite. Chybová odpoveď je JSON s poľom message; to by mal tvoj bot zalogovať.
Node.js 18+ (vstavaný fetch):
const API = 'https://millida.net/v2/hosting/api';
const KEY = process.env.MILLIDA_KEY;
async function call(method, path, body) {
const res = await fetch(`${API}${path}`, {
method,
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: body ? JSON.stringify(body) : undefined,
});
if (!res.ok) throw new Error(`${method} ${path}: ${res.status} ${await res.text()}`);
return res.status === 204 ? null : res.json();
}
const status = await call('GET', '/status');
if (status.status !== 'RUNNING') await call('POST', '/start');
await call('POST', '/command', { command: 'say Hello from the bot' });
Python 3 s knižnicou requests a navyše čítanie živého konzoly:
import os
import requests
API = "https://millida.net/v2/hosting/api"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['MILLIDA_KEY']}"
def call(method, path, body=None):
res = session.request(method, API + path, json=body, timeout=15)
res.raise_for_status()
return res.json() if res.content else None
status = call("GET", "/status")
if status["status"] != "RUNNING":
call("POST", "/start")
call("POST", "/command", {"command": "say Hello from the bot"})
with session.get(API + "/console", stream=True, timeout=None) as stream:
for line in stream.iter_lines(decode_unicode=True):
if line and line.startswith("data:"):
print(line[5:].strip())
