Gazelle API Response¶
Endpoint (action=index)¶
The path ajax.php comes from the tracker's apiPath field. This is standard across all Gazelle forks.
Authentication¶
API token passed as an HTTP header:
Some forks (configured with authStyle: "raw") use the token value directly without the token prefix. The adapter checks options.authStyle to handle this.
Example Response¶
{
"status": "success",
"response": {
"username": "JohnDoe",
"id": 12345,
"giftTokens": 3,
"meritTokens": 0,
"notifications": {
"messages": 0,
"notifications": 2,
"newAnnouncement": false,
"newBlog": false,
"newSubscriptions": false
},
"userstats": {
"uploaded": 536870912000,
"downloaded": 134217728000,
"ratio": 4.0,
"requiredratio": 0.6,
"class": "Power User",
"bonusPoints": 12500,
"seedingcount": 42,
"leechingcount": 1,
"freeleechTokens": 3
}
}
}
Byte values are raw integers (bytes), not formatted strings. The id field in the top-level response is the user's remote ID — the adapter caches this as remoteUserId for use in the enrichment call.
Field Mapping (action=index)¶
| TrackerStats field | Gazelle path | Type | Notes |
|---|---|---|---|
username |
response.username |
string |
Direct copy |
group |
response.userstats.class |
string |
Falls back to "Unknown" |
uploadedBytes |
response.userstats.uploaded |
number |
BigInt(Math.floor(...)) |
downloadedBytes |
response.userstats.downloaded |
number |
BigInt(Math.floor(...)) |
ratio |
response.userstats.ratio |
number |
Defaults to 0 if not a number |
bufferBytes |
— | — | Calculated: uploadedBytes - downloadedBytes (min 0) |
seedingCount |
response.userstats.seedingcount |
number? |
Defaults to 0 — many forks omit this |
leechingCount |
response.userstats.leechingcount |
number? |
Defaults to 0 — many forks omit this |
seedbonus |
response.userstats.bonusPoints or .bonuspoints |
number? |
Checks both casing variants |
hitAndRuns |
— | — | Always null — not in Gazelle index response |
requiredRatio |
response.userstats.requiredratio |
number? |
null if absent |
warned |
— | — | Defaults to false from index; overridden if enrichment runs |
freeleechTokens |
response.userstats.freeleechTokens or response.giftTokens |
number? |
Checks userstats first, falls back to top-level giftTokens |
remoteUserId |
response.id |
number |
Cached to skip re-parsing on future polls |
Enrichment Response (action=user)¶
Trackers configured with enrich: true make a second call after the index request:
This call fetches the full user profile including warned status, join date, seeding/leeching counts from the community object, ranks, and avatar.
Example Response¶
{
"status": "success",
"response": {
"username": "JohnDoe",
"avatar": "https://example.com/avatars/johndoe.jpg",
"stats": {
"joinedDate": "2021-04-12 09:34:00",
"lastAccess": "2026-03-19 14:22:11",
"uploaded": 536870912000,
"downloaded": 134217728000,
"ratio": 4.0,
"buffer": 402653184000,
"requiredRatio": 0.6
},
"ranks": {
"uploaded": 1842,
"downloaded": 5210,
"uploads": 304,
"requests": 88,
"bounty": 0,
"posts": 127,
"artists": 14,
"overall": 980
},
"personal": {
"class": "Power User",
"paranoia": 0,
"paranoiaText": "Off",
"donor": false,
"warned": false,
"enabled": true
},
"community": {
"posts": 127,
"torrentComments": 43,
"artistComments": 12,
"collageComments": 3,
"requestComments": 8,
"collagesStarted": 2,
"collagesContrib": 11,
"requestsFilled": 5,
"requestsVoted": 29,
"perfectFlacs": 18,
"uploaded": 304,
"groups": 48,
"seeding": 42,
"leeching": 1,
"snatched": 1204,
"invited": 3,
"bountyEarned": null,
"bountySpent": null
}
}
}
What the enrichment step overrides¶
| TrackerStats field | Source in action=user response | Notes |
|---|---|---|
warned |
personal.warned |
Overrides the false default from index |
joinedDate |
stats.joinedDate |
Not available from index |
lastAccessDate |
stats.lastAccess |
Not available from index |
bufferBytes |
stats.buffer |
Richer than the calculated value |
seedingCount |
community.seeding |
More reliable than index for many forks |
leechingCount |
community.leeching |
More reliable than index for many forks |
avatarUrl |
avatar |
Not available from index |
platformMeta |
personal, ranks, community |
Full GazellePlatformMeta object |
If the enrichment call fails for any reason, the adapter continues with core stats from the index response — the failure is non-fatal.
Gazelle Fork Variations¶
| Site | bonusPoints field | freeleechTokens | seedingcount in index |
|---|---|---|---|
| Redacted (RED) | bonusPoints |
Sometimes | No |
| Orpheus (OPS) | bonusPoints |
Sometimes | No |
| BroadcasTheNet (BTN) | Varies | No | No |
| PassThePopcorn (PTP) | Varies | No | No |
| AnimeBytes (AB) | Varies | Varies | No |
GazelleGames (GGn) is handled by its own separate adapter — see the GGn page.