Pool Fees
curl --request GET \
--url https://api.hadron.fi/pools/{address}/feesimport requests
url = "https://api.hadron.fi/pools/{address}/fees"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.hadron.fi/pools/{address}/fees', 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.hadron.fi/pools/{address}/fees",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.hadron.fi/pools/{address}/fees"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.hadron.fi/pools/{address}/fees")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hadron.fi/pools/{address}/fees")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"interval": "7d",
"start_time": 1772634648,
"end_time": 1773239448,
"mint_x": "So11111111111111111111111111111111111111112",
"mint_y": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"totals": {
"volume_usd": 184320.45,
"spread_usd": 122.84,
"protocol_fee_usd": 36.91,
"protocol_fee_x_raw": 41230000,
"protocol_fee_y_raw": 33110000,
"swap_count": 612
},
"protocol_fee_split": [
{
"recipient": "Rec1",
"ppm": 700000,
"fee_usd": 25.84,
"fee_x_raw": 28861000,
"fee_y_raw": 23177000
},
{
"recipient": "Rec2",
"ppm": 300000,
"fee_usd": 11.07,
"fee_x_raw": 12369000,
"fee_y_raw": 9933000
}
],
"truncated": false
}
Pools
Pool Fees
Fees a pool captured over a time window — pool-captured spread and protocol fee, with the protocol fee broken down per fee-split recipient.
GET
/
pools
/
{address}
/
fees
Pool Fees
curl --request GET \
--url https://api.hadron.fi/pools/{address}/feesimport requests
url = "https://api.hadron.fi/pools/{address}/fees"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.hadron.fi/pools/{address}/fees', 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.hadron.fi/pools/{address}/fees",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.hadron.fi/pools/{address}/fees"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.hadron.fi/pools/{address}/fees")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hadron.fi/pools/{address}/fees")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"interval": "7d",
"start_time": 1772634648,
"end_time": 1773239448,
"mint_x": "So11111111111111111111111111111111111111112",
"mint_y": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"totals": {
"volume_usd": 184320.45,
"spread_usd": 122.84,
"protocol_fee_usd": 36.91,
"protocol_fee_x_raw": 41230000,
"protocol_fee_y_raw": 33110000,
"swap_count": 612
},
"protocol_fee_split": [
{
"recipient": "Rec1",
"ppm": 700000,
"fee_usd": 25.84,
"fee_x_raw": 28861000,
"fee_y_raw": 23177000
},
{
"recipient": "Rec2",
"ppm": 300000,
"fee_usd": 11.07,
"fee_x_raw": 12369000,
"fee_y_raw": 9933000
}
],
"truncated": false
}
Aggregates the fees a pool earned over the selected window into two parts:
- Pool-captured spread — the spread the pool’s curve earned (price curve, risk curve, base spread), excluding the protocol fee.
- Protocol fee — the protocol fee captured, broken down per recipient for pools that route fees through the fee-split sidecar.
truncated: true (see the field below).
Path Parameters
string
required
The pool config PDA address.
Query Parameters
string
default:"24h"
Lookback window ending now. One of
1h, 24h, 7d, 30d, or all
(all aggregates the pool’s full history).string
default:"mainnet-beta"
Solana cluster —
mainnet-beta or devnet.Response
string
The interval that was applied (echoes the request).
integer
Start of the window (Unix seconds).
0 when interval=all.integer
End of the window (Unix seconds) — the request time.
string | null
Pool’s token X (base) mint.
string | null
Pool’s token Y (quote) mint.
object
Aggregate fee totals over the window.
Show Totals
Show Totals
number
Total swap volume over the window, quote-denominated.
number
Pool-captured spread over the window (price/risk curve + base spread), quote-denominated. Excludes the protocol fee.
number
Total protocol fee captured over the window, quote-denominated.
number
Protocol fee collected in raw token-X atoms (from sells).
number
Protocol fee collected in raw token-Y atoms (from buys).
integer
Number of swaps in the window.
array
Per-recipient split of the protocol fee over the window. Empty (
[]) for pools that use the default (single) fee recipient, for windows with no fee-bearing split swaps, or for windows entirely before per-swap split tracking began.The sum of recipients’ fee_usd equals totals.protocol_fee_usd only when every fee-bearing swap in the window carried a split; it is less when the window also includes default-fee swaps or pre-tracking swaps.Show Recipient
Show Recipient
string
Recipient wallet address.
integer
Most recently observed split weight (parts-per-million) for this recipient in the window.
number
Recipient’s share of the protocol fee over the window, quote-denominated.
number
Recipient’s share in raw token-X atoms (from sells).
number
Recipient’s share in raw token-Y atoms (from buys).
boolean
true if the per-query swap cap was reached, meaning the window contains more swaps than were aggregated. Narrow the interval for a complete result.{
"interval": "7d",
"start_time": 1772634648,
"end_time": 1773239448,
"mint_x": "So11111111111111111111111111111111111111112",
"mint_y": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"totals": {
"volume_usd": 184320.45,
"spread_usd": 122.84,
"protocol_fee_usd": 36.91,
"protocol_fee_x_raw": 41230000,
"protocol_fee_y_raw": 33110000,
"swap_count": 612
},
"protocol_fee_split": [
{
"recipient": "Rec1",
"ppm": 700000,
"fee_usd": 25.84,
"fee_x_raw": 28861000,
"fee_y_raw": 23177000
},
{
"recipient": "Rec2",
"ppm": 300000,
"fee_usd": 11.07,
"fee_x_raw": 12369000,
"fee_y_raw": 9933000
}
],
"truncated": false
}