transmission-api

SkillDev tools

Transmission RPC reference covering JSON-RPC 2.0 transport, session token handling, torrent methods, session methods, and protocol versioning.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the transmission-api skill

What this skill tells your AI

The instructions your AI receives, as published by tympanix/electorrent in .agents/skills/transmission-api/SKILL.md and read by ahel’s review.

[!IMPORTANT] Transmisson 4.1.0 (rpc_version_semver 6.0.0) added support for the JSON-RPC 2.0 protocol and converted all RPC strings to snake_case.

The old bespoke RPC protocol, and the old mix of kebab-case and camelCase strings, are still supported in Transmission 4 but are deprecated and will be removed in the future. People using the old protocol should update their code!

For documentation of the old RPC protocol and strings, please consult documentation from previous versions. https://github.com/transmission/transmission/blob/4.0.6/docs/rpc-spec.md

Transmission's RPC specification

This document describes a protocol for interacting with Transmission sessions remotely.

1.1 Terminology

The JSON terminology in RFC 8259 is used. RPC requests and responses are formatted in JSON.

1.2 Tools

If transmission-remote is called with a --debug argument, its RPC traffic to the Transmission server will be dumped to the terminal. This can be useful when you want to compare requests in your application to another for reference.

If transmission-qt is run with an environment variable TR_RPC_VERBOSE set, it too will dump the RPC requests and responses to the terminal for inspection.

Lastly, using the browser's developer tools in the Transmission web client is always an option.

1.3 Libraries of ready-made wrappers

Some people outside of the Transmission project have written libraries that wrap this RPC API. These aren't supported by the Transmission project, but are listed here in the hope that they may be useful:

LanguageLink
C# .NET10https://www.nuget.org/packages/Transmission.API.RPC.NET/
C#https://www.nuget.org/packages/Transmission.API.RPC
Gohttps://github.com/hekmon/transmissionrpc
Pythonhttps://github.com/Trim21/transmission-rpc
Rusthttps://crates.io/crates/transmission-rpc

2 Message format

Transmission follows the JSON-RPC 2.0 specification and supports the entirety of it, except that parameters by-position is not supported, meaning the request parameters must be an Object.

Response parameters are returned in the result Object.

Example request
{
   "jsonrpc": "2.0",
   "params": {
     "fields": [ "version" ]
   },
   "method": "session_get",
   "id": 912313
}
Example response
{
   "jsonrpc": "2.0",
   "result": {
      "version": "4.1.0-dev (ae226418eb)"
   },
   "id": 912313
}

2.1 Error data

JSON-RPC 2.0 allows for additional information about an error be included in the data key of the Error object in an implementation-defined format.

In Transmission, this key is an Object that includes:

  1. An optional error_string string that provides additional information that is not included in the message key of the Error object.
  2. An optional result Object that contains additional keys defined by the method.
{
   "jsonrpc": "2.0",
   "error": {
      "code": 7,
      "message": "HTTP error from backend service",
      "data": {
         "error_string": "Couldn't test port: No Response (0)",
         "result": {
            "ip_protocol": "ipv6"
         }
      }
   },
   "id": 912313
}

2.2 Transport mechanism

HTTP POSTing a JSON-encoded request is the preferred way of communicating with a Transmission RPC server. The current Transmission implementation has the default URL as http://host:9091/transmission/rpc. Clients may use this as a default, but should allow the URL to be reconfigured, since the port and path may be changed to allow mapping and/or multiple daemons to run on a single server.

The RPC server will normally return HTTP 200 regardless of whether the request succeeded. For JSON-RPC 2.0 notifications, HTTP 204 will be returned.

2.2.1 CSRF protection

Most Transmission RPC servers require a X-Transmission-Session-Id header to be sent with requests, to prevent CSRF attacks.

When your request has the wrong id -- such as when you send your first request, or when the server expires the CSRF token -- the Transmission RPC server will return an HTTP 409 error with the right X-Transmission-Session-Id in its own headers.

