autobrr Integration
qui integrates with autobrr through webhook endpoints, enabling real-time cross-seed detection when autobrr announces new releases.
How It Works
- autobrr sees a new release from a tracker
- autobrr sends the torrent name to qui's
/api/cross-seed/webhook/checkendpoint - qui searches your qBittorrent instances for matching content
- qui responds with:
200 OK– matching torrent is complete and ready to cross-seed202 Accepted– matching torrent exists but still downloading; retry later404 Not Found– no matching torrent exists
- On
200 OK, autobrr sends the torrent file to/api/cross-seed/apply
Setup
1. Create an API Key in qui
- Go to Settings → API Keys
- Click Create API Key
- Name it (e.g., "autobrr webhook")
- Copy the generated key
2. Configure autobrr External Filter
In your autobrr filter, go to External tab → Add new:
| Field | Value |
|---|---|
| Type | Webhook |
| Name | qui |
| On Error | Reject |
| Endpoint | http://localhost:7476/api/cross-seed/webhook/check |
| HTTP Method | POST |
| HTTP Request Headers | X-API-Key=YOUR_QUI_API_KEY |
| Expected HTTP Status Code | 200 |
Data (JSON):
{
"torrentName": {{ toRawJson .TorrentName }},
"instanceIds": [1]
}
To search all instances, omit instanceIds:
{
"torrentName": {{ toRawJson .TorrentName }}
}
Field descriptions:
torrentName(required): The release name as announcedinstanceIds(optional): qBittorrent instance IDs to scan. Omit to search all instances.findIndividualEpisodes(optional): Override the global episode matching setting
3. Configure Retry Handling
Use autobrr's Retry block to handle 202 Accepted responses:
- Retry HTTP status code(s):
202 - Maximum retry attempts:
10 - Retry delay in seconds:
4
Apply Endpoint
When /check returns 200 OK, send the torrent to /api/cross-seed/apply:
Action setup in autobrr:
| Field | Value |
|---|---|
| Action Type | Webhook |
| Name | qui cross-seed |
| Endpoint | http://localhost:7476/api/cross-seed/apply?apikey=YOUR_QUI_API_KEY |
Payload (JSON):
{
"torrentData": "{{ .TorrentDataRawBytes | toString | b64enc }}",
"instanceIds": [1],
"indexerName": {{ toRawJson .IndexerName }}
}
Field descriptions:
torrentData(required) - Base64-encoded torrent file bytesinstanceIds(optional) - Target instances (omit to apply to any matching instance)indexerName(optional) - Indexer display name (e.g., "TorrentDB"). Only used when "Use indexer name as category" mode is enabled; ignored otherwisetags(optional) - Override webhook tags from settingscategory(optional) - Override category. Takes precedence overindexerNamestartPaused(optional) - Override whether torrents are added pausedskipIfExists(optional) - Skip adding if the torrent already existsfindIndividualEpisodes(optional) - Override the global episode matching setting
Cross-seeded torrents are added paused with skip_checking=true. qui polls the torrent state and auto-resumes if progress meets the size tolerance threshold. If progress is too low, it remains paused for manual review.
Webhook Source Filters
By default, the webhook endpoint scans all torrents on your instances when looking for matches. You can configure filters to exclude certain categories or tags from being matched:
- Exclude Categories: Skip torrents in specific categories (e.g.,
cross-seed-link) - Exclude Tags: Skip torrents with specific tags (e.g.,
no-cross-seed) - Include Categories: Only match against torrents in these categories (leave empty for all)
- Include Tags: Only match against torrents with these tags (leave empty for all)
This is useful when:
- You have a legacy cross-seed category that shouldn't be re-matched
- Certain content types should never be considered for cross-seeding
- You want to exclude torrents with specific metadata tags
Exclude filters take precedence over include filters. Tag matching is case-sensitive. When both category and tag include filters are configured, a torrent must pass both filter checks (matching at least one allowed category AND at least one allowed tag).
Configure in qui UI: Cross-Seed → Auto → Webhook / autobrr