Server API za botove
Millida Hosting klijentski API: izdavanje ključa, dozvole, upravljanje serverom i strimovanje konzole iz sopstvenog bota ili skripte.
Ažurirano 13. oktobar 2026.
Sve što panel radi možeš da uradiš i iz svog koda: pokreni server po rasporedu, prikaži status u Discord-u, šalji komande iz bota.
Ključ
API je dostupan na svakom plaćenom planu — na istom mestu gde su fajlovi, SFTP i pristup za tim. Na besplatnom planu ključ se ne izdaje: ključ je isti deljeni pristup, samo za bota.
Sekcija „Igrači i pristup” → „API ključevi” → „Izdaj”. Proveri šta ključ sme da radi — dozvole su iste kao za deljeni pristup.
Ključ se prikazuje samo jednom: čuvamo samo njegov otisak. Ako ga izgubiš, izdaj novi i opozovi stari.
Ključ se prosleđuje u zaglavlju Authorization: Bearer mhk_live_....
Metode
Osnovni URL — https://millida.net/v2/hosting/api.
| Metoda | Šta radi | Potrebna dozvola |
|---|---|---|
GET /server | Kartica servera | console |
GET /status | Status i online | console |
POST /start | Pokretanje | start |
POST /stop | Zaustavljanje | start |
POST /restart | Restart | start |
POST /command | Komanda u konzolu | console |
GET /console | Log uživo (SSE) | console |
GET /files?path= | Lista fajlova | files |
GET /files/configs | Koje konfiguracije čita forma | files |
GET /files/config?path= | Podešavanja fajla sa tipovima | files |
POST /files/config | Izmena podešavanja fajla | files |
GET /backups | Lista bekapa | backups |
POST /backups | Kreiranje bekapa | backups |
GET /antibot | Anti-bot podešavanja, backend-ovi i firewall pravila | protection |
PUT /antibot | Izmena podešavanja zaštite | protection |
GET /antibot/overview?range= | Konekcije i odbijanja za hour, day ili week | protection |
POST /antibot/backends | Dodaj backend {"address":"host:port","label":"..."} | protection |
DELETE /antibot/backends/{id} | Ukloni backend | protection |
POST /antibot/rules | Firewall pravilo {"kind":"allow"|"deny","cidr":"1.2.3.0/24"} | protection |
DELETE /antibot/rules/{id} | Ukloni pravilo | protection |
POST /antibot/verify-domain/check | Proveri DNS za domen svoje verifikacione stranice | protection |
Primer: pokreni server i sačekaj da dođe 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"
Bekapi se kreiraju u pozadini
POST /backups odmah vraća {"id":"..."}, dok se sam arhiv sastavlja na nodu: svet od nekoliko gigabajta traje minutima. Spremnost proveri u GET /backups preko polja status: pending — još se sastavlja, ready — sačuvan u skladištu (tada se pojavljuje pravi sizeMb), failed — nije uspelo sastavljanje.
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"
Dok je bekaping u toku, ne možeš da napraviš drugi na istom serveru — nod ih radi jedan po jedan.
Konzola uživo
GET /console vraća Server-Sent Events tok: svaka linija stiže sa prefiksom data:. WebSocket nije potreban — SSE prolazi kroz svaki proxy.
Šta treba da znaš
- Svaka akcija ključa se beleži u log servera sa autorom „API key N”. To je upravo ono što ti treba kada i ljudi i botovi pokreću servere.
- Ograničenje brzine se računa po ključu, ne po adresi: promena IP-a ne zaobilazi limit, a komšija na kancelarijskoj mreži ga ne troši. Za normalnu automatizaciju je velikodušno, ali proveravanje statusa jednom u sekundi će ga pogoditi — dovoljno je jednom u 10–15 sekundi. Tok konzole možeš da otvoriš do deset puta u minutu: drži jednu konekciju umesto da otvaraš novu za svaku poruku.
- Ključ odmah prestaje da radi ako je server suspendovan ili plan više nije plaćen. Zbog toga ne moraš ručno da ga opozivaš.
- Do pet ključeva po serveru. Opozovi one koji ti ne trebaju.
Anti-bot zaštita
GET /antibot vraća podešavanja u dva polja. config — sopstvena podešavanja servera; dok ne postoje, to je null, a server je zaštićen podrazumevano (polje default). effective je uvek prisutno: to su podešavanja koja su trenutno na snazi ili sa kojima će server raditi posle prve izmene — čitaj vrednosti iz njega.
PUT /antibot prihvata samo polja koja želiš da izmeniš:
curl -sX PUT "$API/antibot" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"preset":"balanced"}'
Nivoi (preset): off, under_attack, balanced, aggressive, custom. Nivo sam razvija vrednosti provera, pa za ručnu konfiguraciju izaberi custom i pošalji provere: checkCaptcha, checkPhysics, checkKeepAlive, checkTeleport, checkBrand, checkPing, checkTransfer, checkClientSettings — svaka može biti off, under_attack ili always. Liste adresa (vpnMode, datacenterMode, torMode) — off, log ili block. Geo filter — geoMode (off, allow, deny) i geoCountries (kodovi država, npr. ["RU","BY"]).
Tajna za prosleđivanje se ne izdaje niti menja preko API-ja: prikazuje se samo vlasniku u panelu.
Podešavanja konfiguracija
GET /files/config?path=server.properties vraća parsiran fajl — svaki unos sa svojim tipom, trenutnom vrednošću i oznakom „potreban restart”:
{
"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 kaže šta možeš sa unosom: platform — vrednost postavlja hosting, izmene se odbijaju; sync — unos postoji i u panelu i u fajlu; file — samo fajl zna za njega.
Upis menja samo ključeve koje pošalješ; sve ostalo u fajlu ostaje netaknuto:
curl -sX POST "$API/files/config" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"path":"server.properties","values":{"pvp":"false","difficulty":"hard"}}'
Forma čita .properties, .yml/.yaml i .toml — uključujući konfiguracije pluginova za koje panel ne zna: tip polja se zaključuje iz vrednosti. Ugnježdeni ključevi se adresiraju tačkom: settings.bungeecord, advanced.compression-threshold.
Ceo fajl je i dalje dostupan preko GET/PUT /files/content?path= — oba puta pišu na isto mesto.
Gotov klijent u Node.js i Python-u
Ispod je minimalni klijent: proverava status, pokreće server i piše u čet. Ključ se čita iz promenljive okruženja MILLIDA_KEY — ne lepi ga u kod koji završi u gitu. Odgovor sa greškom je JSON sa poljem message; to treba da beleži tvoj bot.
Node.js 18+ (ugrađeni 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 sa bibliotekom requests, plus čitanje konzole uživo:
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())
