eMuleBB REST API Migrated Action Inventory¶
Status: current completed parity ledger Contract: REST-API-OPENAPI.yaml Scope: controller-relevant runtime capabilities historically reachable through WebServer command handlers, plus explicit exclusions for presentation-only, frozen template UI, or host-level actions.
This inventory is not a functional parity promise for the legacy template-based WebServer UI. That engine is frozen and compile-only until removal; its HTML pages, templates, sessions, and page interaction state are not supported and are not release gates.
Classification Rules¶
implemented-
Meaning: Current
mainexposes the route through the OpenAPI contract and matching native route seam. -
obsolete - Meaning: Intentionally excluded from REST because it is deprecated web-page presentation state, session plumbing, binary streaming, host OS control, or outside the adapter's declared purpose.
This ledger currently has no deferred rows. Future controller-relevant gaps should be tracked as active item IDs before being added here as pending work.
Contract-Wide Release Requirements¶
- REST base path is
/api/v1 - Status: implemented
-
Notes: Existing REST already uses this root.
-
Auth uses
X-API-Keyonly - Status: implemented
-
Notes: No REST sessions, no cookie login, and no low-rights REST mode.
-
REST inherits WebServer bind, HTTPS, and allowed-IP exposure controls
- Status: implemented
-
Notes: REST remains in-process on the existing listener.
-
JSON success envelope is
{ data, meta } - Status: implemented
-
Notes: Landed on native
main; aMuTorrent also unwraps this shape. -
JSON collection envelope is
{ data: { items: [...] }, meta } - Status: implemented
-
Notes: Only
GET /shared-filesandGET /upload-queueexposeoffset/limitpagination metadata; other list routes are intentionally unpaged. -
JSON error envelope is
{ error: { code, message, details? } } - Status: implemented
-
Notes: Native errors now use
{ error: { code, message } };detailsremains optional for future richer validation. -
Field names are
camelCase - Status: implemented
-
Notes: Pre-release aliases were removed from public route parsing; final names include
searchId,categoryId,deleteFiles, and*KiBpsspeed fields. -
Mutations return the updated resource when practical
- Status: implemented
-
Notes: Preference, category, transfer property, shared-file metadata, and shared-directory mutations now return the updated model. Async/operation routes return operation envelopes.
-
Bulk endpoints use HTTP 200 with per-item results
- Status: implemented
-
Notes: Transfer delete and multi-link add use
{items:[...]}per-item result envelopes. -
Destructive file deletion requires explicit confirmation
- Status: implemented
-
Notes: Transfer deletes require
deleteFiles: true; shared-file deletes require an explicit boolean becausefalsemeans unshare/exclude without deleting the local file.delete_filesis no longer public API. -
aMuTorrent consumes this OpenAPI surface statically
- Status: implemented
-
Notes: The integration branch unwraps native envelopes and consumes final resource/operation routes and field names.
-
Native REST commands are serialized through the UI thread
- Status: implemented
-
Notes:
/api/v1dispatch uses a synchronous main-window command before touching UI-owned eMule state, with exception containment at the dispatch boundary. -
OpenAPI and smoke registry stay in sync
- Status: implemented
- Notes: The Python smoke unit tests parse
REST-API-OPENAPI.yamland fail if route coverage drifts from the documented contract.
Application And Preferences¶
- Show app/version/runtime information
- REST target:
GET /app - Status: implemented
-
Impact and notes: Returns app identity, build flavor, lifecycle state, and static capabilities while REST is accepting requests.
-
Show global status/statistics summary
- REST target:
GET /status,GET /stats,GET /snapshot - Status: implemented
-
Impact and notes: Status, stats, and snapshot routes use stable v1 envelopes.
-
Update WebServer gzip preference
- REST target: none
- Status: obsolete
-
Impact and notes: HTML/WebServer gzip is page-serving presentation behavior, not a native controller preference.
-
Update WebServer refresh interval
- REST target: none
- Status: obsolete
-
Impact and notes: HTML/WebServer refresh timing remains in
[WebServer] PageRefreshTime; controller UIs own their own polling cadence. -
Update max download speed
- REST target:
PATCH /app/preferences - Status: implemented
-
Impact and notes: Uses
downloadLimitKiBps; valid range is1..4294967294to match finite UI limits and avoid the unlimited sentinel. -
Update max upload speed
- REST target:
PATCH /app/preferences - Status: implemented
-
Impact and notes: Uses
uploadLimitKiBps; same range as download. -
Update max sources per file
- REST target:
PATCH /app/preferences - Status: implemented
-
Impact and notes: Uses
maxSourcesPerFile; valid range is1..2147483647for UI and INI integer round-trip. -
Update max connections
- REST target:
PATCH /app/preferences - Status: implemented
-
Impact and notes: Uses
maxConnections; valid range is1..2147483647. -
Update max connections per five seconds
- REST target:
PATCH /app/preferences - Status: implemented
-
Impact and notes: Uses
maxConnectionsPerFiveSeconds; valid range is1..2147483647. -
Start app shutdown
- REST target:
POST /app/shutdown - Status: implemented
-
Impact and notes: Keeps eMule-process shutdown only. Excluded from live destructive mutation loops.
-
Host shutdown or reboot from web UI
- REST target: none
- Status: obsolete
-
Impact and notes: User explicitly excluded OS shutdown/reboot from REST.
-
HTML login/logout/session state
- REST target: none
- Status: obsolete
-
Impact and notes: REST uses API-key auth only and must never fall back to HTML session behavior.
-
HTML template, sort, column, refresh presentation state
- REST target: none
- Status: obsolete
- Impact and notes: Controller UIs own their own presentation state.
Categories¶
| Migrated capability | REST target | Status | Impact and notes |
|---|---|---|---|
| List categories | GET /categories |
implemented | Returns the category collection envelope. |
| Create category | POST /categories |
implemented | Required for aMuTorrent category management. |
| Edit category | PATCH /categories/{categoryId} |
implemented | Default category id 0 remains protected. |
| Delete category | DELETE /categories/{categoryId} |
implemented | Must preserve normal eMule constraints. |
| Category tab refresh | GET /categories plus UI polling |
obsolete | Web UI tab refresh action is presentation-only. |
| Set category priority | PATCH /categories/{categoryId} |
implemented | Category create/update accepts final priority values. |
Transfers¶
- List downloads
- REST target:
GET /transfers - Status: implemented
-
Impact and notes: Current REST already returns transfer rows.
-
Show one download
- REST target:
GET /transfers/{hash} - Status: implemented
-
Impact and notes: Current route exists.
-
Add ED2K URL
- REST target:
POST /transfers - Status: implemented
-
Impact and notes: Accepts
linkorlinksand always returns the per-item operation envelope. -
Pause transfer
- REST target:
POST /transfers/{hash}/operations/pause - Status: implemented
-
Impact and notes: Returns the stable per-item operation envelope.
-
Resume transfer
- REST target:
POST /transfers/{hash}/operations/resume - Status: implemented
-
Impact and notes: Returns the stable per-item operation envelope.
-
Stop transfer
- REST target:
POST /transfers/{hash}/operations/stop - Status: implemented
-
Impact and notes: Returns the stable per-item operation envelope.
-
Cancel transfer
- REST target:
DELETE /transfers/{hash}withdeleteFiles: true - Status: implemented
-
Impact and notes: Native eMule cancel removes partial
.partstate; adapters must not senddeleteFiles:falsefor incomplete transfers. -
Delete transfer local files
- REST target:
DELETE /transfers/{hash}withdeleteFiles: true - Status: implemented
-
Impact and notes:
deleteFilesis the preferred spelling. -
Clear completed transfers
- REST target:
POST /transfers/operations/clear-completed - Status: implemented
-
Impact and notes: Uses the existing main-window clear-completed path.
-
Rename incomplete transfer
- REST target:
PATCH /transfers/{hash} - Status: implemented
-
Impact and notes: Current main includes rename support for incomplete files only.
-
Set transfer priority
- REST target:
PATCH /transfers/{hash} - Status: implemented
-
Impact and notes: Final enum is
auto,verylow,low,normal,high, andveryhigh; shared-file release priority is separate. -
Set transfer category
- REST target:
PATCH /transfers/{hash} - Status: implemented
-
Impact and notes: Supports category id/name; final naming must be
categoryId/categoryName. -
File recheck
- REST target:
POST /transfers/{hash}/operations/recheck - Status: implemented
-
Impact and notes: Returns the accepted-operation envelope after queuing the native recheck.
-
Preview transfer
- REST target:
POST /transfers/{hash}/operations/preview - Status: implemented
-
Impact and notes: Route validates preview readiness before launching the existing preview command.
-
Get transfer sources
- REST target:
GET /transfers/{hash}/sources - Status: implemented
-
Impact and notes: Current route exists.
-
Get one transfer source
- REST target:
GET /transfers/{hash}/sources/{clientId} - Status: implemented
-
Impact and notes: Uses the same stable source selector as peer operations.
-
Get transfer part/source detail
- REST target:
GET /transfers/{hash}/details - Status: implemented
-
Impact and notes: Native route returns transfer, part, and source detail; aMuTorrent hydrates transfer detail from it.
-
Browse source
- REST target:
POST /transfers/{hash}/sources/{clientId}/operations/browse - Status: implemented
-
Impact and notes: Uses source user hash as the stable selector where available.
-
Add/remove friend from transfer peer
- REST target:
POST /transfers/{hash}/sources/{clientId}/operations/add-friend,.../remove-friend, plus/friends - Status: implemented
-
Impact and notes: Transfer-source peer operations use the same stable
clientIdselector exposed by source rows. -
Ban/unban transfer peer
- REST target:
POST /transfers/{hash}/sources/{clientId}/operations/ban,.../unban - Status: implemented
-
Impact and notes: Mirrors pro-user source context-menu controls.
-
Remove transfer source
- REST target:
POST /transfers/{hash}/sources/{clientId}/operations/remove - Status: implemented
-
Impact and notes: Removes the source through the normal download queue removal path.
-
Hide transfer columns or update transfer table sort
- REST target: none
- Status: obsolete
- Impact and notes: Presentation state belongs to aMuTorrent or any other controller.
Shared Files And Shared Directories¶
- List shared files
- REST target:
GET /shared-files - Status: implemented
-
Impact and notes: Current REST has shared-file listing.
-
Show one shared file
- REST target:
GET /shared-files/{hash} - Status: implemented
-
Impact and notes: Current route exists.
-
Add one shared file by path
- REST target:
POST /shared-files - Status: implemented
-
Impact and notes: Returns a shared-file create operation result because hashing may be asynchronous.
-
Unshare one file
- REST target:
DELETE /shared-files/{hash} - Status: implemented
-
Impact and notes: Uses final
deleteFilesnaming and returns the delete-result envelope. -
Delete shared local file
- REST target:
DELETE /shared-files/{hash}withdeleteFiles: true - Status: implemented
-
Impact and notes: Native deletion requires explicit
deleteFiles:true; default delete only unshares/excludes where allowed. -
Set shared-file upload priority
- REST target:
PATCH /shared-files/{hash} - Status: implemented
-
Impact and notes: Supports
auto,verylow,low,normal,high, and native uploadrelease. -
Update shared-file comment/rating
- REST target:
PATCH /shared-files/{hash} - Status: implemented
-
Impact and notes: Current main supports comment/rating for completed shared files.
-
Get ED2K link
- REST target:
GET /shared-files/{hash}/ed2k-link - Status: implemented
-
Impact and notes: Metadata only; binary file streaming remains excluded.
-
Show known file comments
- REST target:
GET /shared-files/{hash}/comments - Status: implemented
-
Impact and notes: Returns the local known-file comment/rating metadata as a comments collection.
-
Binary file download from WebServer
getfile - REST target: none
- Status: obsolete
-
Impact and notes: User explicitly excluded binary shared-file streaming.
-
Reload shared files
- REST target:
POST /shared-files/operations/reloadand/shared-directories/operations/reload - Status: implemented
-
Impact and notes: Final contract names both operation routes.
-
List shared directories
- REST target:
GET /shared-directories - Status: implemented
-
Impact and notes: Current REST supports configured roots.
-
Replace shared directory roots
- REST target:
PATCH /shared-directories - Status: implemented
-
Impact and notes: Request roots accept compact string paths or
{path, recursive}objects; current live E2E covers persistence. -
Auto-share folder live monitor add/remove file events
- REST target:
GET /shared-filesplus live E2E - Status: implemented
-
Impact and notes: Live REST test coverage exists in
emulebb-build-tests; final contract stays resource-based. -
Shared-files sort/column state
- REST target: none
- Status: obsolete
- Impact and notes: Presentation-only.
Uploads And Queue¶
- List active uploads
- REST target:
GET /uploads - Status: implemented
-
Impact and notes: Current REST exposes uploads; aMuTorrent currently drops this data in its data pipeline.
-
List upload queue
- REST target:
GET /upload-queue - Status: implemented
-
Impact and notes: Current REST exposes queue.
-
Show one active upload
- REST target:
GET /uploads/{clientId} - Status: implemented
-
Impact and notes: Returns the selected upload row plus existing score breakdown state for controller drill-down.
-
Show one queued upload
- REST target:
GET /upload-queue/{clientId} - Status: implemented
-
Impact and notes: Returns the selected waiting-queue row plus existing score breakdown state for controller drill-down.
-
Remove upload client
- REST target:
POST /uploads/{clientId}/operations/remove - Status: implemented
-
Impact and notes: Stable selectors are either user hash or
address:portwhen no hash exists; the duplicateDELETE /uploads/{clientId}alias was removed before v1 freeze. -
Give release slot
- REST target:
POST /uploads/{clientId}/operations/release-slot - Status: implemented
-
Impact and notes: Uses the normal upload-queue removal path for active slots.
-
Upload context menu ban/unban
- REST target:
POST /uploads/{clientId}/operations/ban,.../unban - Status: implemented
-
Impact and notes: Same peer-control command family as transfer sources.
-
Upload friend actions
- REST target:
POST /uploads/{clientId}/operations/add-friend,.../remove-friend - Status: implemented
-
Impact and notes: Idempotent add returns an existing friend when already present.
-
Upload queue remove/release/friend/ban actions
- REST target:
POST /upload-queue/{clientId}/operations/... - Status: implemented
- Impact and notes: Queue routes share the same stable peer selector and operation vocabulary.
Servers¶
| Migrated capability | REST target | Status | Impact and notes |
|---|---|---|---|
| List servers | GET /servers |
implemented | Returns the server collection envelope. |
| Show server status | GET /status, GET /servers |
implemented | Final contract folds status into resource rows and /status. |
| Connect to best server | POST /servers/operations/connect |
implemented | Final route is resource-operation shaped and returns server status. |
| Connect to specific server | POST /servers/{serverId}/operations/connect |
implemented | serverId is URL-encoded address:port. |
| Disconnect or stop connecting | POST /servers/operations/disconnect |
implemented | Covers both disconnect and stop-connecting runtime commands. |
| Add server | POST /servers |
implemented | Final create supports address, port, name, priority, static, and connect. |
| Remove server | DELETE /servers/{serverId} |
implemented | Existing route exists. |
| Add server to static list | PATCH /servers/{serverId} with static: true |
implemented | Static membership is handled as a server property. |
| Remove server from static list | PATCH /servers/{serverId} with static: false |
implemented | Static membership is handled as a server property. |
| Set server priority low/normal/high | PATCH /servers/{serverId} |
implemented | Priority is handled as a server property. |
| Update server.met from URL | POST /servers/operations/import-met-url |
implemented | Marshalled through the existing UI interaction path. |
Kad¶
| Migrated capability | REST target | Status | Impact and notes |
|---|---|---|---|
| Show Kad status | GET /kad |
implemented | Current status route exists. |
| Start Kad | POST /kad/operations/start |
implemented | Final route returns Kad status. |
| Stop Kad | POST /kad/operations/stop |
implemented | Final route returns Kad status. |
| Recheck Kad firewall | POST /kad/operations/recheck-firewall |
implemented | Returns Kad status plus firewall-check operation flags. |
| Bootstrap Kad | POST /kad/operations/bootstrap |
implemented | Requires {address, port} and validates the port range before dispatch. |
| Update nodes.dat from URL | POST /kad/operations/import-nodes-url |
implemented | Marshalled through the existing validated nodes.dat import path. |
Searches¶
- Start search
- REST target:
POST /searches - Status: implemented
-
Impact and notes: Returns
{id, query, method, type, status, results}for async polling. -
List search sessions
- REST target:
GET /searches - Status: implemented
-
Impact and notes: Returns active search sessions without expanding result rows.
-
Get search results
- REST target:
GET /searches/{searchId} - Status: implemented
-
Impact and notes: aMuTorrent should poll this until stable and verify the echoed
methodandtype. -
Stop/delete one search
- REST target:
DELETE /searches/{searchId} - Status: implemented
-
Impact and notes: Final route deletes the search session.
-
Delete all searches
- REST target:
DELETE /searches - Status: implemented
-
Impact and notes: Uses the existing delete-all-searches UI action.
-
Start search with method/type/min/max/availability/extension filters
- REST target:
POST /searches - Status: implemented
-
Impact and notes: Method, type, size, and extension filters are parsed by the native command seam.
-
Add selected search result to downloads
- REST target:
POST /searches/{searchId}/results/{hash}/operations/download - Status: implemented
-
Impact and notes: Returns an operation result with the accepted search id and hash.
-
Clear searches before new search
- REST target:
DELETE /searches - Status: implemented
-
Impact and notes: Explicit clear is required;
POST /searchesno longer acceptsclearExistingbefore v1 freeze. -
Search page sort, table layout, and refresh
- REST target: none
- Status: obsolete
- Impact and notes: Presentation-only.
Logs¶
| Migrated capability | REST target | Status | Impact and notes |
|---|---|---|---|
| Show recent log lines | GET /logs |
implemented | Current REST has bounded recent logs. |
| Warning when process runs elevated | GET /logs plus app startup warning |
implemented | Startup warning was added earlier; REST exposes recent log buffer. |
| Detailed build warnings | none | obsolete | Build logs are workspace artifacts, not runtime REST data. |
Explicit Non-Goals¶
| Legacy or possible action | Status | Rationale |
|---|---|---|
| Binary shared-file streaming through REST | obsolete | Metadata and ED2K links are enough for controller integration; local file serving changes risk profile. |
| Host OS shutdown/reboot | obsolete | Not needed by aMuTorrent and too destructive for the trusted local API. |
| Deprecated template sessions and low-rights mode | obsolete | REST is all-in behind X-API-Key. |
| Dynamic capability negotiation | obsolete | eMuleBB and aMuTorrent ship together; static contract compliance is simpler and stricter. |
| Granular REST permissions | obsolete | User explicitly chose all-in API-key behavior. |
aMuTorrent Gap Checklist¶
- Endpoint adapter route names
- Status: implemented
-
Work required: aMuTorrent now prefers final operation/resource routes for transfers, servers, shared reload, and search-result download.
-
Response envelopes
- Status: implemented
-
Work required: Native REST now always emits
{data, meta}success envelopes and{error:{code,message,details}}errors; aMuTorrent unwraps both. -
Torznab search method policy
- Status: implemented
-
Work required: Prowlarr/Torznab movie and TV searches dispatch REST
videosearches through connectedglobalfirst and connectedkadsecond, combining connected-network results; other families keep the native automatic policy. -
qBittorrent transfer delete semantics
- Status: implemented
-
Work required: qBit-compatible delete requests always forward native transfer cancel with
deleteFiles:true; eMule does not provide a partial-state-preserving delete for incomplete transfers. -
Shared-file deletion
- Status: implemented
-
Work required: Shared deletes call
/shared-files/{hash}instead of transfer delete helpers. -
Uploads in data pipeline
- Status: implemented
-
Work required:
/uploadsrows remain preserved through the eMuleBB manager fetch result. -
Transfer detail hydration
- Status: implemented
-
Work required: aMuTorrent hydrates peers plus part/source detail from
/transfers/{hash}/details. -
Search polling
- Status: implemented
-
Work required: aMuTorrent stores the returned
idand polls/searches/{searchId}for results. -
Browser smoke
- Status: implemented
- Work required:
emulebb-build-testsnow ownsamutorrent-browser-smoke.py, launched from the aggregate live E2E suite.
Arr And qBittorrent-Compatible Adapter Boundary¶
The /api/v2 routes are a compatibility adapter for Arr download-client
integration. Completeness for this surface means the Arr suite can authenticate,
test the qBittorrent-shaped client, add releases, inspect downloads, update
Arr-relevant transfer state, assign categories, pause/resume/start/stop where
Arr expects those verbs, and remove transfers.
The /api/v2 adapter is not a full qBittorrent Web API clone. Unrelated
qBittorrent features such as RSS, tracker editing, peer-management, sync,
logging, ban lists, global speed controls, and full content-layout operations
remain outside the release contract unless a future Arr compatibility need makes
one of them part of the adapter purpose.
Release Gate¶
The completed REST parity surface is kept current by these supported workspace entrypoints:
| Gate | Status |
|---|---|
| eMule app validation/build/tests | implemented |
| Native REST route and contract tests | implemented |
| Live eMule REST E2E completeness lane | implemented |
| aMuTorrent Node eMuleBB tests | implemented |
| Live aMuTorrent browser smoke against eMuleBB | implemented |