Overview
TikTool exposes two categories of leaderboard data through its website API at tik.tools. Both endpoints return real-time competitive ranking data for TikTok LIVE creators sorted by diamond earnings.
Regional Leaderboards
Daily rankings of the top 100 creators by total diamonds earned, broken down by geographic region. Updated continuously throughout the day. Available to Basic, Pro, and Ultra subscribers.
- Top 100 creators per region
- Rank, score (diamonds), live status, room ID
- 28 regions worldwide
- Data refreshes every 10 seconds
League Rankings
Class-based competitive ranking data (A1 through D3) for creators competing in TikTok LIVE leagues. Reveals who is in each competitive tier in any region. Requires Ultra developer plan. Agency PASS (tik.tools/vip) is a website subscription - it gives frontend access to league data on the website, not programmatic API access.
- 8 class tiers: A1, A2, B5, C1, C2, D1, D2, D3
- Per-class ranked entries with live status
- Glass-wall teaser for lower tiers (5 entries)
- Data refreshes every 5 minutes
tik.tools (not api.tik.tools) and use session-based auth. Call them from your server with a valid session cookie obtained by logging into tik.tools with a paid developer account. All paid developer plans (Basic, Pro, Ultra) have access to regional leaderboard endpoints. League endpoints require the Ultra developer plan. The Agency PASS subscription (at tik.tools/vip) is a separate website-only product - it grants access to league data through the tik.tools website interface, not via this developer API. Region Reference
28 regional leaderboards are available. Use the Slug in the country leaderboard endpoint URL, and the Region Code in league endpoints.
balkansBKBalkans (Albania, Serbia, Bosnia, North Macedonia, Kosovo, Montenegro)north-americaUS+North America (United States, Canada)united-kingdom-regionGB+United Kingdombroader-chinaBCBroader China (China, Taiwan, Hong Kong)southeast-asiaSEASoutheast Asia (Vietnam, Thailand, Indonesia, Malaysia, Philippines)brazilBRBrazilturkeyTRTurkeymexicoMXMexicosaudi-arabiaSASaudi ArabiaegyptEGEgyptiraqIQIraqgermanyDEGermanyfranceFRFrancespainESSpainitalyITItalyrussiaRURussiajapanJPJapansouth-koreaKRSouth KoreaaustraliaAUAustraliaargentinaARArgentinacolombiaCOColombiachileCLChileperuPEPerupakistanPKPakistanindiaINIndianigeriaNGNigeriasouth-africaZASouth AfricamoroccoMAMoroccoEndpoint: Regional Leaderboard
https://tik.tools/api/leaderboards/country/:slugAll Paid PlansReturns the current day's top-100 leaderboard for a region. Entries are sorted by score (total diamonds earned today) descending.
Path Parameters
slugstringRegion slug from the Region Reference table above (e.g., balkans, north-america)Response Schema
[].ranknumberPosition on the leaderboard (1 = highest earner)[].uniqueIdstringTikTok username (without @)[].nicknamestringDisplay name shown on TikTok[].scorenumberTotal diamonds earned today in this region[].isLivebooleanWhether the creator is currently streaming live[].roomIdstring | nullLive room ID if currently streaming, otherwise nullExample Response
[
{
"rank": 1,
"uniqueId": "top_creator",
"nickname": "Top Creator",
"score": 284500,
"isLive": true,
"roomId": "7384920175638291456"
},
{
"rank": 2,
"uniqueId": "second_place",
"nickname": "Second Place",
"score": 198200,
"isLive": false,
"roomId": null
}
]Code Examples
// Node.js - fetch Balkans leaderboard
const response = await fetch('https://tik.tools/api/leaderboards/country/balkans', {
headers: {
'x-api-key': 'YOUR_ULTRA_API_KEY',
}
})
const entries = await response.json()
for (const entry of entries) {
console.log(`#${entry.rank} @${entry.uniqueId} - ${entry.score} diamonds${entry.isLive ? ' [LIVE]' : ''}`)
}League Endpoints
hasFullAccess field in the response will be false and maskedCount will indicate how many entries are hidden. Note: Agency PASS subscription (tik.tools/vip) gives website access to league data but is not a developer API subscription. 4a. List Leagues for a Region
https://tik.tools/api/leaderboards/leagues/:regionUltra OnlyLists the available league classes for a given region, including how many creators are in each class and when the data was last updated.
Path Parameters
regionstringRegion code (e.g., BK, BC, US+) from the Region Reference tableResponse Schema
[].classTypenumberNumeric class identifier (see classType Reference below)[].classLabelstringHuman-readable class name (e.g., "A1", "B5")[].countnumberNumber of creators currently in this class[].updatedAtstringISO 8601 timestamp of the last data refreshExample Response
[
{ "classType": 2000, "classLabel": "A1", "count": 12, "updatedAt": "2026-05-11T14:30:00.000Z" },
{ "classType": 1900, "classLabel": "A2", "count": 28, "updatedAt": "2026-05-11T14:30:00.000Z" },
{ "classType": 1100, "classLabel": "B5", "count": 55, "updatedAt": "2026-05-11T14:30:00.000Z" },
{ "classType": 1000, "classLabel": "C1", "count": 83, "updatedAt": "2026-05-11T14:30:00.000Z" }
]// Node.js - list leagues for Balkans (BK)
const response = await fetch('https://tik.tools/api/leaderboards/leagues/BK', {
headers: { 'x-api-key': 'YOUR_ULTRA_API_KEY' }
})
const leagues = await response.json()
for (const league of leagues) {
console.log(`${league.classLabel} (type ${league.classType}): ${league.count} creators`)
}4b. Get League Entries
https://tik.tools/api/leaderboards/league/:region/:classTypeUltra OnlyReturns the ranked list of creators in a specific league class for a region. This is the primary endpoint for building league-aware tools and creator monitoring dashboards.
Path Parameters
regionstringRegion code (e.g., BK, US+)classTypenumberNumeric class identifier (2000=A1, 1900=A2, 1100=B5, etc.)Response Schema
hasFullAccessbooleanTrue if your tier has full access; false = teaser mode (5 entries)maskedCountnumberNumber of entries hidden due to tier restrictions (0 if hasFullAccess)totalCountnumberTotal number of creators in this classentries[].ranknumberPosition within this classentries[].userIdstringTikTok numeric user ID (stable backend ID, never changes)entries[].uniqueIdstringTikTok username/handle without @ (user-changeable)entries[].nicknamestringDisplay name (user-changeable)entries[].scorenumberDiamonds earned in the current league periodentries[].isLivebooleanWhether the creator is currently streaming liveExample Response
{
"hasFullAccess": true,
"maskedCount": 0,
"totalCount": 12,
"entries": [
{
"rank": 1,
"userId": "6841523190294479361",
"uniqueId": "league_leader",
"nickname": "League Leader",
"score": 1840000,
"isLive": true
},
{
"rank": 2,
"userId": "6712309845712006148",
"uniqueId": "second_in_a1",
"nickname": "Second In A1",
"score": 1620000,
"isLive": false
}
]
}// Node.js - fetch A1 league entries for Balkans
const response = await fetch('https://tik.tools/api/leaderboards/league/BK/2000', {
headers: { 'x-api-key': 'YOUR_ULTRA_API_KEY' }
})
const data = await response.json()
if (!data.hasFullAccess) {
console.warn(`Teaser mode: ${data.maskedCount} entries hidden. Upgrade to Ultra for full access.`)
}
console.log(`A1 Balkans - ${data.totalCount} creators total`)
for (const entry of data.entries) {
const liveTag = entry.isLive ? ' [LIVE]' : ''
console.log(`#${entry.rank} @${entry.uniqueId} - ${entry.score.toLocaleString()} diamonds${liveTag}`)
}classType Reference
League classes map numeric classType values to competitive tiers. A1 is the highest tier - the elite creators earning the most diamonds. D3 is the entry point into league competition.
2000A1Elite tier. Top earners in the region. Highest competition, highest diamond requirements for placement.1900A2Senior tier. Established high-earning creators working toward A1 promotion.1800A3Established A-class. Consistent high earners holding their spot in the elite range.1700A4Lower A-class. New addition to the A range; creators competing for A3 promotion.1600A5A-class entry. Newest A division; recently promoted from the B range.1100B5Upper mid-tier. Creators with strong consistent earnings across the league period.1000C1Mid-tier. Active earners building toward the B-class range.900C2Lower mid-tier. Moderate earners competing for C1 promotion.500D1Entry league. Creators beginning to earn meaningfully in the region.400D2Entry league second division. Newer or lower-volume earners.300D3Entry league third division. The starting point for league-eligible creators.Working Example: Find All A1 Creators Streaming Now in Balkans
This complete multi-step example shows the recommended pattern: discover available classes, find the one you need, fetch its entries, then filter for live creators. This works for any region and class combination.
isLive === true creators// Complete example: Find all A1 creators live in Balkans right now
const BASE = 'https://tik.tools'
const REGION = 'BK'
const HEADERS = { 'x-api-key': 'YOUR_ULTRA_API_KEY' }
async function getA1LiveCreators() {
// Step 1: Fetch available leagues for Balkans
const leaguesRes = await fetch(`${BASE}/api/leaderboards/leagues/${REGION}`, {
headers: HEADERS
})
const leagues = await leaguesRes.json()
// Step 2: Find the A1 class (classType 2000)
const a1 = leagues.find(l => l.classLabel === 'A1')
if (!a1) {
console.log('A1 class not found in Balkans')
return []
}
console.log(`Found A1 class: ${a1.count} creators, last updated ${a1.updatedAt}`)
// Step 3: Fetch A1 entries
const entriesRes = await fetch(
`${BASE}/api/leaderboards/league/${REGION}/${a1.classType}`,
{ headers: HEADERS }
)
const data = await entriesRes.json()
if (!data.hasFullAccess) {
console.warn(`Only showing ${data.entries.length} of ${data.totalCount} entries (teaser mode)`)
}
// Step 4: Filter for creators currently live
const liveCreators = data.entries.filter(e => e.isLive)
return liveCreators
}
const live = await getA1LiveCreators()
console.log(`\n${live.length} A1 creator(s) live in Balkans right now:\n`)
for (const creator of live) {
console.log(` #${creator.rank} @${creator.uniqueId} - ${creator.score.toLocaleString()} diamonds`)
}
// Connect to their streams via TikTool WebSocket
for (const creator of live) {
console.log(` wss://api.tik.tools?uniqueId=${creator.uniqueId}&apiKey=YOUR_API_KEY`)
}Rate Limits & Best Practices
Leaderboard positions shift gradually. Cache for 10-30 seconds before re-fetching to avoid hammering the API unnecessarily.
There is no benefit to polling league endpoints more frequently than every 5 minutes. The underlying data does not change faster than that.
All 28 regions can be polled in parallel. If you need multi-region data, fan out requests concurrently rather than sequentially.
When isLive is true on a leaderboard entry, you can open a WebSocket to that creator immediately using their uniqueId and your API key.
Session cookies grant access to your account. Store them in environment variables, never in source code or public repositories.
Not every class exists in every region. Always call the list endpoint first to confirm which classType values are available for your target region.