The lifecycle
Every source you add — a magnet, a hash, a release link — becomes a job. A job moves through a handful of states, and what you get back depends on where it is:- Cached hits are instant. The bytes are already on disk, so the job is created as
downloadedand itslinksare populated on the same call. - Misses download server-side. You poll the torrent until its status is
downloaded, then unrestrict a link. No local torrent client, no seeding, no waiting on your own bandwidth. - The cache is shared. Once anyone downloads a title, it’s cached for every user — which is why the availability check matters before you add.
Two dialects, one engine
Torrin exposes the same jobs through two API shapes. Pick the one your client speaks — they sit on the same cache and the same downloads.
If you’re integrating from scratch, use
/rest/1.0 — it’s the most widely supported shape
and every RD tutorial applies.
Instant availability
Before adding a magnet, ask whether it’s already cached. This is the cheapest call in the API and it decides whether playback is instant or a download:/rest/1.0/torrents/instantAvailability/{hashes}returns a key for every hash you asked about — ardarray when cached, or an empty{}when it isn’t. Key presence is not enough; check that therdarray is non-empty./v0/store/magnets/checkis richer. Each item is one of:
Streaming
A torrent’slinks are torrin:// references, not URLs. To play one, unrestrict it:
download URL: a signed HTTPS link valid for 24 hours, served from the
nearest cache node with the origin IP hidden. It supports range requests, so players can
seek. (StremThru files[].link is already this signed URL — no unrestrict step.)
Torrin doesn’t know a file’s exact byte size until it’s read, so
unrestrict returns
filesize: 0. Take the real size from the torrent’s file entry (files[].bytes) instead.A typical flow
Adding a magnet and playing the biggest file, end to end:1
Check if it's cached
GET /rest/1.0/torrents/instantAvailability/{hash} — if the rd array is non-empty,
playback will be instant.2
Add it
POST /rest/1.0/torrents/addMagnet with the magnet. You get back an id.3
Wait for it (only on a cache miss)
Poll
GET /rest/1.0/torrents/info/{id} until status is downloaded. A cached add is
already downloaded.4
Play
Pick a
link from the torrent, POST /rest/1.0/unrestrict/link, and open the returned
download URL.Job statuses
The RealDebridstatus field is torrin’s internal job state, mapped to RD’s vocabulary:
Your plan’s concurrency limit applies to jobs that are actively downloading; cached adds
don’t consume a slot. Hitting the limit returns
503 (RD) / 429 (store) with a
slot limit reached message.