So, the correct way to handle a 409 response is to update your X-Transmission-Session-Id and to resend the previous request.

2.2.2 DNS rebinding protection

Additional check is being made on each RPC request to make sure that the client sending the request does so using one of the allowed hostnames by which RPC server is meant to be available.

If host whitelisting is enabled (which is true by default), Transmission inspects the Host: HTTP header value (with port stripped, if any) and matches it to one of the whitelisted names. Regardless of host whitelist content, localhost and localhost. domain names as well as all the IP addresses are always implicitly allowed.

For more information on configuration, see Editing Configuration Files documentation for rpc_host_whitelist_enabled and rpc_host_whitelist keys.

2.2.3 Authentication

Enabling authentication is an optional security feature that can be enabled on Transmission RPC servers. Authentication occurs by method of HTTP Basic Access Authentication.

If authentication is enabled, Transmission inspects the Authorization: HTTP header value to validate the credentials of the request. The value of this HTTP header is expected to be Basic <b64 credentials>, where is equal to a base64 encoded string of the username and password (respectively), separated by a colon.

3 Torrent requests

3.1 Torrent action requests

Method namelibtransmission functionDescription
torrent_starttr_torrentStartstart torrent
torrent_start_nowtr_torrentStartNowstart torrent disregarding queue position
torrent_stoptr_torrentStopstop torrent
torrent_verifytr_torrentVerifyverify torrent
torrent_reannouncetr_torrentManualUpdatere-announce to trackers now

Request parameters: ids, which specifies which torrents to use. All torrents are used if the ids parameter is omitted.

ids should be one of the following:

  1. an integer referring to a torrent id
  2. a list of torrent id numbers, SHA1 hash strings, or both
  3. a string, recently_active, for recently-active torrents

Note that integer torrent ids are not stable across Transmission daemon restarts. Use torrent hashes if you need stable ids.

Response parameters: none

3.2 Torrent mutator: torrent_set

Method name: torrent_set

Request parameters:

KeyValue TypeValue Description
bandwidth_prioritynumberthis torrent's bandwidth tr_priority_t
download_limitnumbermaximum download speed (kB/s)
download_limitedbooleantrue if download_limit is honored
files_unwantedarrayindices of file(s) to not download
files_wantedarrayindices of file(s) to download
groupstringThe name of this torrent's bandwidth group
honors_session_limitsbooleantrue if session upload limits are honored
idsarraytorrent list, as described in 3.1
labelsarrayarray of string labels
locationstringnew location of the torrent's content
peer_limitnumbermaximum number of peers
priority_higharrayindices of high-priority file(s)
priority_lowarrayindices of low-priority file(s)
priority_normalarrayindices of normal-priority file(s)
queue_positionnumberposition of this torrent in its queue [0...n)
seed_idle_limitnumbertorrent-level number of minutes of seeding inactivity
seed_idle_modenumberwhich seeding inactivity to use. See tr_idlelimit
seed_ratio_limitdoubletorrent-level seeding ratio
seed_ratio_modenumberwhich ratio to use. See tr_ratiolimit
sequential_downloadbooleandownload torrent pieces sequentially
sequential_download_from_piecenumberdownload from a specific piece when sequential download is enabled
tracker_addarrayDEPRECATED use tracker_list instead
tracker_liststringstring of announce URLs, one per line, and a blank line between tiers.
tracker_removearrayDEPRECATED use tracker_list instead
tracker_replacearrayDEPRECATED use tracker_list instead
upload_limitnumbermaximum upload speed (kB/s)
upload_limitedbooleantrue if upload_limit is honored

Just as an empty ids value is shorthand for "all ids", using an empty array for files_wanted, files_unwanted, priority_high, priority_low, or priority_normal is shorthand for saying "all files".

Response parameters: none

