curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline"
headers = {"X-Monaco-Signature": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Monaco-Signature': '<api-key>'}};
fetch('https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline', 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://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Monaco-Signature: <api-key>"
],
]);
$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://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Monaco-Signature", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Monaco-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"earningsBySource": [
{
"source": "0x0000000000000000000000000000000000000002",
"level": 1,
"totalEarned": "900000",
"token": "0x0000000000000000000000000000000000000002",
"sourceDisplay": "cooltrader123"
}
],
"directReferees": [
{
"wallet": "0x0000000000000000000000000000000000000002",
"referredAt": "2026-07-07T18:00:00Z",
"totalEarned": "900000",
"display": "cooltrader123"
}
],
"summary": {
"totalEarned": "1400000",
"level1Earned": "900000",
"level2Earned": "400000",
"level3Earned": "100000"
}
}Get your referral downline and earnings
Read your own downline earnings (self-scoped).
Return who the authenticated caller earns from and how much: an earnings-by-source breakdown aggregated from the caller’s reward rows across all three reward levels (L1/L2/L3), their L1 direct-referee roster (including referees who have not traded yet), and a per-level earnings summary. Self-scoped — identity comes only from the session, never a path id. Every source and referee is identified by their public wallet address, never an internal id.
curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline"
headers = {"X-Monaco-Signature": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Monaco-Signature': '<api-key>'}};
fetch('https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline', 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://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Monaco-Signature: <api-key>"
],
]);
$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://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Monaco-Signature", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/pitpass/referrals/me/downline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Monaco-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"earningsBySource": [
{
"source": "0x0000000000000000000000000000000000000002",
"level": 1,
"totalEarned": "900000",
"token": "0x0000000000000000000000000000000000000002",
"sourceDisplay": "cooltrader123"
}
],
"directReferees": [
{
"wallet": "0x0000000000000000000000000000000000000002",
"referredAt": "2026-07-07T18:00:00Z",
"totalEarned": "900000",
"display": "cooltrader123"
}
],
"summary": {
"totalEarned": "1400000",
"level1Earned": "900000",
"level2Earned": "400000",
"level3Earned": "100000"
}
}Authorizations
Ed25519 session-key request signing. Every authenticated request carries three headers: X-Monaco-PublicKey (64-char lowercase-hex session public key), X-Monaco-Timestamp (Unix milliseconds, within 30s of server time), and X-Monaco-Signature (hex ed25519 signature). The signature is over METHOD\npath?query\ntimestamp_ms\nSHA256_hex(body), where the body hash is the SHA-256 of the empty byte string when there is no body. Obtain the session keypair from POST /api/v1/auth/challenge followed by POST /api/v1/auth/verify.
Response
OK
One row per (source trader, level, token) the caller earns from, across all three reward levels. Comes straight from the caller's reward rows — no tree walk.
Show child attributes
Show child attributes
The caller's direct (L1) referees, newest first, including referees who have not traded yet (0 earned). Bounded to the most recent 500 EFFECTIVE referees (after per-wallet dedupe and the winning-edge filter). The earnings views (earnings_by_source and the summary) are unbounded and count every level, so a caller past the roster cap still sees their full earnings; only this roster listing is capped.
Show child attributes
Show child attributes
Total earned broken down by level (L1/L2/L3).
Show child attributes
Show child attributes
Was this page helpful?

