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",
"byLevel": [
{
"level": 1,
"earned": "900000"
}
]
},
"nextPageToken": "<string>"
}Get your referral downline and earnings (deprecated PitPass path)
Read your own downline earnings (self-scoped).
Return who the authenticated caller earns from and how much: one page of
the earnings-by-source breakdown across every reward level, their L1
direct-referee roster (including referees who have not traded yet), and a
per-level earnings summary that always covers every level and source,
whatever page is requested. earnings_by_source is paged (page_size,
page_token); a request without them gets the first page, not every row.
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",
"byLevel": [
{
"level": 1,
"earned": "900000"
}
]
},
"nextPageToken": "<string>"
}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.
Query Parameters
earningsBySource rows per page (max 500)
1 <= x <= 500Opaque cursor from a previous response's nextPageToken; omit or send an
empty string for the first page.
Response
OK
One page of rows, one per (source account, level, token) the caller earns from, across every reward level, ordered by each source account's own total, largest first. A wallet that traded through several applications has one account per application: its rows within a page are merged into one row at the position of its first (largest) part, so a merged row can sit below a smaller one, and the wallet can appear again on a later page. Paged by pageSize / pageToken; follow nextPageToken for the rest. Comes from the caller's maintained reward totals — 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 summary counts every level and source and earnings_by_source pages through every row, 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. Covers every level and source regardless of the earnings_by_source page.
Show child attributes
Show child attributes
Cursor for the next earningsBySource page; empty when there are no more rows.
Was this page helpful?

