# Multi-Debrid Resolve Patterns

Proven API patterns for Real-Debrid, AllDebrid, Premiumize, and TorBox magnet resolution. Each follows the same flow: add magnet → poll status → unrestrict/decode → return direct download URL.

## Real-Debrid

```
POST https://api.real-debrid.com/rest/1.0/torrents/addMagnet
  Body: magnet=magnet:?xt=urn:btih:{hash}&dn=video
  Auth: Bearer {rdKey}
  → Returns { id: "tid" }

POST https://api.real-debrid.com/rest/1.0/torrents/selectFiles/{tid}
  Body: files=all
  → Selects all files

Poll GET https://api.real-debrid.com/rest/1.0/torrents/info/{tid}
  Every 1.5s, up to 20 iterations (30s max)
  When status === "downloaded" && links.length > 0:

POST https://api.real-debrid.com/rest/1.0/unrestrict/link
  Body: link={links[0]}
  → Returns { download, filename, filesize }
```

## AllDebrid

```
GET https://api.alldebrid.com/v4/magnet/upload?agent={agent}&apikey={adKey}&magnets[]=magnet:?xt=urn:btih:{hash}
  → Returns { data: { magnets: [{ id }] } }

Poll GET https://api.alldebrid.com/v4/magnet/status?agent={agent}&apikey={adKey}&id={magId}
  When status === "Ready" && links.length > 0:

GET https://api.alldebrid.com/v4/link/unlock?agent={agent}&apikey={adKey}&link={links[0].link}
  → Returns { data: { link, filename } }
```

## Premiumize

```
POST https://www.premiumize.me/api/transfer/directdl
  Body: apikey={pmKey}&magnet=magnet:?xt=urn:btih:{hash}
  → If cached: { status: "success", content: [{ link, name, size }] }
  → If not: create transfer instead

POST https://www.premiumize.me/api/transfer/create
  Body: apikey={pmKey}&src=magnet:?xt=urn:btih:{hash}
  → Returns { id }

Poll GET https://www.premiumize.me/api/transfer/list?apikey={pmKey}
  Find transfer by id, when status === "finished" && file_id:

POST https://www.premiumize.me/api/transfer/directdl
  Body: apikey={pmKey}&src={file_id}
  → Returns { content: [{ link, name, size }] }
```

## TorBox

```
POST https://api.torbox.app/v1/api/torrents/createtorrent
  Body: { magnet, seed: 0, allow_zip: false, as_queued: false }
  Auth: Bearer {tbKey}
  → Returns { data: { torrent_id } }

Poll GET https://api.torbox.app/v1/api/torrents/mylist?id={torrId}
  When download_present && files.length > 0:

GET https://api.torbox.app/v1/api/torrents/requestdl?id={torrId}&token={tbKey}
  → Returns { data: download_url } or { download_url }
```

## Auto-Provider Pattern

```js
const providers = [];
if (RD_API_KEY) providers.push(['RD', () => rdResolve(hash, RD_API_KEY)]);
if (AD_API_KEY) providers.push(['AD', () => adResolve(hash, AD_API_KEY)]);
if (PM_API_KEY) providers.push(['PM', () => pmResolve(hash, PM_API_KEY)]);
if (TB_API_KEY) providers.push(['TB', () => tbResolve(hash, TB_API_KEY)]);

for (const [name, fn] of providers) {
  try {
    const result = await fn();
    if (result) return result;
  } catch (err) { /* try next */ }
}
```

## Config Auto-Detection

Set env vars in `.env`, providers auto-activate:
- `RD_API_KEY` → Real-Debrid enabled
- `AD_API_KEY` → AllDebrid enabled (+ `AD_API_AGENT` for agent string)
- `PM_API_KEY` → Premiumize enabled
- `TB_API_KEY` → TorBox enabled