3.3 Torrent accessor: torrent_get

Method name: torrent_get.

Request parameters:

  1. An optional ids array as described in 3.1.
  2. A required fields array of keys. (see list below)
  3. An optional format string specifying how to format the torrents response field. Allowed values are objects (default) and table. (see "Response parameters" below)

Response parameters:

  1. A torrents array.

    If the format request was objects (default), torrents will be an array of objects, each of which contains the key/value pairs matching the request's fields arg. This was the only format before Transmission 3 and has some obvious programmer conveniences, such as parsing directly into Javascript objects.

    If the format was table, then torrents will be an array of arrays. The first row holds the keys and each remaining row holds a torrent's values for those keys. This format is more efficient in terms of JSON generation and JSON parsing.

  2. If the request's ids field was recently_active, a removed array of torrent-id numbers of recently-removed torrents.

Note: For more information on what these fields mean, see the comments in libtransmission/transmission.h. The 'source' column here corresponds to the data structure there.

KeyValue Typetransmission.h source
activity_datenumbertr_stat
added_datenumbertr_stat
availabilityarray (see below)tr_torrentAvailability()
bandwidth_prioritynumbertr_priority_t
bytes_completedarray (see below)n/a
commentstringtr_torrent_view
corrupt_evernumbertr_stat
creatorstringtr_torrent_view
date_creatednumbertr_torrent_view
desired_availablenumbertr_stat
done_datenumbertr_stat
download_dirstringtr_torrent
downloaded_everintegertr_stat
download_limitintegertr_torrent
download_limitedbooleantr_torrent
edit_datenumbertr_stat
errornumbertr_stat
error_stringstringtr_stat
etanumbertr_stat
eta_idlenumbertr_stat
file_countnumbertr_info
filesarray (see below)n/a
file_statsarray (see below)n/a
groupstringn/a
hash_stringstringtr_torrent_view
have_uncheckednumbertr_stat
have_validnumbertr_stat
honors_session_limitsbooleantr_torrent
idintegertr_torrent
is_finishedbooleantr_stat
is_privatebooleantr_torrent
is_stalledbooleantr_stat
labelsarray of stringstr_torrent
left_until_donenumbertr_stat
magnet_linkstringn/a
manual_announce_timenumberDEPRECATED don't use it, it never worked
max_connected_peersnumbertr_torrent
metadata_percent_completedoubletr_stat
namestringtr_torrent_view
peer_limitnumbertr_torrent
peersarray (see below)n/a
peers_connectednumbertr_stat
peers_fromobject (see below)n/a
peers_getting_from_usnumbertr_stat
peers_sending_to_usnumbertr_stat
percent_completedoubletr_stat
percent_donedoubletr_stat
piecesstring (see below)tr_torrent
piece_countnumbertr_torrent_view
piece_sizenumbertr_torrent_view
prioritiesarray (see below)n/a
primary_mime_typestringtr_torrent
queue_positionnumbertr_stat
rate_download (B/s)numbertr_stat
rate_upload (B/s)numbertr_stat
recheck_progressdoubletr_stat
seconds_downloadingnumbertr_stat
seconds_seedingnumbertr_stat
seed_idle_limitnumbertr_torrent
seed_idle_modenumbertr_inactivelimit
seed_ratio_limitdoubletr_torrent
seed_ratio_modenumbertr_ratiolimit
sequential_downloadbooleantr_torrent
sequential_download_from_piecenumbertr_torrent
size_when_donenumbertr_stat
start_datenumbertr_stat
statusnumber (see below)tr_stat
torrent_filestringtr_info
total_sizenumbertr_torrent_view
trackersarray (see below)n/a
tracker_liststringstring of announce URLs, one per line, with a blank line between tiers
tracker_statsarray (see below)n/a
uploaded_everintegertr_stat
upload_limitintegertr_torrent
upload_limitedbooleantr_torrent
upload_ratiodoubletr_stat
wantedarray (see below)n/a
webseedsarray of stringsDEPRECATED tr_tracker_view
webseeds_exarray (see below)n/a
webseeds_sending_to_usnumbertr_stat

