curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/positions/history \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/positions/history"
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/positions/history', 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/positions/history",
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/positions/history"
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/positions/history")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/positions/history")
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{
"events": [
{
"id": "<string>",
"positionId": "<string>",
"marginAccountId": "<string>",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"action": "<string>",
"sizeChange": "<string>",
"price": "<string>",
"realizedPnl": "<string>",
"feesPaid": "<string>",
"collateralChange": "<string>",
"orderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdAt": "<string>",
"entryPrice": "<string>",
"allocatedInitialMargin": "<string>",
"fundingPaid": "<string>",
"netRealizedPnl": "<string>",
"realizedRoe": "<string>",
"positionSide": "<string>"
}
],
"pageSize": 123,
"nextPageToken": "<string>"
}Get apiv1positionshistory
curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/positions/history \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/positions/history"
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/positions/history', 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/positions/history",
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/positions/history"
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/positions/history")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/positions/history")
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{
"events": [
{
"id": "<string>",
"positionId": "<string>",
"marginAccountId": "<string>",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"action": "<string>",
"sizeChange": "<string>",
"price": "<string>",
"realizedPnl": "<string>",
"feesPaid": "<string>",
"collateralChange": "<string>",
"orderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"createdAt": "<string>",
"entryPrice": "<string>",
"allocatedInitialMargin": "<string>",
"fundingPaid": "<string>",
"netRealizedPnl": "<string>",
"realizedRoe": "<string>",
"positionSide": "<string>"
}
],
"pageSize": 123,
"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
Trading pair identifier (UUID)
1Items per page (max 1000)
1 <= x <= 1000When true, return only DECREASE, CLOSE, and LIQUIDATE execution rows.
Pagination cursor with two states:
- Omitted or empty string (""): start a cursor walk with no prior position, from the newest event — this listing always sorts newest-first.
- Non-empty: an opaque cursor from a previous response's
nextPageToken; results resume immediately after that position.
Every walk covers full position history — hot and archived rows merged. The response carries no item count: this listing's relation is too large to count behind a filter. Filters must match the request that produced the token, or the request is rejected 400.
Response
OK
Show child attributes
Show child attributes
Cursor for the next page, minted from the last row of an over-fetched
page: this listing is one SQL statement with one global ORDER BY, so a
page shorter than pageSize proves the walk is exhausted and this is
empty. A non-empty token always has at least one further row behind it.
Was this page helpful?

