"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.\n\nExample showing how to login and execute a command that requires authentication using `curl`:\n\n```sh\n$ curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login\nHTTP/1.1 200 OK\nContent-Encoding:\nContent-Length: 3\nContent-Type: text/plain; charset=UTF-8\nSet-Cookie: SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ; path=/\n$ curl http://localhost:8080/api/v2/torrents/info --cookie \"SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ\"\n```\n\nNote: Set `Referer` or `Origin` header to the exact same domain and port as used in the HTTP query `Host` header.",
"1. There is no need to pass all possible preferences' `token:value` pairs if you only want to change one option\n 1. Paths in `scan_dirs` must exist, otherwise this option will have no effect\n 1. String values must be quoted; integer and boolean values must never be quoted\n\nFor a list of possible preference options see [Get application preferences](#get-application-preferences)",
),
url: "setPreferences",
types: CompositeTypes {
composite_types: [],
},
},
ApiMethod {
name: "defaultSavePath",
description: Some(
"The response is a string with the default save path, e.g. `C:/Users/Dayman/Downloads`.",
),
url: "defaultSavePath",
types: CompositeTypes {
composite_types: [],
},
},
],
description: Some(
"All Application API methods are under \"app\", e.g.: `/api/v2/app/methodName`.",
),
url: "app",
},
ApiGroup {
name: "log",
methods: [
ApiMethod {
name: "main",
description: Some(
"The response is a JSON array in which each element is an entry of the log.\n\nEach element of the array has the following properties:\n\n\nExample:\n\n```JSON\n[\n {\n \"id\":0,\n \"message\":\"qBittorrent v3.4.0 started\",\n \"timestamp\":1507969127860,\n \"type\":1\n },\n {\n \"id\":1,\n \"message\":\"qBittorrent is trying to listen on any interface port: 19036\",\n \"timestamp\":1507969127869,\n \"type\":2\n },\n {\n \"id\":2,\n \"message\":\"Peer ID: -qB3400-\",\n \"timestamp\":1507969127870,\n \"type\":1\n },\n {\n \"id\":3,\n \"message\":\"HTTP User-Agent is 'qBittorrent/3.4.0'\",\n \"timestamp\":1507969127870,\n \"type\":1\n },\n {\n \"id\":4,\n \"message\":\"DHT support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":5,\n \"message\":\"Local Peer Discovery support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":6,\n \"message\":\"PeX support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":7,\n \"message\":\"Anonymous mode [OFF]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":8,\n \"message\":\"Encryption support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":9,\n \"message\":\"Embedded Tracker [OFF]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":10,\n \"message\":\"UPnP / NAT-PMP support [ON]\",\n \"timestamp\":1507969127873,\n \"type\":2\n },\n {\n \"id\":11,\n \"message\":\"Web UI: Now listening on port 8080\",\n \"timestamp\":1507969127883,\n \"type\":1\n },\n {\n \"id\":12,\n \"message\":\"Options were saved successfully.\",\n \"timestamp\":1507969128055,\n \"type\":1\n },\n {\n \"id\":13,\n \"message\":\"qBittorrent is successfully listening on interface :: port: TCP/19036\",\n \"timestamp\":1507969128270,\n \"type\":2\n },\n {\n \"id\":14,\n \"message\":\"qBittorrent is successfully listening on interface 0.0.0.0 port: TCP/19036\",\n \"timestamp\":1507969128271,\n \"type\":2\n },\n {\n \"id\":15,\n \"message\":\"qBittorrent is successfully listening on interface 0.0.0.0 port: UDP/19036\",\n \"timestamp\":1507969128272,\n \"type\":2\n }\n]\n```",
),
url: "main",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
Bool(
TypeInfo {
name: "normal",
is_optional: true,
description: Some(
"Include normal messages (default: true)",
),
},
),
Bool(
TypeInfo {
name: "info",
is_optional: true,
description: Some(
"Include info messages (default: true)",
),
},
),
Bool(
TypeInfo {
name: "warning",
is_optional: true,
description: Some(
"Include warning messages (default: true)",
),
},
),
Bool(
TypeInfo {
name: "critical",
is_optional: true,
description: Some(
"Include critical messages (default: true)",
),
},
),
Number(
TypeInfo {
name: "last_known_id",
is_optional: true,
description: Some(
"Exclude messages with \"message id\" <= last_known_id (default: -1)",
),
},
),
],
},
),
],
},
},
ApiMethod {
name: "peers",
description: Some(
"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",
),
url: "peers",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
Number(
TypeInfo {
name: "last_known_id",
is_optional: true,
description: Some(
"Exclude messages with \"message id\" <= last_known_id (default: -1)",
),
},
),
],
},
),
],
},
},
],
description: Some(
"All Log API methods are under \"log\", e.g.: `/api/v2/log/methodName`.",
),
url: "log",
},
ApiGroup {
name: "sync",
methods: [
ApiMethod {
name: "maindata",
description: Some(
"The response is a JSON object with the following possible fields\n\n\nExample:\n\n```JSON\n{\n \"rid\":15,\n \"torrents\":\n {\n \"8c212779b4abde7c6bc608063a0d008b7e40ce32\":\n {\n \"state\":\"pausedUP\"\n }\n }\n}\n```",
),
url: "maindata",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
Number(
TypeInfo {
name: "rid",
is_optional: false,
description: Some(
"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)",
),
},
),
],
},
),
Response(
TypeWithoutName {
types: [
Number(
TypeInfo {
name: "rid",
is_optional: false,
description: Some(
"Response ID",
),
},
),
Bool(
TypeInfo {
name: "full_update",
is_optional: false,
description: Some(
"Whether the response contains all the data or partial data",
),
},
),
Object(
Object {
type_info: TypeInfo {
name: "torrents",
is_optional: false,
description: Some(
"Property: torrent hash, value: same as [torrent list](#get-torrent-list)",
"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)",
),
},
),
],
},
),
],
},
},
],
description: Some(
"Sync API implements requests for obtaining changes since the last request.\nAll Sync API methods are under \"sync\", e.g.: `/api/v2/sync/methodName`.",
),
url: "sync",
},
ApiGroup {
name: "transfer_info",
methods: [
ApiMethod {
name: "info",
description: Some(
"The response is a JSON object with the following fields\n\n\nIn addition to the above in partial data requests (see [Get partial data](#get-partial-data) for more info):\n\n\nPossible values of `connection_status`:\n\nValue |\n\nExample:\n\n```JSON\n{\n \"connection_status\":\"connected\",\n \"dht_nodes\":386,\n \"dl_info_data\":681521119,\n \"dl_info_speed\":0,\n \"dl_rate_limit\":0,\n \"up_info_data\":10747904,\n \"up_info_speed\":0,\n \"up_rate_limit\":1048576\n}\n```",
),
url: "info",
types: CompositeTypes {
composite_types: [
Response(
TypeWithoutName {
types: [
Number(
TypeInfo {
name: "dl_info_speed",
is_optional: false,
description: Some(
"Global download rate (bytes/s)",
),
},
),
Number(
TypeInfo {
name: "dl_info_data",
is_optional: false,
description: Some(
"Data downloaded this session (bytes)",
),
},
),
Number(
TypeInfo {
name: "up_info_speed",
is_optional: false,
description: Some(
"Global upload rate (bytes/s)",
),
},
),
Number(
TypeInfo {
name: "up_info_data",
is_optional: false,
description: Some(
"Data uploaded this session (bytes)",
),
},
),
Number(
TypeInfo {
name: "dl_rate_limit",
is_optional: false,
description: Some(
"Download rate limit (bytes/s)",
),
},
),
Number(
TypeInfo {
name: "up_rate_limit",
is_optional: false,
description: Some(
"Upload rate limit (bytes/s)",
),
},
),
Number(
TypeInfo {
name: "dht_nodes",
is_optional: false,
description: Some(
"DHT nodes connected to",
),
},
),
String(
TypeInfo {
name: "connection_status",
is_optional: false,
description: Some(
"Connection status. See possible values here below",
),
},
),
],
},
),
],
},
},
ApiMethod {
name: "speedLimitsMode",
description: Some(
"The response is `1` if alternative speed limits are enabled, `0` otherwise.",
),
url: "speedLimitsMode",
types: CompositeTypes {
composite_types: [],
},
},
ApiMethod {
name: "toggleSpeedLimitsMode",
description: None,
url: "toggleSpeedLimitsMode",
types: CompositeTypes {
composite_types: [],
},
},
ApiMethod {
name: "downloadLimit",
description: Some(
"The response is the value of current global download speed limit in bytes/second; this value will be zero if no limit is applied.",
),
url: "downloadLimit",
types: CompositeTypes {
composite_types: [],
},
},
ApiMethod {
name: "setDownloadLimit",
description: None,
url: "setDownloadLimit",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
Number(
TypeInfo {
name: "limit",
is_optional: false,
description: Some(
"The global download speed limit to set in bytes/second",
),
},
),
],
},
),
],
},
},
ApiMethod {
name: "uploadLimit",
description: Some(
"The response is the value of current global upload speed limit in bytes/second; this value will be zero if no limit is applied.",
),
url: "uploadLimit",
types: CompositeTypes {
composite_types: [],
},
},
ApiMethod {
name: "setUploadLimit",
description: None,
url: "setUploadLimit",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
Number(
TypeInfo {
name: "limit",
is_optional: false,
description: Some(
"The global upload speed limit to set in bytes/second",
),
},
),
],
},
),
],
},
},
ApiMethod {
name: "banPeers",
description: None,
url: "banPeers",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
String(
TypeInfo {
name: "peers",
is_optional: false,
description: Some(
"The peer to ban, or multiple peers separated by a pipe \\",
),
},
),
],
},
),
],
},
},
],
description: Some(
"All Transfer info API methods are under \"transfer\", e.g.: `/api/v2/transfer/methodName`.",
),
url: "transfer",
},
ApiGroup {
name: "torrent_management",
methods: [
ApiMethod {
name: "info",
description: Some(
"The response is a JSON array with the following fields\n\n\nPossible values of `state`:\n\n\nExample:\n\n```JSON\n[\n {\n \"dlspeed\":9681262,\n \"eta\":87,\n \"f_l_piece_prio\":false,\n \"force_start\":false,\n \"hash\":\"8c212779b4abde7c6bc608063a0d008b7e40ce32\",\n \"category\":\"\",\n \"tags\": \"\",\n \"name\":\"debian-8.1.0-amd64-CD-1.iso\",\n \"num_complete\":-1,\n \"num_incomplete\":-1,\n \"num_leechs\":2,\n \"num_seeds\":54,\n \"priority\":1,\n \"progress\":0.16108787059783936,\n \"ratio\":0,\n \"seq_dl\":false,\n \"size\":657457152,\n \"state\":\"downloading\",\n \"super_seeding\":false,\n \"upspeed\":0\n },\n {\n another_torrent_info\n }\n]\n```",
),
url: "info",
types: CompositeTypes {
composite_types: [
Parameters(
TypeWithoutName {
types: [
String(
TypeInfo {
name: "filter",
is_optional: true,
description: Some(
"Filter torrent list by state. Allowed state filters: all, downloading, seeding, completed, paused, active, inactive, resumed, stalled, stalled_uploading, stalled_downloading, errored",
),
},
),
String(
TypeInfo {
name: "category",
is_optional: true,
description: Some(
"Get torrents with the given category (empty string means \"without category\"; no \"category\" parameter means \"any category\" <- broken until [#11748](https://github.com/qbittorrent/qBittorrent/issues/11748) is resolved). Remember to URL-encode the category name. For example, My category becomes My%20category",
),
},
),
String(
TypeInfo {
name: "tag",
is_optional: true,
description: Some(
"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",
),
},
),
String(
TypeInfo {
name: "sort",
is_optional: true,
description: Some(
"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.",
),
},
),
Bool(
TypeInfo {
name: "reverse",
is_optional: true,
description: Some(
"Enable reverse sorting. Defaults to false",
),
},
),
Number(
TypeInfo {
name: "limit",
is_optional: true,
description: Some(
"Limit the number of torrents returned",
),
},
),
Number(
TypeInfo {
name: "offset",
is_optional: true,
description: Some(
"Set offset (if less than 0, offset from end)",
),
},
),
String(
TypeInfo {
name: "hashes",
is_optional: true,
description: Some(
"Filter by hashes. Can contain multiple hashes separated by \\",
"Time (Unix Epoch) when the torrent was added to the client",
),
},
),
Number(
TypeInfo {
name: "amount_left",
is_optional: false,
description: Some(
"Amount of data left to download (bytes)",
),
},
),
Bool(
TypeInfo {
name: "auto_tmm",
is_optional: false,
description: Some(
"Whether this torrent is managed by Automatic Torrent Management",
),
},
),
Float(
TypeInfo {
name: "availability",
is_optional: false,
description: Some(
"Percentage of file pieces currently available",
),
},
),
String(
TypeInfo {
name: "category",
is_optional: false,
description: Some(
"Category of the torrent",
),
},
),
Number(
TypeInfo {
name: "completed",
is_optional: false,
description: Some(
"Amount of transfer data completed (bytes)",
),
},
),
Number(
TypeInfo {
name: "completion_on",
is_optional: false,
description: Some(
"Time (Unix Epoch) when the torrent completed",
),
},
),
String(
TypeInfo {
name: "content_path",
is_optional: false,
description: Some(
"Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)",
),
},
),
Number(
TypeInfo {
name: "dl_limit",
is_optional: false,
description: Some(
"Torrent download speed limit (bytes/s). -1 if ulimited.",
),
},
),
Number(
TypeInfo {
name: "dlspeed",
is_optional: false,
description: Some(
"Torrent download speed (bytes/s)",
),
},
),
Number(
TypeInfo {
name: "downloaded",
is_optional: false,
description: Some(
"Amount of data downloaded",
),
},
),
Number(
TypeInfo {
name: "downloaded_session",
is_optional: false,
description: Some(
"Amount of data downloaded this session",
),
},
),
Number(
TypeInfo {
name: "eta",
is_optional: false,
description: Some(
"Torrent ETA (seconds)",
),
},
),
Bool(
TypeInfo {
name: "f_l_piece_prio",
is_optional: false,
description: Some(
"True if first last piece are prioritized",
),
},
),
Bool(
TypeInfo {
name: "force_start",
is_optional: false,
description: Some(
"True if force start is enabled for this torrent",
),
},
),
String(
TypeInfo {
name: "hash",
is_optional: false,
description: Some(
"Torrent hash",
),
},
),
Number(
TypeInfo {
name: "last_activity",
is_optional: false,
description: Some(
"Last time (Unix Epoch) when a chunk was downloaded/uploaded",
),
},
),
String(
TypeInfo {
name: "magnet_uri",
is_optional: false,
description: Some(
"Magnet URI corresponding to this torrent",
),
},
),
Float(
TypeInfo {
name: "max_ratio",
is_optional: false,
description: Some(
"Maximum share ratio until torrent is stopped from seeding/uploading",
),
},
),
Number(
TypeInfo {
name: "max_seeding_time",
is_optional: false,
description: Some(
"Maximum seeding time (seconds) until torrent is stopped from seeding",
),
},
),
String(
TypeInfo {
name: "name",
is_optional: false,
description: Some(
"Torrent name",
),
},
),
Number(
TypeInfo {
name: "num_complete",
is_optional: false,
description: Some(
"Number of seeds in the swarm",
),
},
),
Number(
TypeInfo {
name: "num_incomplete",
is_optional: false,
description: Some(
"Number of leechers in the swarm",
),
},
),
Number(
TypeInfo {
name: "num_leechs",
is_optional: false,
description: Some(
"Number of leechers connected to",
),
},
),
Number(
TypeInfo {
name: "num_seeds",
is_optional: false,
description: Some(
"Number of seeds connected to",
),
},
),
Number(
TypeInfo {
name: "priority",
is_optional: false,
description: Some(
"Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode",
),
},
),
Float(
TypeInfo {
name: "progress",
is_optional: false,
description: Some(
"Torrent progress (percentage/100)",
),
},
),
Float(
TypeInfo {
name: "ratio",
is_optional: false,
description: Some(
"Torrent share ratio. Max ratio value: 9999.",
),
},
),
Float(
TypeInfo {
name: "ratio_limit",
is_optional: false,
description: Some(
"TODO (what is different from max_ratio?)",
),
},
),
String(
TypeInfo {
name: "save_path",
is_optional: false,
description: Some(
"Path where this torrent's data is stored",
),
},
),
Number(
TypeInfo {
name: "seeding_time",
is_optional: false,
description: Some(
"Torrent elapsed time while complete (seconds)",
),
},
),
Number(
TypeInfo {
name: "seeding_time_limit",
is_optional: false,
description: Some(
"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.",
),
},
),
Number(
TypeInfo {
name: "seen_complete",
is_optional: false,
description: Some(
"Time (Unix Epoch) when this torrent was last seen complete",
),
},
),
Bool(
TypeInfo {
name: "seq_dl",
is_optional: false,
description: Some(
"True if sequential download is enabled",
),
},
),
Number(
TypeInfo {
name: "size",
is_optional: false,
description: Some(
"Total size (bytes) of files selected for download",
),
},
),
String(
TypeInfo {
name: "state",
is_optional: false,
description: Some(
"Torrent state. See table here below for the possible values",
),
},
),
Bool(
TypeInfo {
name: "super_seeding",
is_optional: false,
description: Some(
"True if super seeding is enabled",
),
},
),
String(
TypeInfo {
name: "tags",
is_optional: false,
description: Some(
"Comma-concatenated tag list of the torrent",
),
},
),
Number(
TypeInfo {
name: "time_active",
is_optional: false,
description: Some(
"Total active time (seconds)",
),
},
),
Number(
TypeInfo {
name: "total_size",
is_optional: false,
description: Some(
"Total size (bytes) of all file in this torrent (including unselected ones)",
),
},
),
String(
TypeInfo {
name: "tracker",
is_optional: false,
description: Some(
"The first tracker with working status. Returns empty string if no tracker is working.",
),
},
),
Number(
TypeInfo {
name: "up_limit",
is_optional: false,
description: Some(
"Torrent upload speed limit (bytes/s). -1 if ulimited.",
"The response is:\n\n- empty, if the torrent hash is invalid\n- otherwise, a JSON object with the following fields\n\n\nNB: `-1` is returned if the type of the property is integer but its value is not known.\n\nExample:\n\n```JSON\n{\n \"addition_date\":1438429165,\n \"comment\":\"\\\"Debian CD from cdimage.debian.org\\\"\",\n \"completion_date\":1438429234,\n \"created_by\":\"\",\n \"creation_date\":1433605214,\n \"dl_limit\":-1,\n \"dl_speed\":0,\n \"dl_speed_avg\":9736015,\n \"eta\":8640000,\n \"last_seen\":1438430354,\n \"nb_connections\":3,\n \"nb_connections_limit\":250,\n \"peers\":1,\n \"peers_total\":89,\n \"piece_size\":524288,\n \"pieces_have\":1254,\n \"pieces_num\":1254,\n \"reannounce\":672,\n \"save_path\":\"/Downloads/debian-8.1.0-amd64-CD-1.iso\",\n \"seeding_time\":1128,\n \"seeds\":1,\n \"seeds_total\":254,\n \"share_ratio\":0.00072121022562178299,\n \"time_elapsed\":1197,\n \"total_downloaded\":681521119,\n \"total_downloaded_session\":681521119,\n \"total_size\":657457152,\n \"total_uploaded\":491520,\n \"total_uploaded_session\":491520,\n \"total_wasted\":23481724,\n \"up_limit\":-1,\n \"up_speed\":0,\n \"up_speed_avg\":410\n}\n```",
"The response is a JSON array, where each element contains info about one tracker, with the following fields\n\n\nPossible values of `status`:\n\n\nExample:\n\n```JSON\n[\n {\n \"msg\":\"\",\n \"num_peers\":100,\n \"status\":2,\n \"url\":\"http://bttracker.debian.org:6969/announce\"\n },\n {\n another_tracker_info\n }\n]\n```",
"Tracker status. See the table below for possible values",
),
},
),
Number(
TypeInfo {
name: "tier",
is_optional: false,
description: Some(
"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).",
),
},
),
Number(
TypeInfo {
name: "num_peers",
is_optional: false,
description: Some(
"Number of peers for current torrent, as reported by the tracker",
),
},
),
Number(
TypeInfo {
name: "num_seeds",
is_optional: false,
description: Some(
"Number of seeds for current torrent, asreported by the tracker",
),
},
),
Number(
TypeInfo {
name: "num_leeches",
is_optional: false,
description: Some(
"Number of leeches for current torrent, as reported by the tracker",
),
},
),
Number(
TypeInfo {
name: "num_downloaded",
is_optional: false,
description: Some(
"Number of completed downlods for current torrent, as reported by the tracker",
),
},
),
String(
TypeInfo {
name: "msg",
is_optional: false,
description: Some(
"Tracker message (there is no way of knowing what this message is - it's up to tracker admins)",
"The response is a JSON array, where each element is information about one webseed, with the following fields\n\n\nExample:\n\n```JSON\n[\n {\n \"url\":\"http://some_url/\"\n },\n {\n \"url\":\"http://some_other_url/\"\n }\n]\n```",
"The response is:\n\n- empty, if the torrent hash is invalid\n- otherwise, a JSON array, where each element contains info about one file, with the following fields\n\n\nPossible values of `priority`:\n\n\nExample:\n\n```JSON\n\n[\n {\n \"index\":0,\n \"is_seed\":false,\n \"name\":\"debian-8.1.0-amd64-CD-1.iso\",\n \"piece_range\":[0,1253],\n \"priority\":1,\n \"progress\":0,\n \"size\":657457152,\n \"availability\":0.5,\n }\n]\n```",
"The response is:\n\n- empty, if the torrent hash is invalid\n- otherwise, an array of states (integers) of all pieces (in order) of a specific torrent.\n\nValue meanings are defined as below:\n\n\nExample:\n\n```JSON\n[0,0,2,1,0,0,2,1]\n```",
"The response is:\n\n- empty, if the torrent hash is invalid\n- otherwise, an array of hashes (strings) of all pieces (in order) of a specific torrent.\n\nExample:\n\n```JSON\n[\"54eddd830a5b58480a6143d616a97e3a6c23c439\",\"f8a99d225aa4241db100f88407fc3bdaead583ab\",\"928fb615b9bd4dd8f9e9022552c8f8f37ef76f58\"]\n```",
"The response is a JSON array of objects containing the following fields\n\n\nExample:\n\n```JSON\n[\n {\n \"id\": 12345,\n \"status\": \"Running\",\n \"total\": 170\n }\n]\n```",
"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 \\",