availability: An array of piece_count numbers representing the number of connected peers that have each piece, or -1 if we already have the piece ourselves.

bytes_completed: An array of tr_info.filecount numbers. Each is the completed bytes for the corresponding file.

files: array of objects, each containing:

KeyValue Typetransmission.h source
bytes_completednumbertr_file_view
lengthnumbertr_file_view
namestringtr_file_view
begin_piecenumbertr_file_view
end_piecenumbertr_file_view

Files are returned in the order they are laid out in the torrent. References to "file indices" throughout this specification should be interpreted as the position of the file within this ordering, with the first file bearing index 0.

file_stats: a file's non-constant properties. An array of tr_info.filecount objects, in the same order as files, each containing:

KeyValue Typetransmission.h source
bytes_completednumbertr_file_view
wantedbooleantr_file_view
prioritynumbertr_file_view

peers: an array of objects, each containing:

KeyValue Typetransmission.h source
addressstringtr_peer_stat
bytes_to_clientnumbertr_peer_stat
bytes_to_peernumbertr_peer_stat
client_is_chokedbooleantr_peer_stat
client_is_interestedbooleantr_peer_stat
client_namestringtr_peer_stat
flag_strstringtr_peer_stat
is_downloading_frombooleantr_peer_stat
is_encryptedbooleantr_peer_stat
is_incomingbooleantr_peer_stat
is_uploading_tobooleantr_peer_stat
is_utpbooleantr_peer_stat
peer_idstringtr_peer_stat
peer_is_chokedbooleantr_peer_stat
peer_is_interestedbooleantr_peer_stat
portnumbertr_peer_stat
progressdoubletr_peer_stat
rate_to_client (B/s)numbertr_peer_stat
rate_to_peer (B/s)numbertr_peer_stat

peers_from: an object containing:

KeyValue Typetransmission.h source
from_cachenumbertr_stat
from_dhtnumbertr_stat
from_incomingnumbertr_stat
from_lpdnumbertr_stat
from_ltepnumbertr_stat
from_pexnumbertr_stat
from_trackernumbertr_stat

pieces: A bitfield holding piece_count flags which are set to 'true' if we have the piece matching that position. JSON doesn't allow raw binary data, so this is a base64-encoded string. (Source: tr_torrent)

priorities: An array of tr_torrentFileCount() numbers. Each is the tr_priority_t mode for the corresponding file.

status: A number between 0 and 6, where:

ValueMeaning
0Torrent is stopped
1Torrent is queued to verify local data
2Torrent is verifying local data
3Torrent is queued to download
4Torrent is downloading
5Torrent is queued to seed
6Torrent is seeding

trackers: array of objects, each containing:

KeyValue Typetransmission.h source
announcestringtr_tracker_view
idintegertr_tracker_view
scrapestringtr_tracker_view
sitenamestringtr_tracker_view
tiernumbertr_tracker_view

tracker_stats: array of objects, each containing:

KeyValue Typetransmission.h source
announcestringtr_tracker_view
announce_statenumbertr_tracker_view
download_countnumbertr_tracker_view
downloader_countnumbertr_tracker_view
has_announcedbooleantr_tracker_view
has_scrapedbooleantr_tracker_view
hoststringtr_tracker_view
idintegertr_tracker_view
is_backupbooleantr_tracker_view
last_announce_peer_countnumbertr_tracker_view
last_announce_resultstringtr_tracker_view
last_announce_start_timenumbertr_tracker_view
last_announce_succeededbooleantr_tracker_view
last_announce_timenumbertr_tracker_view
last_announce_timed_outbooleantr_tracker_view
last_scrape_resultstringtr_tracker_view
last_scrape_start_timenumbertr_tracker_view
last_scrape_succeededbooleantr_tracker_view
last_scrape_timenumbertr_tracker_view
last_scrape_timed_outbooleantr_tracker_view
leecher_countnumbertr_tracker_view
next_announce_timenumbertr_tracker_view
next_scrape_timenumbertr_tracker_view
scrapestringtr_tracker_view
scrape_statenumbertr_tracker_view
seeder_countnumbertr_tracker_view
sitenamestringtr_tracker_view
tiernumbertr_tracker_view

