⬡ Guida API — utente

↩ Pannello ▶_ Da terminale 📖 Riferimento completo

Tutto quello che ti serve per usare l'API senza essere admin: come autenticarti, e soprattutto come esplorare le tue cartelle e i tuoi file. Ogni esempio qui sotto è provabile dal vivo: incolla la tua chiave e premi Esegui.

La tua chiave API (xfsk_…) — la generi nel pannello in API & Widget. Resta solo nel tuo browser (localStorage).
1 · Autenticazione 2 · Chi sono 3 · Esplorare le cartelle 4 · Elencare i file 5 · Costruire l'albero 6 · Creare / spostare 7 · Download, torrent, SSE 8 · Widget & chiavi

1 · Come funziona l'autenticazione

Da utente non-admin NON usi username e password. Il modello è:

ContestoCome ti autentichi
Nel browser (pannello)Login con Telegram (il bottone "Login con Telegram"). Il pannello ottiene un token di sessione (JWT).
Da script / widget / appUna chiave API xfsk_… che generi nel pannello, inviata nell'header X-API-Key.
In pratica: genera una chiave nel pannello (sezione API & Widget → Genera nuova chiave), copiala, e usala nell'header X-API-Key per ogni richiesta. È tutto qui.

Header da inviare sempre

X-API-Key: xfsk_la_tua_chiave

L'admin in più può autenticarsi con POST /auth/login (username/password). A te non serve.

2 · Capire chi sei — GET/api/v1/auth/me

Primo test utile: verifica che la chiave funzioni e scopri il tuo user_id.

Risposta (esempio reale)

{
  "user_id": 5729584516,
  "telegram_id": 5729584516,
  "username": "mojibakex",
  "first_name": "Mojibake",
  "is_admin": false,
  "is_authorized": true,
  "total_downloads": 135
}

3 · Esplorare le cartelle — GET/api/v1/fm/folders

Questo è il punto chiave. Le cartelle sono piatte in una lista: ognuna ha un id e un parent_id. La gerarchia la ricostruisci tu collegando parent_id → id.

Com'è fatta una cartella

{
  "folders": [
    { "id": 14, "parent_id": 0,  "name": "facebook",         "is_system": true,  "user_id": "5729584516" },
    { "id": 46, "parent_id": 14, "name": "Linda Stabilini DJ","is_system": false, "user_id": "5729584516" },
    { "id": 138,"parent_id": 137,"name": "Hunter X Hunter",   "is_system": false }
  ]
}

Campi: id, parent_id, name, is_system (cartelle automatiche es. "facebook", "youtube"), color, icon, created_at, metadata.

4 · Elencare i file — GET/api/v1/fm/files

Una volta che hai gli id delle cartelle, chiedi i file con il parametro folder_id:

ChiamataCosa restituisce
/fm/files (senza parametro)TUTTI i tuoi file, in ogni cartella.
/fm/files?folder_id=0Solo i file nella radice (non in una cartella).
/fm/files?folder_id=14I file dentro la cartella 14.
/fm/files?search=dylanRicerca per nome (combinabile con folder_id).
/fm/files?tag_id=3File con quel tag.
/fm/files?limit=10Solo i 10 più recenti. Si combina con tutti gli altri parametri.
/fm/files?limit=10&offset=10I dieci successivi: è così che si sfoglia a pagine.
/fm/files?limit=0Nessun file, solo il conteggio: utile per sapere quanti sono.

Nella risposta, count è quanti file ti sono arrivati davvero e total quanti ne esistono con quei filtri. Senza limit i due numeri coincidono. L’ordine è sempre dal più recente al più vecchio.

folder_id:

Com'è fatto un file (esempio reale)

{
  "files": [
    {
      "id": 3166,
      "filename": "2026-06-22_1659744378594844.mp4",
      "filesize": 17876784,
      "folder_id": 14,
      "source": "facebook",
      "is_favorite": false,
      "channel_msg_id": 9747562496,
      "created_at": "2026-06-27T18:35:09",
      "tag_ids": []
    }
  ],
  "count": 3
}
Numeri reali da un account di test: 44 cartelle, 349 file totali, 3 in radice (folder_id=0), la cartella facebook (id 14) ne ha 3, Hunter X Hunter (id 138) ne ha 110.

5 · Ricostruire l'albero delle cartelle

Per "navigare" come in un file manager, scarichi le cartelle una volta e le colleghi via parent_id. Premi qui sotto per farlo dal vivo con il tuo account:

Logica (JavaScript)

