Discover Hot Accounts
curl --request POST \
--url https://api.soltop.sh/api/write-locks/hot-accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"time_range": "6h",
"slot": 370537741,
"limit": 50
}
'import requests
url = "https://api.soltop.sh/api/write-locks/hot-accounts"
payload = {
"time_range": "6h",
"slot": 370537741,
"limit": 50
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({time_range: '6h', slot: 370537741, limit: 50})
};
fetch('https://api.soltop.sh/api/write-locks/hot-accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.soltop.sh/api/write-locks/hot-accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'time_range' => '6h',
'slot' => 370537741,
'limit' => 50
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.soltop.sh/api/write-locks/hot-accounts"
payload := strings.NewReader("{\n \"time_range\": \"6h\",\n \"slot\": 370537741,\n \"limit\": 50\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.soltop.sh/api/write-locks/hot-accounts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"time_range\": \"6h\",\n \"slot\": 370537741,\n \"limit\": 50\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.soltop.sh/api/write-locks/hot-accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"time_range\": \"6h\",\n \"slot\": 370537741,\n \"limit\": 50\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"query_mode": "time_range",
"query_value": "6h",
"slot_range": {
"min": 370500000,
"max": 370537741
},
"limit": 50,
"hot_accounts": [
{
"account_id": "FnmStvzQ27Pm4U8r3M6gPD7mnk6ST6HwraPsoNmYpump",
"write_count": 2340,
"conflict_count": 89,
"unique_signers": 45,
"hot_score": 8.5
}
],
"heatmap_data": [
{
"slot": 370537741,
"account_id": "FnmStvzQ27Pm4U8r3M6gPD7mnk6ST6HwraPsoNmYpump",
"access_count": 25,
"write_count": 18,
"read_count": 7,
"timestamp": "2025-10-01T19:22:33Z"
}
]
},
"timestamp": "2025-10-02T15:30:45.123Z"
}Write Locks
Discover Hot Accounts
Discover the hottest accounts with the most write lock contention across the entire Solana network. Returns ranked list with hot scores and heatmap data for the top 20 accounts. Very expensive queries - can take 2-5+ minutes. No caching. Requires either time_range OR slot parameter.
POST
/
api
/
write-locks
/
hot-accounts
Discover Hot Accounts
curl --request POST \
--url https://api.soltop.sh/api/write-locks/hot-accounts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"time_range": "6h",
"slot": 370537741,
"limit": 50
}
'import requests
url = "https://api.soltop.sh/api/write-locks/hot-accounts"
payload = {
"time_range": "6h",
"slot": 370537741,
"limit": 50
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({time_range: '6h', slot: 370537741, limit: 50})
};
fetch('https://api.soltop.sh/api/write-locks/hot-accounts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.soltop.sh/api/write-locks/hot-accounts",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'time_range' => '6h',
'slot' => 370537741,
'limit' => 50
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.soltop.sh/api/write-locks/hot-accounts"
payload := strings.NewReader("{\n \"time_range\": \"6h\",\n \"slot\": 370537741,\n \"limit\": 50\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.soltop.sh/api/write-locks/hot-accounts")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"time_range\": \"6h\",\n \"slot\": 370537741,\n \"limit\": 50\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.soltop.sh/api/write-locks/hot-accounts")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"time_range\": \"6h\",\n \"slot\": 370537741,\n \"limit\": 50\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"query_mode": "time_range",
"query_value": "6h",
"slot_range": {
"min": 370500000,
"max": 370537741
},
"limit": 50,
"hot_accounts": [
{
"account_id": "FnmStvzQ27Pm4U8r3M6gPD7mnk6ST6HwraPsoNmYpump",
"write_count": 2340,
"conflict_count": 89,
"unique_signers": 45,
"hot_score": 8.5
}
],
"heatmap_data": [
{
"slot": 370537741,
"account_id": "FnmStvzQ27Pm4U8r3M6gPD7mnk6ST6HwraPsoNmYpump",
"access_count": 25,
"write_count": 18,
"read_count": 7,
"timestamp": "2025-10-01T19:22:33Z"
}
]
},
"timestamp": "2025-10-02T15:30:45.123Z"
}Authorizations
Supabase JWT authentication. Used for MEV Analysis and Write Locks endpoints. Requires an active subscription (trial, active, or grace_period status).
Body
application/json
Query mode 1: Time range (mutually exclusive with slot)
Available options:
1h, 3h, 6h, 12h Example:
"6h"
Query mode 2: Specific slot number (mutually exclusive with time_range)
Required range:
x >= 1Example:
370537741
Number of hot accounts to return
Required range:
1 <= x <= 100Example:
50