webseeds_ex: array of objects, each containing:

KeyValue Typetransmission.h source
urlstringtr_webseed_view
is_downloadingbooleantr_webseed_view
download_bytes_per_secondnumbertr_webseed_view

wanted: An array of tr_torrentFileCount() booleans, true if the corresponding file is to be downloaded. (Source: tr_file_view)

Note: For backwards compatibility, in the old bespoke API, wanted is serialized as an array of 0 or 1 that should be treated as booleans.

Example:

Say we want to get the name and total size of torrents #7 and #10.

Request:

{
   "jsonrpc": "2.0",
   "params": {
       "fields": [ "id", "name", "total_size" ],
       "ids": [ 7, 10 ]
   },
   "method": "torrent_get",
   "id": 39693
}

Response:

{
   "jsonrpc": "2.0",
   "result": {
      "torrents": [
         {
             "id": 10,
             "name": "Fedora x86_64 DVD",
             "total_size": 34983493932
         },
         {
             "id": 7,
             "name": "Ubuntu x86_64 DVD",
             "total_size": 9923890123
         }
      ]
   },
   "id": 39693
}

3.4 Adding a torrent

Method name: torrent_add

Request parameters:

KeyValue TypeDescription
cookiesstringpointer to a string of one or more cookies.
download_dirstringpath to download the torrent to
filenamestringfilename or URL of the .torrent file
labelsarrayarray of string labels
metainfostringbase64-encoded .torrent content
pausedbooleanif true, don't start the torrent
peer_limitnumbermaximum number of peers
bandwidth_prioritynumbertorrent's bandwidth tr_priority_t
files_wantedarrayindices of file(s) to download
files_unwantedarrayindices of file(s) to not download
priority_higharrayindices of high-priority file(s)
priority_lowarrayindices of low-priority file(s)
priority_normalarrayindices of normal-priority file(s)
sequential_downloadbooleandownload torrent pieces sequentially
sequential_download_from_piecenumberdownload from a specific piece when sequential download is enabled

Either filename or metainfo must be included. All other parameters are optional.

The format of the cookies should be NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie should contain. Set multiple cookies like this: name1=content1; name2=content2; etc. See libcurl documentation for more information.

Response parameters:

  • On success, a torrent_added object in the form of one of 3.3's torrent objects with the fields for id, name, and hash_string.

  • When attempting to add a duplicate torrent, a torrent_duplicate object in the same form is returned, but the response's result value is still success.

3.5 Removing a torrent

Method name: torrent_remove

KeyValue TypeDescription
idsarraytorrent list, as described in 3.1
delete_local_databooleandelete local data. (default: false)

Response parameters: none

3.6 Moving a torrent

Method name: torrent_set_location

Request parameters:

KeyValue TypeDescription
idsarraytorrent list, as described in 3.1
locationstringthe new torrent location
movebooleanif true, move from previous location. otherwise, search location for files (default: false)

Response parameters: none

3.7 Renaming a torrent's path

Method name: torrent_rename_path

For more information on the use of this function, see the transmission.h documentation of tr_torrentRenamePath(). In particular, note that if this call succeeds you'll want to update the torrent's files and name field with torrent_get.

Request parameters:

Shortened here. Read the whole file on GitHub.

Signals

GitHub stars
1k
Forks
98
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
transmission-api
Source
github.com/tympanix/electorrent