const { folders } = await (await fetch('/api/v1/fm/folders',
  { headers:{ 'X-API-Key': KEY } })).json();

// indicizza per id e raggruppa per parent_id
const byParent = {};
for (const f of folders) (byParent[f.parent_id] ||= []).push(f);

function print(parent = 0, depth = 0) {
  for (const f of (byParent[parent] || [])) {
    console.log('  '.repeat(depth) + '📁 ' + f.name + '  #' + f.id);
    print(f.id, depth + 1);          // ricorsione sui figli
  }
}
print();                              // parte dalla radice (parent_id = 0)

6 · Creare cartelle e spostare file

POST/api/v1/fm/folders — nuova cartella

{ "name": "Le mie serie", "parent_id": 0 }

Ometti o metti parent_id: 0 per crearla in radice; mettine uno esistente per annidarla.

POST/api/v1/fm/files/move — sposta file

{ "file_ids": [3166, 2588], "folder_id": 14 }

Sposta uno o più file nella cartella indicata (folder_id: 0 = riportali in radice).

Questi esempi modificano i dati: non c'è un bottone "Esegui" per evitare cambiamenti involontari. Copiali e provali tu quando vuoi.

7 · Le altre operazioni che usi spesso

CosaEndpoint
Scaricare un fileGET /api/v1/fm/files/<id>/stream
Avviare un download da URLPOST /api/v1/downloads
Stato dei downloadGET /api/v1/downloads
Aggiungere un magnet/torrentPOST /api/v1/torrents
Creare un link di condivisionePOST /api/v1/shares
Eventi in tempo reale (progresso)GET /api/v1/events (SSE)
Gestire le tue chiaviGET /api/v1/keys

Progresso in tempo reale (SSE)

Con EventSource la chiave va in query (il browser non manda header sugli SSE):

const ev = new EventSource('/api/v1/events?api_key=' + KEY);
ev.onmessage = e => console.log(JSON.parse(e.data));

Il riferimento completo di tutti gli endpoint è in 📖 Documentazione.

8 · Widget nel tuo sito & gestione chiavi

Oltre agli script, puoi incollare un widget pronto nel tuo sito: i visitatori incollano dei link e ricevono link diretti temporanei, senza login e senza vedere la tua chiave (le richieste passano dal server).

Come si mette un widget — 3 passi

PassoCosa fare
1 · Genera la chiavePannello → API & Widget → Genera nuova chiave. Metti un’etichetta e i domini del sito. Copia subito la chiave xfsk_…: si vede una sola volta.
2 · Genera il codiceSempre lì → Generatore codice widget: scegli il widget, incolla la chiave nel campo apposito e copia il blocco <script>.
3 · Incolla nel sitoMetti il blocco dove vuoi il widget. Fatto.
<div id="xfs-widget"></div>
<script src="https://iltuoserver/assets/embed.js"
        data-widget="multi-dl"
        data-api-key="xfsk_LA_TUA_CHIAVE"
        data-target="#xfs-widget"
        data-accent="#3b82f6"></script>
Vedi “Widget non configurato (API key mancante)”? Vuol dire che il tag <script> non ha una chiave valida. Controlla in ordine:
  • C’è ancora il segnaposto data-api-key="xfsk_LA_TUA_CHIAVE" → mettici la tua chiave.
  • Il dominio della pagina non è tra i “Domini autorizzati” della chiave → aggiungilo nel pannello.
  • La chiave è stata revocata → generane una nuova.
Nelle demo del pannello la chiave non serve: girano con il tuo login. Se apri una demo senza login, aggiungi ?key=LA_TUA_CHIAVE in fondo all’URL.

Dove sono le mie chiavi? Posso revocarle?

Sì. Nel pannello → API & Widget → Le tue chiavi trovi tutte le chiavi generate, mostrate solo mascherate (es. xfsk_ab12cd34••••••) perché la chiave intera non è più recuperabile dopo la creazione. Per ognuna puoi:

AzioneEffetto
Salva dominiAggiorna i domini autorizzati (CORS) da cui il widget può girare.
Revoca chiaveDisattiva subito la chiave: widget e script che la usano smettono di funzionare. Irreversibile.

Anche via API: GET /api/v1/keys (elenco mascherato) · POST /api/v1/keys (crea) · DEL /api/v1/keys/<id> (revoca).

🔒 Consiglio: usa una chiave per sito/uso. Così, se una va compromessa o non ti serve più, la revochi senza toccare le altre.

XFS Bot · guida utente · gli esempi marcati ▶ girano sul server in tempo reale.