diff --git a/WebUI-API-(qBittorrent-5.0).md b/WebUI-API-(qBittorrent-5.0).md new file mode 100644 index 0000000..8d85005 --- /dev/null +++ b/WebUI-API-(qBittorrent-5.0).md @@ -0,0 +1,3277 @@ +This WebUI API documentation applies to qBittorrent v5.0+. For other WebUI API versions, visit [WebUI API](https://github.com/qbittorrent/qBittorrent/wiki#WebUI-API). + +# Table of Contents # + +1. [Changes](#changes) + 1. [API v2.9.3](#api-v293) + 2. [API v2.11.3](#api-v2113) +1. [General information](#general-information) +1. [Authentication](#authentication) + 1. [Login](#login) + 1. [Logout](#logout) +1. [Application](#application) + 1. [Get application version](#get-application-version) + 1. [Get API version](#get-api-version) + 1. [Get build info](#get-build-info) + 1. [Shutdown application](#shutdown-application) + 1. [Get application preferences](#get-application-preferences) + 1. [Set application preferences](#set-application-preferences) + 1. [Get default save path](#get-default-save-path) + 1. [Get cookies](#get-cookies) + 1. [Set cookies](#set-cookies) +1. [Log](#log) + 1. [Get log](#get-log) + 1. [Get peer log](#get-peer-log) +1. [Sync](#sync) + 1. [Get main data](#get-main-data) + 1. [Get torrent peers data](#get-torrent-peers-data) +1. [Transfer info](#transfer-info) + 1. [Get global transfer info](#get-global-transfer-info) + 1. [Get alternative speed limits state](#get-alternative-speed-limits-state) + 1. [Toggle alternative speed limits](#toggle-alternative-speed-limits) + 1. [Get global download limit](#get-global-download-limit) + 1. [Set global download limit](#set-global-download-limit) + 1. [Get global upload limit](#get-global-upload-limit) + 1. [Set global upload limit](#set-global-upload-limit) + 1. [Ban peers](#ban-peers) +1. [Torrent management](#torrent-management) + 1. [Get torrent list](#get-torrent-list) + 1. [Get torrent generic properties](#get-torrent-generic-properties) + 1. [Get torrent trackers](#get-torrent-trackers) + 1. [Get torrent web seeds](#get-torrent-web-seeds) + 1. [Get torrent contents](#get-torrent-contents) + 1. [Get torrent pieces' states](#get-torrent-pieces-states) + 1. [Get torrent pieces' hashes](#get-torrent-pieces-hashes) + 1. [Pause torrents](#pause-torrents) + 1. [Resume torrents](#resume-torrents) + 1. [Delete torrents](#delete-torrents) + 1. [Recheck torrents](#recheck-torrents) + 1. [Reannounce torrents](#reannounce-torrents) + 1. [Edit trackers](#edit-trackers) + 1. [Remove trackers](#remove-trackers) + 1. [Add peers](#add-peers) + 1. [Add new torrent](#add-new-torrent) + 1. [Add trackers to torrent](#add-trackers-to-torrent) + 1. [Increase torrent priority](#increase-torrent-priority) + 1. [Decrease torrent priority](#decrease-torrent-priority) + 1. [Maximal torrent priority](#maximal-torrent-priority) + 1. [Minimal torrent priority](#minimal-torrent-priority) + 1. [Set file priority](#set-file-priority) + 1. [Get torrent download limit](#get-torrent-download-limit) + 1. [Set torrent download limit](#set-torrent-download-limit) + 1. [Set torrent share limit](#set-torrent-share-limit) + 1. [Get torrent upload limit](#get-torrent-upload-limit) + 1. [Set torrent upload limit](#set-torrent-upload-limit) + 1. [Set torrent location](#set-torrent-location) + 1. [Set torrent name](#set-torrent-name) + 1. [Set torrent category](#set-torrent-category) + 1. [Get all categories](#get-all-categories) + 1. [Add new category](#add-new-category) + 1. [Edit category](#edit-category) + 1. [Remove categories](#remove-categories) + 1. [Add torrent tags](#add-torrent-tags) + 1. [Remove torrent tags](#remove-torrent-tags) + 1. [Get all tags](#get-all-tags) + 1. [Create tags](#create-tags) + 1. [Delete tags](#delete-tags) + 1. [Set automatic torrent management](#set-automatic-torrent-management) + 1. [Toggle sequential download](#toggle-sequential-download) + 1. [Set first/last piece priority](#set-firstlast-piece-priority) + 1. [Set force start](#set-force-start) + 1. [Set super seeding](#set-super-seeding) + 1. [Rename file](#rename-file) + 1. [Rename folder](#rename-folder) +1. [RSS (experimental)](#rss-experimental) + 1. [Add folder](#add-folder) + 1. [Add feed](#add-feed) + 1. [Remove item](#remove-item) + 1. [Move item](#move-item) + 1. [Get all items](#get-all-items) + 1. [Mark as read](#mark-as-read) + 1. [Refresh item](#refresh-item) + 1. [Set auto-downloading rule](#set-auto-downloading-rule) + 1. [Rename auto-downloading rule](#rename-auto-downloading-rule) + 1. [Remove auto-downloading rule](#remove-auto-downloading-rule) + 1. [Get all auto-downloading rules](#get-all-auto-downloading-rules) + 1. [Get all articles matching a rule](#get-all-articles-matching-a-rule) +1. [Search](#search) + 1. [Start search](#start-search) + 1. [Stop search](#stop-search) + 1. [Get search status](#get-search-status) + 1. [Get search results](#get-search-results) + 1. [Delete search](#delete-search) + 1. [Get search plugins](#get-search-plugins) + 1. [Install search plugin](#install-search-plugin) + 1. [Uninstall search plugin](#uninstall-search-plugin) + 1. [Enable search plugin](#enable-search-plugin) + 1. [Update search plugins](#update-search-plugins) +1. [WebAPI versioning](#webapi-versioning) + +*** + +# Changes # + +## API v2.9.3 ## +- Added `reannounce` to `/torrents/info` ([#19571](https://github.com/qbittorrent/qBittorrent/pull/19571)) + +## API v2.11.3 ## +- Add APIs for managing cookies` ([#21340](https://github.com/qbittorrent/qBittorrent/pull/21340)) +- Remove `cookie` field from `/torrents/add` request + +# General Information # + +- All API methods follows the format `/api/v2/APIName/methodName`, where `APIName` is a certain subgroup of API methods whose functionality is related. +- All API methods only allows `GET` or `POST` methods. Use `POST` when you are mutating some state (or when your request is too big to fit into `GET`) and use `GET` otherwise. Starting with qBittorrent v4.4.4, server will return `405 Method Not Allowed` when you used the wrong request method. +- All API methods require [authentication](#authentication) (except `/api/v2/auth/login`, obviously). + +# Authentication # + +All Authentication API methods are under "auth", e.g.: `/api/v2/auth/methodName`. + +qBittorrent uses cookie-based authentication. + +## Login ## + +Name: `login` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`username` | string | Username used to access the WebUI +`password` | string | Password used to access the WebUI + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +403 | User's IP is banned for too many failed login attempts +200 | All other scenarios + +Upon success, the response will contain a cookie with your SID. You must supply the cookie whenever you want to perform an operation that requires authentication. + +Example showing how to login and execute a command that requires authentication using `curl`: + +```sh +$ curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login +HTTP/1.1 200 OK +Content-Encoding: +Content-Length: 3 +Content-Type: text/plain; charset=UTF-8 +Set-Cookie: SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ; path=/ +$ curl http://localhost:8080/api/v2/torrents/info --cookie "SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ" +``` + +Note: Set `Referer` or `Origin` header to the exact same domain and port as used in the HTTP query `Host` header. + +## Logout ## + +Name: `logout` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +# Application # + +All Application API methods are under "app", e.g.: `/api/v2/app/methodName`. + +## Get application version ## + +Name: `version` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is a string with the application version, e.g. `v4.1.3` + +## Get API version ## + +Name: `webapiVersion` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is a string with the WebAPI version, e.g. `2.0` + +## Get build info ## + +Name: `buildInfo` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON object containing the following fields + +Property | Type | Description +-------------|---------|------------ +`qt` | string | QT version +`libtorrent` | string | libtorrent version +`boost` | string | Boost version +`openssl` | string | OpenSSL version +`bitness` | int | Application bitness (e.g. 64-bit) + +## Shutdown application ## + +Name: `shutdown` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Get application preferences ## + +Name: `preferences` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON object with several fields (key-value) pairs representing the application's settings. The contents may vary depending on which settings are present in qBittorrent.ini. + +Possible fields: + +Property | Type | Description +-----------------------------------------|---------|------------ +`locale` | string | Currently selected language (e.g. en_GB for English) +`create_subfolder_enabled` | bool | True if a subfolder should be created when adding a torrent +`start_paused_enabled` | bool | True if torrents should be added in a Paused state +`auto_delete_mode` | integer | TODO +`preallocate_all` | bool | True if disk space should be pre-allocated for all files +`incomplete_files_ext` | bool | True if ".!qB" should be appended to incomplete files +`auto_tmm_enabled` | bool | True if Automatic Torrent Management is enabled by default +`torrent_changed_tmm_enabled` | bool | True if torrent should be relocated when its Category changes +`save_path_changed_tmm_enabled` | bool | True if torrent should be relocated when the default save path changes +`category_changed_tmm_enabled` | bool | True if torrent should be relocated when its Category's save path changes +`save_path` | string | Default save path for torrents, separated by slashes +`temp_path_enabled` | bool | True if folder for incomplete torrents is enabled +`temp_path` | string | Path for incomplete torrents, separated by slashes +`scan_dirs` | object | Property: directory to watch for torrent files, value: where torrents loaded from this directory should be downloaded to (see list of possible values below). Slashes are used as path separators; multiple key/value pairs can be specified +`export_dir` | string | Path to directory to copy .torrent files to. Slashes are used as path separators +`export_dir_fin` | string | Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators +`mail_notification_enabled` | bool | True if e-mail notification should be enabled +`mail_notification_sender` | string | e-mail where notifications should originate from +`mail_notification_email` | string | e-mail to send notifications to +`mail_notification_smtp` | string | smtp server for e-mail notifications +`mail_notification_ssl_enabled` | bool | True if smtp server requires SSL connection +`mail_notification_auth_enabled` | bool | True if smtp server requires authentication +`mail_notification_username` | string | Username for smtp authentication +`mail_notification_password` | string | Password for smtp authentication +`autorun_enabled` | bool | True if external program should be run after torrent has finished downloading +`autorun_program` | string | Program path/name/arguments to run if `autorun_enabled` is enabled; path is separated by slashes; you can use `%f` and `%n` arguments, which will be expanded by qBittorent as path_to_torrent_file and torrent_name (from the GUI; not the .torrent file name) respectively +`queueing_enabled` | bool | True if torrent queuing is enabled +`max_active_downloads` | integer | Maximum number of active simultaneous downloads +`max_active_torrents` | integer | Maximum number of active simultaneous downloads and uploads +`max_active_uploads` | integer | Maximum number of active simultaneous uploads +`dont_count_slow_torrents` | bool | If true torrents w/o any activity (stalled ones) will not be counted towards `max_active_*` limits; see [dont_count_slow_torrents](https://www.libtorrent.org/reference-Settings.html#dont_count_slow_torrents) for more information +`slow_torrent_dl_rate_threshold` | integer | Download rate in KiB/s for a torrent to be considered "slow" +`slow_torrent_ul_rate_threshold` | integer | Upload rate in KiB/s for a torrent to be considered "slow" +`slow_torrent_inactive_timer` | integer | Seconds a torrent should be inactive before considered "slow" +`max_ratio_enabled` | bool | True if share ratio limit is enabled +`max_ratio` | float | Get the global share ratio limit +`max_ratio_act` | integer | Action performed when a torrent reaches the maximum share ratio. See list of possible values here below. +`listen_port` | integer | Port for incoming connections +`upnp` | bool | True if UPnP/NAT-PMP is enabled +`random_port` | bool | True if the port is randomly selected +`dl_limit` | integer | Global download speed limit in KiB/s; `-1` means no limit is applied +`up_limit` | integer | Global upload speed limit in KiB/s; `-1` means no limit is applied +`max_connec` | integer | Maximum global number of simultaneous connections +`max_connec_per_torrent` | integer | Maximum number of simultaneous connections per torrent +`max_uploads` | integer | Maximum number of upload slots +`max_uploads_per_torrent` | integer | Maximum number of upload slots per torrent +`stop_tracker_timeout` | integer | Timeout in seconds for a `stopped` announce request to trackers +`enable_piece_extent_affinity` | bool | True if the advanced libtorrent option `piece_extent_affinity` is enabled +`bittorrent_protocol` | integer | Bittorrent Protocol to use (see list of possible values below) +`limit_utp_rate` | bool | True if `[du]l_limit` should be applied to uTP connections; this option is only available in qBittorent built against libtorrent version 0.16.X and higher +`limit_tcp_overhead` | bool | True if `[du]l_limit` should be applied to estimated TCP overhead (service data: e.g. packet headers) +`limit_lan_peers` | bool | True if `[du]l_limit` should be applied to peers on the LAN +`alt_dl_limit` | integer | Alternative global download speed limit in KiB/s +`alt_up_limit` | integer | Alternative global upload speed limit in KiB/s +`scheduler_enabled` | bool | True if alternative limits should be applied according to schedule +`schedule_from_hour` | integer | Scheduler starting hour +`schedule_from_min` | integer | Scheduler starting minute +`schedule_to_hour` | integer | Scheduler ending hour +`schedule_to_min` | integer | Scheduler ending minute +`scheduler_days` | integer | Scheduler days. See possible values here below +`dht` | bool | True if DHT is enabled +`pex` | bool | True if PeX is enabled +`lsd` | bool | True if LSD is enabled +`encryption` | integer | See list of possible values here below +`anonymous_mode` | bool | If true anonymous mode will be enabled; read more [here](Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher +`proxy_type` | integer | See list of possible values here below +`proxy_ip` | string | Proxy IP address or domain name +`proxy_port` | integer | Proxy port +`proxy_peer_connections` | bool | True if peer and web seed connections should be proxified; this option will have any effect only in qBittorent built against libtorrent version 0.16.X and higher +`proxy_auth_enabled` | bool | True proxy requires authentication; doesn't apply to SOCKS4 proxies +`proxy_username` | string | Username for proxy authentication +`proxy_password` | string | Password for proxy authentication +`proxy_torrents_only` | bool | True if proxy is only used for torrents +`ip_filter_enabled` | bool | True if external IP filter should be enabled +`ip_filter_path` | string | Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes +`ip_filter_trackers` | bool | True if IP filters are applied to trackers +`web_ui_domain_list` | string | Semicolon-separated list of domains to accept when performing Host header validation +`web_ui_address` | string | IP address to use for the WebUI +`web_ui_port` | integer | WebUI port +`web_ui_upnp` | bool | True if UPnP is used for the WebUI port +`web_ui_username` | string | WebUI username +`web_ui_password` | string | For API ≥ v2.3.0: Plaintext WebUI password, not readable, write-only. For API < v2.3.0: MD5 hash of WebUI password, hash is generated from the following string: `username:Web UI Access:plain_text_web_ui_password` +`web_ui_csrf_protection_enabled` | bool | True if WebUI CSRF protection is enabled +`web_ui_clickjacking_protection_enabled` | bool | True if WebUI clickjacking protection is enabled +`web_ui_secure_cookie_enabled` | bool | True if WebUI cookie `Secure` flag is enabled +`web_ui_max_auth_fail_count` | integer | Maximum number of authentication failures before WebUI access ban +`web_ui_ban_duration` | integer | WebUI access ban duration in seconds +`web_ui_session_timeout` | integer | Seconds until WebUI is automatically signed off +`web_ui_host_header_validation_enabled` | bool | True if WebUI host header validation is enabled +`bypass_local_auth` | bool | True if authentication challenge for loopback address (127.0.0.1) should be disabled +`bypass_auth_subnet_whitelist_enabled` | bool | True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist +`bypass_auth_subnet_whitelist` | string | (White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas +`alternative_webui_enabled` | bool | True if an alternative WebUI should be used +`alternative_webui_path` | string | File path to the alternative WebUI +`use_https` | bool | True if WebUI HTTPS access is enabled +`ssl_key` | string | For API < v2.0.1: SSL keyfile contents (this is a not a path) +`ssl_cert` | string | For API < v2.0.1: SSL certificate contents (this is a not a path) +`web_ui_https_key_path` | string | For API ≥ v2.0.1: Path to SSL keyfile +`web_ui_https_cert_path` | string | For API ≥ v2.0.1: Path to SSL certificate +`dyndns_enabled` | bool | True if server DNS should be updated dynamically +`dyndns_service` | integer | See list of possible values here below +`dyndns_username` | string | Username for DDNS service +`dyndns_password` | string | Password for DDNS service +`dyndns_domain` | string | Your DDNS domain name +`rss_refresh_interval` | integer | RSS refresh interval +`rss_max_articles_per_feed` | integer | Max stored articles per RSS feed +`rss_processing_enabled` | bool | Enable processing of RSS feeds +`rss_auto_downloading_enabled` | bool | Enable auto-downloading of torrents from the RSS feeds +`rss_download_repack_proper_episodes` | bool | For API ≥ v2.5.1: Enable downloading of repack/proper Episodes +`rss_smart_episode_filters` | string | For API ≥ v2.5.1: List of RSS Smart Episode Filters +`add_trackers_enabled` | bool | Enable automatic adding of trackers to new torrents +`add_trackers` | string | List of trackers to add to new torrent +`web_ui_use_custom_http_headers_enabled` | bool | For API ≥ v2.5.1: Enable custom http headers +`web_ui_custom_http_headers` | string | For API ≥ v2.5.1: List of custom http headers +`max_seeding_time_enabled` | bool | True enables max seeding time +`max_seeding_time` | integer | Number of minutes to seed a torrent +`announce_ip` | string | TODO +`announce_to_all_tiers` | bool | True always announce to all tiers +`announce_to_all_trackers` | bool | True always announce to all trackers in a tier +`async_io_threads` | integer | Number of asynchronous I/O threads +`banned_IPs` | string | List of banned IPs +`checking_memory_use` | integer | Outstanding memory when checking torrents in MiB +`current_interface_address` | string | IP Address to bind to. Empty String means All addresses +`current_network_interface` | string | Network Interface used +`disk_cache` | integer | Disk cache used in MiB +`disk_cache_ttl` | integer | Disk cache expiry interval in seconds +`embedded_tracker_port` | integer | Port used for embedded tracker +`enable_coalesce_read_write` | bool | True enables coalesce reads & writes +`enable_embedded_tracker` | bool | True enables embedded tracker +`enable_multi_connections_from_same_ip` | bool | True allows multiple connections from the same IP address +`enable_os_cache` | bool | True enables os cache +`enable_upload_suggestions` | bool | True enables sending of upload piece suggestions +`file_pool_size` | integer | File pool size +`outgoing_ports_max` | integer | Maximal outgoing port (0: Disabled) +`outgoing_ports_min` | integer | Minimal outgoing port (0: Disabled) +`recheck_completed_torrents` | bool | True rechecks torrents on completion +`resolve_peer_countries` | bool | True resolves peer countries +`save_resume_data_interval` | integer | Save resume data interval in min +`send_buffer_low_watermark` | integer | Send buffer low watermark in KiB +`send_buffer_watermark` | integer | Send buffer watermark in KiB +`send_buffer_watermark_factor` | integer | Send buffer watermark factor in percent +`socket_backlog_size` | integer | Socket backlog size +`upload_choking_algorithm` | integer | Upload choking algorithm used (see list of possible values below) +`upload_slots_behavior` | integer | Upload slots behavior used (see list of possible values below) +`upnp_lease_duration` | integer | UPnP lease duration (0: Permanent lease) +`utp_tcp_mixed_mode` | integer | μTP-TCP mixed mode algorithm (see list of possible values below) + +Possible values of `scan_dirs`: + +Value | Description +----------------------------|------------ +`0` | Download to the monitored folder +`1` | Download to the default save path +`"/path/to/download/to"` | Download to this path + +Possible values of `scheduler_days`: + +Value | Description +-------|------------ +`0` | Every day +`1` | Every weekday +`2` | Every weekend +`3` | Every Monday +`4` | Every Tuesday +`5` | Every Wednesday +`6` | Every Thursday +`7` | Every Friday +`8` | Every Saturday +`9` | Every Sunday + +Possible values of `encryption`: + +Value | Description +-------|------------ +`0` | Prefer encryption +`1` | Force encryption on +`2` | Force encryption off + +NB: the first options allows you to use both encrypted and unencrypted connections (this is the default); other options are mutually exclusive: e.g. by forcing encryption on you won't be able to use unencrypted connections and vice versa. + +Possible values of `proxy_type`: + +Value | Description +------|------------ +`-1` | Proxy is disabled +`1` | HTTP proxy without authentication +`2` | SOCKS5 proxy without authentication +`3` | HTTP proxy with authentication +`4` | SOCKS5 proxy with authentication +`5` | SOCKS4 proxy without authentication + +Possible values of `dyndns_service`: + +Value | Description +-------|------------ +`0` | Use DyDNS +`1` | Use NOIP + +Possible values of `max_ratio_act`: + +Value | Description +------|------------ +`0` | Pause torrent +`1` | Remove torrent + +Possible values of `bittorrent_protocol`: + +Value | Description +-------|------------ +`0` | TCP and μTP +`1` | TCP +`2` | μTP + +Possible values of `upload_choking_algorithm`: + +Value | Description +-------|------------ +`0` | Round-robin +`1` | Fastest upload +`2` | Anti-leech + +Possible values of `upload_slots_behavior`: + +Value | Description +-------|------------ +`0` | Fixed slots +`1` | Upload rate based + +Possible values of `utp_tcp_mixed_mode`: + +Value | Description +-------|------------ +`0` | Prefer TCP +`1` | Peer proportional + +Example: + +```JSON +{ + "add_trackers": "", + "add_trackers_enabled": false, + "alt_dl_limit": 10240, + "alt_up_limit": 10240, + "alternative_webui_enabled": false, + "alternative_webui_path": "/home/user/Documents/qbit-webui", + "announce_ip": "", + "announce_to_all_tiers": true, + "announce_to_all_trackers": false, + "anonymous_mode": false, + "async_io_threads": 4, + "auto_delete_mode": 0, + "auto_tmm_enabled": false, + "autorun_enabled": false, + "autorun_program": "", + "banned_IPs": "", + "bittorrent_protocol": 0, + "bypass_auth_subnet_whitelist": "", + "bypass_auth_subnet_whitelist_enabled": false, + "bypass_local_auth": false, + "category_changed_tmm_enabled": false, + "checking_memory_use": 32, + "create_subfolder_enabled": true, + "current_interface_address": "", + "current_network_interface": "", + "dht": true, + "disk_cache": -1, + "disk_cache_ttl": 60, + "dl_limit": 0, + "dont_count_slow_torrents": false, + "dyndns_domain": "changeme.dyndns.org", + "dyndns_enabled": false, + "dyndns_password": "", + "dyndns_service": 0, + "dyndns_username": "", + "embedded_tracker_port": 9000, + "enable_coalesce_read_write": false, + "enable_embedded_tracker": false, + "enable_multi_connections_from_same_ip": false, + "enable_os_cache": true, + "enable_piece_extent_affinity": false, + "enable_upload_suggestions": false, + "encryption": 0, + "export_dir": "/home/user/Downloads/all", + "export_dir_fin": "/home/user/Downloads/completed", + "file_pool_size": 40, + "incomplete_files_ext": false, + "ip_filter_enabled": false, + "ip_filter_path": "", + "ip_filter_trackers": false, + "limit_lan_peers": true, + "limit_tcp_overhead": false, + "limit_utp_rate": true, + "listen_port": 58925, + "locale": "en", + "lsd": true, + "mail_notification_auth_enabled": false, + "mail_notification_email": "", + "mail_notification_enabled": false, + "mail_notification_password": "", + "mail_notification_sender": "qBittorrent_notification@example.com", + "mail_notification_smtp": "smtp.changeme.com", + "mail_notification_ssl_enabled": false, + "mail_notification_username": "", + "max_active_downloads": 3, + "max_active_torrents": 5, + "max_active_uploads": 3, + "max_connec": 500, + "max_connec_per_torrent": 100, + "max_ratio": -1, + "max_ratio_act": 0, + "max_ratio_enabled": false, + "max_seeding_time": -1, + "max_seeding_time_enabled": false, + "max_uploads": -1, + "max_uploads_per_torrent": -1, + "outgoing_ports_max": 0, + "outgoing_ports_min": 0, + "pex": true, + "preallocate_all": false, + "proxy_auth_enabled": false, + "proxy_ip": "0.0.0.0", + "proxy_password": "", + "proxy_peer_connections": false, + "proxy_port": 8080, + "proxy_torrents_only": false, + "proxy_type": 0, + "proxy_username": "", + "queueing_enabled": false, + "random_port": false, + "recheck_completed_torrents": false, + "resolve_peer_countries": true, + "rss_auto_downloading_enabled":true, + "rss_download_repack_proper_episodes":true, + "rss_max_articles_per_feed":50, + "rss_processing_enabled":true, + "rss_refresh_interval":30, + "rss_smart_episode_filters":"s(\\d+)e(\\d+)\n(\\d+)x(\\d+)\n(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", + "save_path": "/home/user/Downloads/", + "save_path_changed_tmm_enabled": false, + "save_resume_data_interval": 60, + "scan_dirs": + { + "/home/user/Downloads/incoming/games": 0, + "/home/user/Downloads/incoming/movies": 1, + }, + "schedule_from_hour": 8, + "schedule_from_min": 0, + "schedule_to_hour": 20, + "schedule_to_min": 0, + "scheduler_days": 0, + "scheduler_enabled": false, + "send_buffer_low_watermark": 10, + "send_buffer_watermark": 500, + "send_buffer_watermark_factor": 50, + "slow_torrent_dl_rate_threshold": 2, + "slow_torrent_inactive_timer": 60, + "slow_torrent_ul_rate_threshold": 2, + "socket_backlog_size": 30, + "start_paused_enabled": false, + "stop_tracker_timeout": 1, + "temp_path": "/home/user/Downloads/temp", + "temp_path_enabled": false, + "torrent_changed_tmm_enabled": true, + "up_limit": 0, + "upload_choking_algorithm": 1, + "upload_slots_behavior": 0, + "upnp": true, + "use_https": false, + "utp_tcp_mixed_mode": 0, + "web_ui_address": "*", + "web_ui_ban_duration": 3600, + "web_ui_clickjacking_protection_enabled": true, + "web_ui_csrf_protection_enabled": true, + "web_ui_custom_http_headers": "", + "web_ui_domain_list": "*", + "web_ui_host_header_validation_enabled": true, + "web_ui_https_cert_path": "", + "web_ui_https_key_path": "", + "web_ui_max_auth_fail_count": 5, + "web_ui_port": 8080, + "web_ui_secure_cookie_enabled": true, + "web_ui_session_timeout": 3600, + "web_ui_upnp": false, + "web_ui_use_custom_http_headers_enabled": false, + "web_ui_username": "admin" +} +``` + +## Set application preferences ## + +Name: `setPreferences` + +**Parameters:** + +A json object with key-value pairs of the settings you want to change and their new values. + +Example: + +```JSON +json={"save_path":"C:/Users/Dayman/Downloads","queueing_enabled":false,"scan_dirs":{"C:/Games": 0,"D:/Downloads": 1}} +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +**Notes**: + + 1. There is no need to pass all possible preferences' `token:value` pairs if you only want to change one option + 1. Paths in `scan_dirs` must exist, otherwise this option will have no effect + 1. String values must be quoted; integer and boolean values must never be quoted + +For a list of possible preference options see [Get application preferences](#get-application-preferences) + +## Get default save path ## + +Name: `defaultSavePath` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is a string with the default save path, e.g. `C:/Users/Dayman/Downloads`. + +## Get cookies ## + +Name: `cookies` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is a JSON array in which each element is an entry of the log. + +Each element of the array has the following properties: + +Property | Type | Description +-----------------|---------|------------ +`name` | string | Cookie name +`domain` | string | Cookie domain +`path` | string | Cookie path +`value` | string | Cookie value +`expirationDate` | integer | Seconds since epoch + +Example: + +```JSON +[ + { + "name":"Example", + "domain":"example.com", + "path":"/", + "value":"foo=bar" + "expirationDate":1507969127, + }, +] +``` + +## Set cookies ## + +Name: `setCookies` + +**Parameters:** + +A json array of cookies to send when downloading .torrent files. + +Each element of the array has the following properties: + +Property | Type | Description +-----------------|----------|------------ +`name` | string? | Cookie name +`domain` | string? | Cookie domain +`path` | string? | Cookie path +`value` | string? | Cookie value +`expirationDate` | integer? | Seconds since epoch + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | Cookies were saved +400 | Request was not a valid json array of cookie objects + +# Log # + +All Log API methods are under "log", e.g.: `/api/v2/log/methodName`. + +## Get log ## + +Name: `main` + +**Parameters:** + +Parameter | Type | Description +----------------|---------|------------ +`normal` | bool | Include normal messages (default: `true`) +`info` | bool | Include info messages (default: `true`) +`warning` | bool | Include warning messages (default: `true`) +`critical` | bool | Include critical messages (default: `true`) +`last_known_id` | integer | Exclude messages with "message id" <= `last_known_id` (default: `-1`) + +Example: + +```http +/api/v2/log/main?normal=true&info=true&warning=true&critical=true&last_known_id=-1 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON array in which each element is an entry of the log. + +Each element of the array has the following properties: + +Property | Type | Description +------------|---------|------------ +`id` | integer | ID of the message +`message` | string | Text of the message +`timestamp` | integer | Seconds since epoch (Note: switched from milliseconds to seconds in v4.5.0) +`type` | integer | Type of the message: Log::NORMAL: `1`, Log::INFO: `2`, Log::WARNING: `4`, Log::CRITICAL: `8` + +Example: + +```JSON +[ + { + "id":0, + "message":"qBittorrent v3.4.0 started", + "timestamp":1507969127, + "type":1 + }, + { + "id":1, + "message":"qBittorrent is trying to listen on any interface port: 19036", + "timestamp":1507969127, + "type":2 + }, + { + "id":2, + "message":"Peer ID: -qB3400-", + "timestamp":1507969127, + "type":1 + }, + { + "id":3, + "message":"HTTP User-Agent is 'qBittorrent/3.4.0'", + "timestamp":1507969127, + "type":1 + }, + { + "id":4, + "message":"DHT support [ON]", + "timestamp":1507969127, + "type":2 + }, + { + "id":5, + "message":"Local Peer Discovery support [ON]", + "timestamp":1507969127, + "type":2 + }, + { + "id":6, + "message":"PeX support [ON]", + "timestamp":1507969127, + "type":2 + }, + { + "id":7, + "message":"Anonymous mode [OFF]", + "timestamp":1507969127, + "type":2 + }, + { + "id":8, + "message":"Encryption support [ON]", + "timestamp":1507969127, + "type":2 + }, + { + "id":9, + "message":"Embedded Tracker [OFF]", + "timestamp":1507969127, + "type":2 + }, + { + "id":10, + "message":"UPnP / NAT-PMP support [ON]", + "timestamp":1507969127, + "type":2 + }, + { + "id":11, + "message":"Web UI: Now listening on port 8080", + "timestamp":1507969127, + "type":1 + }, + { + "id":12, + "message":"Options were saved successfully.", + "timestamp":1507969128, + "type":1 + }, + { + "id":13, + "message":"qBittorrent is successfully listening on interface :: port: TCP/19036", + "timestamp":1507969128, + "type":2 + }, + { + "id":14, + "message":"qBittorrent is successfully listening on interface 0.0.0.0 port: TCP/19036", + "timestamp":1507969128, + "type":2 + }, + { + "id":15, + "message":"qBittorrent is successfully listening on interface 0.0.0.0 port: UDP/19036", + "timestamp":1507969128, + "type":2 + } +] +``` + +## Get peer log ## + +Name: `peers` + +**Parameters:** + +Parameter | Type | Description +----------------|---------|------------ +`last_known_id` | integer | Exclude messages with "message id" <= `last_known_id` (default: `-1`) + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response a JSON array. Each element of the array of objects (each object is the information relative to a peer) containing the following fields + +Property | Type | Description +------------|---------|------------ +`id` | integer | ID of the peer +`ip` | string | IP of the peer +`timestamp` | integer | Seconds since epoch +`blocked` | boolean | Whether or not the peer was blocked +`reason` | string | Reason of the block + +# Sync # + +Sync API implements requests for obtaining changes since the last request. +All Sync API methods are under "sync", e.g.: `/api/v2/sync/methodName`. + +## Get main data ## + +Name: `maindata` + +**Parameters:** + +Parameter | Type | Description +----------|---------|------------ +`rid` | integer | Response ID. If not provided, `rid=0` will be assumed. If the given `rid` is different from the one of last server reply, `full_update` will be `true` (see the server reply details for more info) + +Example: + +```http +/api/v2/sync/maindata?rid=14 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON object with the following possible fields + +Property | Type | Description +------------------------------|---------|------------ +`rid` | integer | Response ID +`full_update` | bool | Whether the response contains all the data or partial data +`torrents` | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list) +`torrents_removed` | array | List of hashes of torrents removed since last request +`categories` | object | Info for categories added since last request +`categories_removed` | array | List of categories removed since last request +`tags` | array | List of tags added since last request +`tags_removed` | array | List of tags removed since last request +`server_state` | object | Global transfer info + +Example: + +```JSON +{ + "rid":15, + "torrents": + { + "8c212779b4abde7c6bc608063a0d008b7e40ce32": + { + "state":"pausedUP" + } + } +} +``` + +## Get torrent peers data ## + +Name: `torrentPeers` + +**Parameters:** + +Parameter | Type | Description +----------|---------|------------ +`hash` | string | Torrent hash +`rid` | integer | Response ID. If not provided, `rid=0` will be assumed. If the given `rid` is different from the one of last server reply, `full_update` will be `true` (see the server reply details for more info) + +Example: + +```http +/api/v2/sync/torrentPeers?hash=8c212779b4abde7c6bc608063a0d008b7e40ce32?rid=14 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is TODO + +# Transfer info # + +All Transfer info API methods are under "transfer", e.g.: `/api/v2/transfer/methodName`. + +## Get global transfer info ## + +This method returns info you usually see in qBt status bar. + +Name: `info` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON object with the following fields + +Property | Type | Description +--------------------|---------|------------ +`dl_info_speed` | integer | Global download rate (bytes/s) +`dl_info_data` | integer | Data downloaded this session (bytes) +`up_info_speed` | integer | Global upload rate (bytes/s) +`up_info_data` | integer | Data uploaded this session (bytes) +`dl_rate_limit` | integer | Download rate limit (bytes/s) +`up_rate_limit` | integer | Upload rate limit (bytes/s) +`dht_nodes` | integer | DHT nodes connected to +`connection_status` | string | Connection status. See possible values here below + +In addition to the above in partial data requests (see [Get partial data](#get-partial-data) for more info): + +Property | Type | Description +-----------------------|---------|------------ +`queueing` | bool | True if torrent queueing is enabled +`use_alt_speed_limits` | bool | True if alternative speed limits are enabled +`refresh_interval` | integer | Transfer list refresh interval (milliseconds) + +Possible values of `connection_status`: + +Value | +--------------------| +`connected` | +`firewalled` | +`disconnected` | + +Example: + +```JSON +{ + "connection_status":"connected", + "dht_nodes":386, + "dl_info_data":681521119, + "dl_info_speed":0, + "dl_rate_limit":0, + "up_info_data":10747904, + "up_info_speed":0, + "up_rate_limit":1048576 +} +``` + +## Get alternative speed limits state ## + +Name: `speedLimitsMode` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is `1` if alternative speed limits are enabled, `0` otherwise. + +## Toggle alternative speed limits ## + +Name: `toggleSpeedLimitsMode` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Get global download limit ## + +Name: `downloadLimit` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is the value of current global download speed limit in bytes/second; this value will be zero if no limit is applied. + +## Set global download limit ## + +Name: `setDownloadLimit` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`limit` | integer | The global download speed limit to set in bytes/second + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Get global upload limit ## + +Name: `uploadLimit` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +The response is the value of current global upload speed limit in bytes/second; this value will be zero if no limit is applied. + +## Set global upload limit ## + +Name: `setUploadLimit` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`limit` | integer | The global upload speed limit to set in bytes/second + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Ban peers ## + +Name: `banPeers` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`peers` | string | The peer to ban, or multiple peers separated by a pipe `\|`. Each peer is a colon-separated `host:port` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +# Torrent management # + +All Torrent management API methods are under "torrents", e.g.: `/api/v2/torrents/methodName`. + +## Get torrent list ## + +Name: `info` + +**Parameters:** + +Parameter | Type | Description +----------------------|---------|------------ +`filter` _optional_ | string | Filter torrent list by state. Allowed state filters: `all`, `downloading`, `seeding`, `completed`, `paused`, `active`, `inactive`, `resumed`, `stalled`, `stalled_uploading`, `stalled_downloading`, `errored` +`category` _optional_ | string | Get torrents with the given category (empty string means "without category"; no "category" parameter means "any category"). Remember to URL-encode the category name. For example, `My category` becomes `My%20category` +`tag` _optional_ since 2.8.3 | string | Get torrents with the given tag (empty string means "without tag"; no "tag" parameter means "any tag". Remember to URL-encode the category name. For example, `My tag` becomes `My%20tag` +`sort` _optional_ | string | Sort torrents by given key. They can be sorted using any field of the response's JSON array (which are documented below) as the sort key. +`reverse` _optional_ | bool | Enable reverse sorting. Defaults to `false` +`limit` _optional_ | integer | Limit the number of torrents returned +`offset` _optional_ | integer | Set offset (if less than 0, offset from end) +`hashes` _optional_ | string | Filter by hashes. Can contain multiple hashes separated by `\|` + +Example: + +```http +/api/v2/torrents/info?filter=downloading&category=sample%20category&sort=ratio +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON array with the following fields + +Property | Type | Description +---------------------|---------|------------ +`added_on` | integer | Time (Unix Epoch) when the torrent was added to the client +`amount_left` | integer | Amount of data left to download (bytes) +`auto_tmm` | bool | Whether this torrent is managed by Automatic Torrent Management +`availability` | float | Percentage of file pieces currently available +`category` | string | Category of the torrent +`completed` | integer | Amount of transfer data completed (bytes) +`completion_on` | integer | Time (Unix Epoch) when the torrent completed +`content_path` | string | Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents) +`dl_limit` | integer | Torrent download speed limit (bytes/s). `-1` if unlimited. +`dlspeed` | integer | Torrent download speed (bytes/s) +`downloaded` | integer | Amount of data downloaded +`downloaded_session` | integer | Amount of data downloaded this session +`eta` | integer | Torrent ETA (seconds) +`f_l_piece_prio` | bool | True if first last piece are prioritized +`force_start` | bool | True if force start is enabled for this torrent +`hash` | string | Torrent hash +`isPrivate` | bool | True if torrent is from a private tracker (added in 5.0.0) +`last_activity` | integer | Last time (Unix Epoch) when a chunk was downloaded/uploaded +`magnet_uri` | string | Magnet URI corresponding to this torrent +`max_ratio` | float | Maximum share ratio until torrent is stopped from seeding/uploading +`max_seeding_time` | integer | Maximum seeding time (seconds) until torrent is stopped from seeding +`name` | string | Torrent name +`num_complete` | integer | Number of seeds in the swarm +`num_incomplete` | integer | Number of leechers in the swarm +`num_leechs` | integer | Number of leechers connected to +`num_seeds` | integer | Number of seeds connected to +`priority` | integer | Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode +`progress` | float | Torrent progress (percentage/100) +`ratio` | float | Torrent share ratio. Max ratio value: 9999. +`ratio_limit` | float | TODO (what is different from `max_ratio`?) +`reannounce` | integer | Time until the next tracker reannounce +`save_path` | string | Path where this torrent's data is stored +`seeding_time` | integer | Torrent elapsed time while complete (seconds) +`seeding_time_limit` | integer | TODO (what is different from `max_seeding_time`?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1. +`seen_complete` | integer | Time (Unix Epoch) when this torrent was last seen complete +`seq_dl` | bool | True if sequential download is enabled +`size` | integer | Total size (bytes) of files selected for download +`state` | string | Torrent state. See table here below for the possible values +`super_seeding` | bool | True if super seeding is enabled +`tags` | string | Comma-concatenated tag list of the torrent +`time_active` | integer | Total active time (seconds) +`total_size` | integer | Total size (bytes) of all file in this torrent (including unselected ones) +`tracker` | string | The first tracker with working status. Returns empty string if no tracker is working. +`up_limit` | integer | Torrent upload speed limit (bytes/s). `-1` if unlimited. +`uploaded` | integer | Amount of data uploaded +`uploaded_session` | integer | Amount of data uploaded this session +`upspeed` | integer | Torrent upload speed (bytes/s) + +Possible values of `state`: + +Value | Description +--------------|------------ +`error` | Some error occurred, applies to paused torrents +`missingFiles`| Torrent data files is missing +`uploading` | Torrent is being seeded and data is being transferred +`pausedUP` | Torrent is paused and has finished downloading +`queuedUP` | Queuing is enabled and torrent is queued for upload +`stalledUP` | Torrent is being seeded, but no connection were made +`checkingUP` | Torrent has finished downloading and is being checked +`forcedUP` | Torrent is forced to uploading and ignore queue limit +`allocating` | Torrent is allocating disk space for download +`downloading` | Torrent is being downloaded and data is being transferred +`metaDL` | Torrent has just started downloading and is fetching metadata +`pausedDL` | Torrent is paused and has NOT finished downloading +`queuedDL` | Queuing is enabled and torrent is queued for download +`stalledDL` | Torrent is being downloaded, but no connection were made +`checkingDL` | Same as checkingUP, but torrent has NOT finished downloading +`forcedDL` | Torrent is forced to downloading to ignore queue limit +`checkingResumeData`| Checking resume data on qBt startup +`moving` | Torrent is moving to another location +`unknown` | Unknown status + +Example: + +```JSON +[ + { + "dlspeed":9681262, + "eta":87, + "f_l_piece_prio":false, + "force_start":false, + "hash":"8c212779b4abde7c6bc608063a0d008b7e40ce32", + "category":"", + "tags": "", + "name":"debian-8.1.0-amd64-CD-1.iso", + "num_complete":-1, + "num_incomplete":-1, + "num_leechs":2, + "num_seeds":54, + "priority":1, + "progress":0.16108787059783936, + "ratio":0, + "seq_dl":false, + "size":657457152, + "state":"downloading", + "super_seeding":false, + "upspeed":0, + "isPrivate":true + }, + { + another_torrent_info + } +] +``` + +## Get torrent generic properties ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `properties` + +**Parameters:** + +Parameter | Type | Description +----------|--------|------------ +`hash` | string | The hash of the torrent you want to get the generic properties of + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is: + +- empty, if the torrent hash is invalid +- otherwise, a JSON object with the following fields + +Property | Type | Description +--------------------------|---------|------------ +`save_path` | string | Torrent save path +`creation_date` | integer | Torrent creation date (Unix timestamp) +`piece_size` | integer | Torrent piece size (bytes) +`comment` | string | Torrent comment +`total_wasted` | integer | Total data wasted for torrent (bytes) +`total_uploaded` | integer | Total data uploaded for torrent (bytes) +`total_uploaded_session` | integer | Total data uploaded this session (bytes) +`total_downloaded` | integer | Total data downloaded for torrent (bytes) +`total_downloaded_session`| integer | Total data downloaded this session (bytes) +`up_limit` | integer | Torrent upload limit (bytes/s) +`dl_limit` | integer | Torrent download limit (bytes/s) +`time_elapsed` | integer | Torrent elapsed time (seconds) +`seeding_time` | integer | Torrent elapsed time while complete (seconds) +`nb_connections` | integer | Torrent connection count +`nb_connections_limit` | integer | Torrent connection count limit +`share_ratio` | float | Torrent share ratio +`addition_date` | integer | When this torrent was added (unix timestamp) +`completion_date` | integer | Torrent completion date (unix timestamp) +`created_by` | string | Torrent creator +`dl_speed_avg` | integer | Torrent average download speed (bytes/second) +`dl_speed` | integer | Torrent download speed (bytes/second) +`eta` | integer | Torrent ETA (seconds) +`last_seen` | integer | Last seen complete date (unix timestamp) +`peers` | integer | Number of peers connected to +`peers_total` | integer | Number of peers in the swarm +`pieces_have` | integer | Number of pieces owned +`pieces_num` | integer | Number of pieces of the torrent +`reannounce` | integer | Number of seconds until the next announce +`seeds` | integer | Number of seeds connected to +`seeds_total` | integer | Number of seeds in the swarm +`total_size` | integer | Torrent total size (bytes) +`up_speed_avg` | integer | Torrent average upload speed (bytes/second) +`up_speed` | integer | Torrent upload speed (bytes/second) +`isPrivate` | bool | True if torrent is from a private tracker + +NB: `-1` is returned if the type of the property is integer but its value is not known. + +Example: + +```JSON +{ + "addition_date":1438429165, + "comment":"\"Debian CD from cdimage.debian.org\"", + "completion_date":1438429234, + "created_by":"", + "creation_date":1433605214, + "dl_limit":-1, + "dl_speed":0, + "dl_speed_avg":9736015, + "eta":8640000, + "isPrivate":true, + "last_seen":1438430354, + "nb_connections":3, + "nb_connections_limit":250, + "peers":1, + "peers_total":89, + "piece_size":524288, + "pieces_have":1254, + "pieces_num":1254, + "reannounce":672, + "save_path":"/Downloads/debian-8.1.0-amd64-CD-1.iso", + "seeding_time":1128, + "seeds":1, + "seeds_total":254, + "share_ratio":0.00072121022562178299, + "time_elapsed":1197, + "total_downloaded":681521119, + "total_downloaded_session":681521119, + "total_size":657457152, + "total_uploaded":491520, + "total_uploaded_session":491520, + "total_wasted":23481724, + "up_limit":-1, + "up_speed":0, + "up_speed_avg":410 +} +``` + +## Get torrent trackers ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `trackers` + +**Parameters:** + +Parameter | Type | Description +----------|--------|------------ +`hash` | string | The hash of the torrent you want to get the trackers of + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is a JSON array, where each element contains info about one tracker, with the following fields + +Property | Type | Description +-----------------|----------|------------- +`url` | string | Tracker url +`status` | integer | Tracker status. See the table below for possible values +`tier` | integer | Tracker priority tier. Lower tier trackers are tried before higher tiers. Tier numbers are valid when `>= 0`, `< 0` is used as placeholder when `tier` does not exist for special entries (such as DHT). +`num_peers` | integer | Number of peers for current torrent, as reported by the tracker +`num_seeds` | integer | Number of seeds for current torrent, asreported by the tracker +`num_leeches` | integer | Number of leeches for current torrent, as reported by the tracker +`num_downloaded` | integer | Number of completed downloads for current torrent, as reported by the tracker +`msg` | string | Tracker message (there is no way of knowing what this message is - it's up to tracker admins) + +Possible values of `status`: + +Value | Description +-------|------------ +0 | Tracker is disabled (used for DHT, PeX, and LSD) +1 | Tracker has not been contacted yet +2 | Tracker has been contacted and is working +3 | Tracker is updating +4 | Tracker has been contacted, but it is not working (or doesn't send proper replies) + +Example: + +```JSON +[ + { + "msg":"", + "num_peers":100, + "status":2, + "url":"http://bttracker.debian.org:6969/announce" + }, + { + another_tracker_info + } +] +``` + +## Get torrent web seeds ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `webseeds` + +**Parameters:** + +Parameter | Type | Description +----------|--------|------------ +`hash` | string | The hash of the torrent you want to get the webseeds of + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is a JSON array, where each element is information about one webseed, with the following fields + +Property | Type | Description +--------------|----------|------------ +`url` | string | URL of the web seed + +Example: + +```JSON +[ + { + "url":"http://some_url/" + }, + { + "url":"http://some_other_url/" + } +] +``` + +## Get torrent contents ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `files` + +**Parameters:** + +Parameter | Type | Description +----------|--------|------------ +`hash` | string | The hash of the torrent you want to get the contents of +`indexes` _optional_ since 2.8.2 | string | The indexes of the files you want to retrieve. `indexes` can contain multiple values separated by `\|`. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is: + +- empty, if the torrent hash is invalid +- otherwise, a JSON array, where each element contains info about one file, with the following fields + +Property | Type | Description +---------------|---------------|------------- +`index` since 2.8.2 | integer | File index +`name` | string | File name (including relative path) +`size` | integer | File size (bytes) +`progress` | float | File progress (percentage/100) +`priority` | integer | File priority. See possible values here below +`is_seed` | bool | True if file is seeding/complete +`piece_range` | integer array | The first number is the starting piece index and the second number is the ending piece index (inclusive) +`availability` | float | Percentage of file pieces currently available (percentage/100) + +Possible values of `priority`: + +Value | Description +-----------|------------ +`0` | Do not download +`1` | Normal priority +`6` | High priority +`7` | Maximal priority + +Example: + +```JSON + +[ + { + "index":0, + "is_seed":false, + "name":"debian-8.1.0-amd64-CD-1.iso", + "piece_range":[0,1253], + "priority":1, + "progress":0, + "size":657457152, + "availability":0.5, + } +] +``` + +## Get torrent pieces' states ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `pieceStates` + +**Parameters:** + +Parameter | Type | Description +----------|--------|------------ +`hash` | string | The hash of the torrent you want to get the pieces' states of + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is: + +- empty, if the torrent hash is invalid +- otherwise, an array of states (integers) of all pieces (in order) of a specific torrent. + +Value meanings are defined as below: + +Value | Description +-----------|------------ +`0` | Not downloaded yet +`1` | Now downloading +`2` | Already downloaded + +Example: + +```JSON +[0,0,2,1,0,0,2,1] +``` + +## Get torrent pieces' hashes ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `pieceHashes` + +**Parameters:** + +Parameter | Type | Description +----------|--------|------------ +`hash` | string | The hash of the torrent you want to get the pieces' hashes of + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios- see JSON below + +The response is: + +- empty, if the torrent hash is invalid +- otherwise, an array of hashes (strings) of all pieces (in order) of a specific torrent. + +Example: + +```JSON +["54eddd830a5b58480a6143d616a97e3a6c23c439","f8a99d225aa4241db100f88407fc3bdaead583ab","928fb615b9bd4dd8f9e9022552c8f8f37ef76f58"] +``` + +## Pause torrents ## + +Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). + +Name: `pause` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to pause. `hashes` can contain multiple hashes separated by `\|`, to pause multiple torrents, or set to `all`, to pause all torrents. + +Example: + +```http +/api/v2/torrents/pause?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Resume torrents ## + +Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). + +Name: `resume` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to resume. `hashes` can contain multiple hashes separated by `\|`, to resume multiple torrents, or set to `all`, to resume all torrents. + +Example: + +```http +/api/v2/torrents/resume?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Delete torrents ## + +Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). + +Name: `delete` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to delete. `hashes` can contain multiple hashes separated by `\|`, to delete multiple torrents, or set to `all`, to delete all torrents. +`deleteFiles` | If set to `true`, the downloaded data will also be deleted, otherwise has no effect. + +Example: + +```http +/api/v2/torrents/delete?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32&deleteFiles=false +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Recheck torrents ## + +Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). + +Name: `recheck` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to recheck. `hashes` can contain multiple hashes separated by `\|`, to recheck multiple torrents, or set to `all`, to recheck all torrents. + +Example: + +```http +/api/v2/torrents/recheck?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Reannounce torrents ## + +Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). + +Name: `reannounce` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to reannounce. `hashes` can contain multiple hashes separated by `\|`, to reannounce multiple torrents, or set to `all`, to reannounce all torrents. + +Example: + +```http +/api/v2/torrents/reannounce?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Add new torrent ## + +This method can add torrents from server local file or from URLs. `http://`, `https://`, `magnet:` and `bc://bt/` links are supported. + +Add torrent from URLs example: + +```http +POST /api/v2/torrents/add HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: multipart/form-data; boundary=---------------------------6688794727912 +Content-Length: length + +-----------------------------6688794727912 +Content-Disposition: form-data; name="urls" + +https://torcache.net/torrent/3B1A1469C180F447B77021074DBBCCAEF62611E7.torrent +https://torcache.net/torrent/3B1A1469C180F447B77021074DBBCCAEF62611E8.torrent +-----------------------------6688794727912 +Content-Disposition: form-data; name="savepath" + +C:/Users/qBit/Downloads +-----------------------------6688794727912 +Content-Disposition: form-data; name="category" + +movies +-----------------------------6688794727912 +Content-Disposition: form-data; name="skip_checking" + +true +-----------------------------6688794727912 +Content-Disposition: form-data; name="paused" + +true +-----------------------------6688794727912 +Content-Disposition: form-data; name="root_folder" + +true +-----------------------------6688794727912-- +``` + +Add torrents from files example: + +```http +POST /api/v2/torrents/add HTTP/1.1 +Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Length: length + +---------------------------acebdf13572468 +Content-Disposition: form-data; name="torrents"; filename="8f18036b7a205c9347cb84a253975e12f7adddf2.torrent" +Content-Type: application/x-bittorrent + +file_binary_data_goes_here +---------------------------acebdf13572468 +Content-Disposition: form-data; name="torrents"; filename="UFS.torrent" +Content-Type: application/x-bittorrent + +file_binary_data_goes_here +---------------------------acebdf13572468-- + +``` + +The above example will add two torrent files. `file_binary_data_goes_here` represents raw data of torrent file (basically a byte array). + +Property | Type | Description +--------------------------------|---------|------------ +`urls` | string | URLs separated with newlines +`torrents` | raw | Raw data of torrent file. `torrents` can be presented multiple times. +`savepath` _optional_ | string | Download folder +`category` _optional_ | string | Category for the torrent +`tags` _optional_ | string | Tags for the torrent, split by ',' +`skip_checking` _optional_ | string | Skip hash checking. Possible values are `true`, `false` (default) +`paused` _optional_ | string | Add torrents in the paused state. Possible values are `true`, `false` (default) +`root_folder` _optional_ | string | Create the root folder. Possible values are `true`, `false`, unset (default) +`rename` _optional_ | string | Rename torrent +`upLimit` _optional_ | integer | Set torrent upload speed limit. Unit in bytes/second +`dlLimit` _optional_ | integer | Set torrent download speed limit. Unit in bytes/second +`ratioLimit` _optional_ since 2.8.1 | float | Set torrent share ratio limit +`seedingTimeLimit` _optional_ since 2.8.1 | integer | Set torrent seeding time limit. Unit in minutes +`autoTMM` _optional_ | bool | Whether Automatic Torrent Management should be used +`sequentialDownload` _optional_ | string | Enable sequential download. Possible values are `true`, `false` (default) +`firstLastPiecePrio` _optional_ | string | Prioritize download first last piece. Possible values are `true`, `false` (default) + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +415 | Torrent file is not valid +200 | All other scenarios + +## Add trackers to torrent ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/addTrackers HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hash=8c212779b4abde7c6bc608063a0d008b7e40ce32&urls=http://192.168.0.1/announce%0Audp://192.168.0.1:3333/dummyAnnounce +``` + +This adds two trackers to torrent with hash `8c212779b4abde7c6bc608063a0d008b7e40ce32`. Note `%0A` (aka LF newline) between trackers. Ampersand in tracker urls **MUST** be escaped. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +200 | All other scenarios + +## Edit trackers ## + +Name: `editTracker` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`hash` | string | The hash of the torrent +`origUrl` | string | The tracker URL you want to edit +`newUrl` | string | The new URL to replace the `origUrl` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | `newUrl` is not a valid URL +404 | Torrent hash was not found +409 | `newUrl` already exists for the torrent +409 | `origUrl` was not found +200 | All other scenarios + +## Remove trackers ## + +Name: `removeTrackers` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`hash` | string | The hash of the torrent +`urls` | string | URLs to remove, separated by `\|` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash was not found +409 | All `urls` were not found +200 | All other scenarios + +## Add peers ## + +Name: `addPeers` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`hashes` | string | The hash of the torrent, or multiple hashes separated by a pipe `\|` +`peers` | string | The peer to add, or multiple peers separated by a pipe `\|`. Each peer is a colon-separated `host:port` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | None of the supplied peers are valid +200 | All other scenarios + +## Increase torrent priority ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `increasePrio` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to increase the priority of. `hashes` can contain multiple hashes separated by `\|`, to increase the priority of multiple torrents, or set to `all`, to increase the priority of all torrents. + +Example: + +```http +/api/v2/torrents/increasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Torrent queueing is not enabled +200 | All other scenarios + +## Decrease torrent priority ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `decreasePrio` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to decrease the priority of. `hashes` can contain multiple hashes separated by `\|`, to decrease the priority of multiple torrents, or set to `all`, to decrease the priority of all torrents. + +Example: + +```http +/api/v2/torrents/decreasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Torrent queueing is not enabled +200 | All other scenarios + +## Maximal torrent priority ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `topPrio` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to set to the maximum priority. `hashes` can contain multiple hashes separated by `\|`, to set multiple torrents to the maximum priority, or set to `all`, to set all torrents to the maximum priority. + +Example: + +```http +/api/v2/torrents/topPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Torrent queueing is not enabled +200 | All other scenarios + +## Minimal torrent priority ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `bottomPrio` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to set to the minimum priority. `hashes` can contain multiple hashes separated by `\|`, to set multiple torrents to the minimum priority, or set to `all`, to set all torrents to the minimum priority. + +Example: + +```http +/api/v2/torrents/bottomPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Torrent queueing is not enabled +200 | All other scenarios + +## Set file priority ## + +Name: `filePrio` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`hash` | string | The hash of the torrent +`id` | string | File ids, separated by `\|` +`priority` | number | File priority to set (consult [torrent contents API](#get-torrent-contents) for possible values) + +`id` values correspond to file position inside the array returned by [torrent contents API](#get-torrent-contents), e.g. `id=0` for first file, `id=1` for second file, etc. + +Since 2.8.2 it is recommended to use `index` field returned by [torrent contents API](#get-torrent-contents) (since the files can be filtered and the `index` value may differ from the position inside the response array). + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | Priority is invalid +400 | At least one file `id` is not a valid integer +404 | Torrent hash was not found +409 | Torrent metadata hasn't downloaded yet +409 | At least one file `id` was not found +200 | All other scenarios + +## Get torrent download limit ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/downloadLimit HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0 +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` + +Server reply (example): + +```http +HTTP/1.1 200 OK +content-type: application/json +content-length: length + +{"8c212779b4abde7c6bc608063a0d008b7e40ce32":338944,"284b83c9c7935002391129fd97f43db5d7cc2ba0":123} +``` + +`8c212779b4abde7c6bc608063a0d008b7e40ce32` is the hash of the torrent and `338944` its download speed limit in bytes per second; this value will be zero if no limit is applied. + +## Set torrent download limit ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setDownloadLimit HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072 +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` +`limit` is the download speed limit in bytes per second you want to set. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set torrent share limit ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setShareLimits HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&ratioLimit=1.0&seedingTimeLimit=60&inactiveSeedingTimeLimit=-2 +``` + +**Parameters:** + +Property | Type | Description +------------------------------|---------|------------ +`hashes` | integer | The hashes of the torrents for which you want to set the share limits. Multiple hashes need to be separated by `\|` or set to `all`. +`ratioLimit` | float | The maximum seeding ratio for the torrent. `-2` means the global limit should be used, `-1` means no limit. +`seedingTimeLimit` | integer | The maximum seeding time (minutes) for the torrent. `-2` means the global limit should be used, `-1` means no limit. +`inactiveSeedingTimeLimit` | integer | The maximum amount of time (minutes) the torrent is allowed to seed while being inactive. `-2` means the global limit should be used, `-1` means no limit. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All other scenarios +400 | Bad Request, e.g. missing parameter + +## Get torrent upload limit ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/uploadLimit HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0 +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` + +Server reply (example): + +```http +HTTP/1.1 200 OK +content-type: application/json +content-length: length + +{"8c212779b4abde7c6bc608063a0d008b7e40ce32":338944,"284b83c9c7935002391129fd97f43db5d7cc2ba0":123} +``` + +`8c212779b4abde7c6bc608063a0d008b7e40ce32` is the hash of the torrent in the request and `338944` its upload speed limit in bytes per second; this value will be zero if no limit is applied. + +## Set torrent upload limit ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setUploadLimit HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072 +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` +`limit` is the upload speed limit in bytes per second you want to set. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set torrent location ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setLocation HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&location=/mnt/nfs/media +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` +`location` is the location to download the torrent to. If the location doesn't exist, the torrent's location is unchanged. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | Save path is empty +403 | User does not have write access to directory +409 | Unable to create save path directory +200 | All other scenarios + +## Set torrent name ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/rename HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hash=8c212779b4abde7c6bc608063a0d008b7e40ce32&name=This%20is%20a%20test +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Torrent hash is invalid +409 | Torrent name is empty +200 | All other scenarios + +## Set torrent category ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setCategory HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&category=CategoryName +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` + +`category` is the torrent category you want to set. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Category name does not exist +200 | All other scenarios + +## Get all categories ## + +Name: `categories` + +Parameters: + +None + +Returns all categories in JSON format, e.g.: + +```JSON +{ + "Video": { + "name": "Video", + "savePath": "/home/user/torrents/video/" + }, + "eBooks": { + "name": "eBooks", + "savePath": "/home/user/torrents/eBooks/" + } +} +``` +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Add new category ## + +```http +POST /api/v2/torrents/createCategory HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +category=CategoryName&savePath=/path/to/dir +``` + +`category` is the category you want to create. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | Category name is empty +409 | Category name is invalid +200 | All other scenarios + +## Edit category ## + +```http +POST /api/v2/torrents/editCategory HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +category=CategoryName&savePath=/path/to/save/torrents/to +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | Category name is empty +409 | Category editing failed +200 | All other scenarios + +## Remove categories ## + +```http +POST /api/v2/torrents/removeCategories HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +categories=Category1%0ACategory2 +``` + +`categories` can contain multiple cateogies separated by `\n` (%0A urlencoded) + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Add torrent tags ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/addTags HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2 +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` + +`tags` is the list of tags you want to add to passed torrents. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Remove torrent tags ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/removeTags HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2 +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` + +`tags` is the list of tags you want to remove from passed torrents. +Empty list removes all tags from relevant torrents. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Get all tags ## + +Name: `tags` + +Parameters: + +None + +Returns all tags in JSON format, e.g.: + +```JSON +[ + "Tag 1", + "Tag 2" +] +``` +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Create tags ## + +```http +POST /api/v2/torrents/createTags HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +tags=TagName1,TagName2 +``` +`tags` is a list of tags you want to create. +Can contain multiple tags separated by `,`. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Delete tags ## + +```http +POST /api/v2/torrents/deleteTags HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +tags=TagName1,TagName2 +``` + +`tags` is a list of tags you want to delete. +Can contain multiple tags separated by `,`. + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set automatic torrent management ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setAutoManagement HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&enable=true +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` +`enable` is a boolean, affects the torrents listed in `hashes`, default is `false` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Toggle sequential download ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `toggleSequentialDownload` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to toggle sequential download for. `hashes` can contain multiple hashes separated by `\|`, to toggle sequential download for multiple torrents, or set to `all`, to toggle sequential download for all torrents. + +Example: + +```http +/api/v2/torrents/toggleSequentialDownload?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set first/last piece priority ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +Name: `toggleFirstLastPiecePrio` + +**Parameters:** + +Parameter | Type | Description +------------|----------|------------ +`hashes` | string | The hashes of the torrents you want to toggle the first/last piece priority for. `hashes` can contain multiple hashes separated by `\|`, to toggle the first/last piece priority for multiple torrents, or set to `all`, to toggle the first/last piece priority for all torrents. + +Example: + +```http +/api/v2/torrents/toggleFirstLastPiecePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set force start ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setForceStart HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32?value=true +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` +`value` is a boolean, affects the torrents listed in `hashes`, default is `false` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set super seeding ## + +Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). + +```http +POST /api/v2/torrents/setSuperSeeding HTTP/1.1 +User-Agent: Fiddler +Host: 127.0.0.1 +Cookie: SID=your_sid +Content-Type: application/x-www-form-urlencoded +Content-Length: length + +hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32?value=true +``` + +`hashes` can contain multiple hashes separated by `|` or set to `all` +`value` is a boolean, affects the torrents listed in `hashes`, default is `false` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Rename file ## + +Name: `renameFile` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|----------|------------ +`hash` | string | The hash of the torrent +`oldPath` | string | The old path of the torrent +`newPath` | string | The new path to use for the file + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | Missing `newPath` parameter +409 | Invalid `newPath` or `oldPath`, or `newPath` already in use +200 | All other scenarios + +## Rename folder ## + +Name: `renameFolder` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|----------|------------ +`hash` | string | The hash of the torrent +`oldPath` | string | The old path of the torrent +`newPath` | string | The new path to use for the file + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +400 | Missing `newPath` parameter +409 | Invalid `newPath` or `oldPath`, or `newPath` already in use +200 | All other scenarios + +# RSS (experimental) # + +All RSS API methods are under "rss", e.g.: `/api/v2/rss/methodName`. + +## Add folder ## + +Name: `addFolder` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`path` | string | Full path of added folder (e.g. "The Pirate Bay\Top100") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Failure to add folder +200 | All other scenarios + +## Add feed ## + +Name: `addFeed` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`url` | string | URL of RSS feed (e.g. "[http://thepiratebay.org/rss//top100/200](http://thepiratebay.org/rss//top100/200)") +`path` _optional_ | string | Full path of added folder (e.g. "The Pirate Bay\Top100\Video") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Failure to add feed +200 | All other scenarios + +## Remove item ## + +Removes folder or feed. + +Name: `removeItem` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`path` | string | Full path of removed item (e.g. "The Pirate Bay\Top100") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Failure to remove item +200 | All other scenarios + +## Move item ## + +Moves/renames folder or feed. + +Name: `moveItem` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`itemPath` | string | Current full path of item (e.g. "The Pirate Bay\Top100") +`destPath` | string | New full path of item (e.g. "The Pirate Bay") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | Failure to move item +200 | All other scenarios + +## Get all items ## + +Name: `items` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`withData` _optional_ | bool | True if you need current feed articles + +Returns all RSS items in JSON format, e.g.: + +```JSON +{ + "HD-Torrents.org": "https://hd-torrents.org/rss.php", + "PowerfulJRE": "https://www.youtube.com/feeds/videos.xml?channel_id=UCzQUP1qoWDoEbmsQxvdjxgQ", + "The Pirate Bay": { + "Audio": "https://thepiratebay.org/rss//top100/100", + "Video": "https://thepiratebay.org/rss//top100/200" + } +} +``` + +## Mark as read ## + +If `articleId` is provided only the article is marked as read otherwise the whole feed is going to be marked as read. + +Name: `markAsRead` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`itemPath` | string | Current full path of item (e.g. "The Pirate Bay\Top100") +`articleId` _optional_ | string | ID of article + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Refresh item ## + +Refreshes folder or feed. + +Name: `refreshItem` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`itemPath` | string | Current full path of item (e.g. "The Pirate Bay\Top100") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Set auto-downloading rule ## + +Name: `setRule` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`ruleName` | string | Rule name (e.g. "Punisher") +`ruleDef` | string | JSON encoded rule definition + +Rule definition is JSON encoded dictionary with the following fields: + +Field | Type | Description +----------------------------------|---------|------------ +`enabled` | bool | Whether the rule is enabled +`mustContain` | string | The substring that the torrent name must contain +`mustNotContain` | string | The substring that the torrent name must not contain +`useRegex` | bool | Enable regex mode in "mustContain" and "mustNotContain" +`episodeFilter` | string | Episode filter definition +`smartFilter` | bool | Enable smart episode filter +`previouslyMatchedEpisodes` | list | The list of episode IDs already matched by smart filter +`affectedFeeds` | list | The feed URLs the rule applied to +`ignoreDays` | number | Ignore sunsequent rule matches +`lastMatch` | string | The rule last match time +`addPaused` | bool | Add matched torrent in paused mode +`assignedCategory` | string | Assign category to the torrent +`savePath` | string | Save torrent to the given directory + +E.g.: + +```JSON +{ + "enabled": false, + "mustContain": "The *Punisher*", + "mustNotContain": "", + "useRegex": false, + "episodeFilter": "1x01-;", + "smartFilter": false, + "previouslyMatchedEpisodes": [ + ], + "affectedFeeds": [ + "http://showrss.info/user/134567.rss?magnets=true" + ], + "ignoreDays": 0, + "lastMatch": "20 Nov 2017 09:05:11", + "addPaused": true, + "assignedCategory": "", + "savePath": "C:/Users/JohnDoe/Downloads/Punisher" +} +``` + +## Rename auto-downloading rule ## + +Name: `renameRule` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`ruleName` | string | Rule name (e.g. "Punisher") +`newRuleName` | string | New rule name (e.g. "The Punisher") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Remove auto-downloading rule ## + +Name: `removeRule` + +Parameters: + +Parameter | Type | Description +----------------------------------|---------|------------ +`ruleName` | string | Rule name (e.g. "Punisher") + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + + +## Get all auto-downloading rules ## + +Name: `rules` + +Returns all auto-downloading rules in JSON format, e.g.: + +```JSON +{ + "The Punisher": { + "enabled": false, + "mustContain": "The *Punisher*", + "mustNotContain": "", + "useRegex": false, + "episodeFilter": "1x01-;", + "smartFilter": false, + "previouslyMatchedEpisodes": [ + ], + "affectedFeeds": [ + "http://showrss.info/user/134567.rss?magnets=true" + ], + "ignoreDays": 0, + "lastMatch": "20 Nov 2017 09:05:11", + "addPaused": true, + "assignedCategory": "", + "savePath": "C:/Users/JohnDoe/Downloads/Punisher" + } +} +``` +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Get all articles matching a rule ## + +Name: `matchingArticles` + +Parameter | Type | Description +----------------------------------|---------|------------ +`ruleName` | string | Rule name (e.g. "Linux") + + +Returns all articles that match a rule by feed name in JSON format, e.g.: + +```JSON +{ + "DistroWatch":[ + "sparkylinux-5.11-i686-minimalgui.iso.torrent", + "sparkylinux-5.11-x86_64-minimalgui.iso.torrent", + "sparkylinux-5.11-i686-xfce.iso.torrent", + "bluestar-linux-5.6.3-2020.04.09-x86_64.iso.torrent", + "robolinux64-mate3d-v10.10.iso.torrent", + ], + "Linuxtracker":[ + "[Alpine Linux] alpine-extended-3.11.6", + "[Alpine Linux] alpine-standard-3.11.6", + "[Linuxfx] linuxfx10-wxs-lts-beta5.iso", + "[Linux Lite] linux-lite-5.0-rc1-64bit.iso (MULTI)", + "[Scientific Linux] SL-7.8-x86_64-Pack", + "[NixOS] nixos-plasma5-20.03.1418.5272327b81e-x86_64-linux.iso" + ] +} +``` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + + +# Search # + +All Search API methods are under "search", e.g.: `/api/v2/search/methodName`. + +## Start search ## + +Name: `start` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`pattern` | string | Pattern to search for (e.g. "Ubuntu 18.04") +`plugins` | string | Plugins to use for searching (e.g. "legittorrents"). Supports multiple plugins separated by `\|`. Also supports `all` and `enabled` +`category` | string | Categories to limit your search to (e.g. "legittorrents"). Available categories depend on the specified `plugins`. Also supports `all` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +409 | User has reached the limit of max `Running` searches (currently set to 5) +200 | All other scenarios- see JSON below + +The response is a JSON object with the following fields + +Field | Type | Description +----------------------------------|---------|------------ +`id` | number | ID of the search job + +Example: + +```JSON +{ + "id": 12345 +} +``` + +## Stop search ## + +Name: `stop` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`id` | number | ID of the search job + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Search job was not found +200 | All other scenarios + +## Get search status ## + +Name: `status` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`id` _optional_ | number | ID of the search job. If not specified, all search jobs are returned + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Search job was not found +200 | All other scenarios- see JSON below + +The response is a JSON array of objects containing the following fields + +Field | Type | Description +----------------------------------|---------|------------ +`id` | number | ID of the search job +`status` | string | Current status of the search job (either `Running` or `Stopped`) +`total` | number | Total number of results. If the status is `Running` this number may contineu to increase + +Example: + +```JSON +[ + { + "id": 12345, + "status": "Running", + "total": 170 + } +] +``` + +## Get search results ## + +Name: `results` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`id` | number | ID of the search job +`limit` _optional_ | number | max number of results to return. 0 or negative means no limit +`offset` _optional_ | number | result to start at. A negative number means count backwards (e.g. `-2` returns the 2 most recent results) + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Search job was not found +409 | Offset is too large, or too small (e.g. absolute value of negative number is greater than # results) +200 | All other scenarios- see JSON below + +The response is a JSON object with the following fields + +Field | Type | Description +----------------------------------|---------|------------ +`results` | array | Array of `result` objects- see table below +`status` | string | Current status of the search job (either `Running` or `Stopped`) +`total` | number | Total number of results. If the status is `Running` this number may continue to increase + +**Result object:** + +Field | Type | Description +----------------------------------|---------|------------ +`descrLink` | string | URL of the torrent's description page +`fileName` | string | Name of the file +`fileSize` | number | Size of the file in Bytes +`fileUrl` | string | Torrent download link (usually either .torrent file or magnet link) +`nbLeechers` | number | Number of leechers +`nbSeeders` | number | Number of seeders +`siteUrl` | string | URL of the torrent site + +Example: + +```JSON +{ + "results": [ + { + "descrLink": "http://www.legittorrents.info/index.php?page=torrent-details&id=8d5f512e1acb687029b8d7cc6c5a84dce51d7a41", + "fileName": "Ubuntu-10.04-32bit-NeTV.ova", + "fileSize": -1, + "fileUrl": "http://www.legittorrents.info/download.php?id=8d5f512e1acb687029b8d7cc6c5a84dce51d7a41&f=Ubuntu-10.04-32bit-NeTV.ova.torrent", + "nbLeechers": 1, + "nbSeeders": 0, + "siteUrl": "http://www.legittorrents.info" + }, + { + "descrLink": "http://www.legittorrents.info/index.php?page=torrent-details&id=d5179f53e105dc2c2401bcfaa0c2c4936a6aa475", + "fileName": "mangOH-Legato-17_06-Ubuntu-16_04.ova", + "fileSize": -1, + "fileUrl": "http://www.legittorrents.info/download.php?id=d5179f53e105dc2c2401bcfaa0c2c4936a6aa475&f=mangOH-Legato-17_06-Ubuntu-16_04.ova.torrent", + "nbLeechers": 0, + "nbSeeders": 59, + "siteUrl": "http://www.legittorrents.info" + } + ], + "status": "Running", + "total": 2 +} +``` + +## Delete search ## + +Name: `delete` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`id` | number | ID of the search job + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +404 | Search job was not found +200 | All other scenarios + +## Get search plugins ## + +Name: `plugins` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios- see JSON below + +The response is a JSON array of objects containing the following fields + +Field | Type | Description +----------------------------------|---------|------------ +`enabled` | bool | Whether the plugin is enabled +`fullName` | string | Full name of the plugin +`name` | string | Short name of the plugin +`supportedCategories` | array | List of category objects +`url` | string | URL of the torrent site +`version` | string | Installed version of the plugin + +```JSON +[ + { + "enabled": true, + "fullName": "Legit Torrents", + "name": "legittorrents", + "supportedCategories": [{ + "id": "all", + "name": "All categories" + }, { + "id": "anime", + "name": "Anime" + }, { + "id": "books", + "name": "Books" + }, { + "id": "games", + "name": "Games" + }, { + "id": "movies", + "name": "Movies" + }, { + "id": "music", + "name": "Music" + }, { + "id": "tv", + "name": "TV shows" + }], + "url": "http://www.legittorrents.info", + "version": "2.3" + } +] +``` + +## Install search plugin ## + +Name: `installPlugin` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`sources` | string | Url or file path of the plugin to install (e.g. "[https://raw.githubusercontent.com/qbittorrent/search-plugins/master/nova3/engines/legittorrents.py](https://raw.githubusercontent.com/qbittorrent/search-plugins/master/nova3/engines/legittorrents.py)"). Supports multiple sources separated by `\|` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Uninstall search plugin ## + +Name: `uninstallPlugin` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`names` | string | Name of the plugin to uninstall (e.g. "legittorrents"). Supports multiple names separated by `\|` + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Enable search plugin ## + +Name: `enablePlugin` + +**Parameters:** + +Parameter | Type | Description +----------------------------------|---------|------------ +`names` | string | Name of the plugin to enable/disable (e.g. "legittorrents"). Supports multiple names separated by `\|` +`enable` | bool | Whether the plugins should be enabled + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +## Update search plugins ## + +Name: `updatePlugins` + +**Parameters:** + +None + +**Returns:** + +HTTP Status Code | Scenario +----------------------------------|--------------------- +200 | All scenarios + +# WebAPI versioning # +WebAPI uses the following versioning: `1.2.3`: +1. Main version. Should be changed only on some global changes (e.g. total redesign/relayout) +2. Changed on incompatible API changes (i.e. if it breaks outdated clients). E.g. if you change/remove something +3. Changed on compatible API changes (i.e. if it doesn't break outdated clients). E.g. if you add something new outdated clients still can access old subset of API.