curl --request POST \
--url https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in \
--header 'Content-Type: application/json' \
--header 'X-Monaco-Signature: <api-key>' \
--data '
{
"asset": "<string>",
"amount": "<string>",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"strategyKey": "<string>",
"marginMode": "<string>",
"selectedTradingPairIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"applyToPositionMargin": true
}
'import requests
url = "https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in"
payload = {
"asset": "<string>",
"amount": "<string>",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"strategyKey": "<string>",
"marginMode": "<string>",
"selectedTradingPairIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"applyToPositionMargin": True
}
headers = {
"X-Monaco-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Monaco-Signature': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
asset: '<string>',
amount: '<string>',
tradingPairId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
strategyKey: '<string>',
marginMode: '<string>',
selectedTradingPairIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
applyToPositionMargin: true
})
};
fetch('https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in', 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/margin/risk-buckets/collateral/transfer-in",
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([
'asset' => '<string>',
'amount' => '<string>',
'tradingPairId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'strategyKey' => '<string>',
'marginMode' => '<string>',
'selectedTradingPairIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'applyToPositionMargin' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in"
payload := strings.NewReader("{\n \"asset\": \"<string>\",\n \"amount\": \"<string>\",\n \"tradingPairId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"strategyKey\": \"<string>\",\n \"marginMode\": \"<string>\",\n \"selectedTradingPairIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"applyToPositionMargin\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Monaco-Signature", "<api-key>")
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://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in")
.header("X-Monaco-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"asset\": \"<string>\",\n \"amount\": \"<string>\",\n \"tradingPairId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"strategyKey\": \"<string>\",\n \"marginMode\": \"<string>\",\n \"selectedTradingPairIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"applyToPositionMargin\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Monaco-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset\": \"<string>\",\n \"amount\": \"<string>\",\n \"tradingPairId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"strategyKey\": \"<string>\",\n \"marginMode\": \"<string>\",\n \"selectedTradingPairIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"applyToPositionMargin\": true\n}"
response = http.request(request)
puts response.read_body{
"movementId": "<string>",
"marginAccountId": "<string>",
"asset": "<string>",
"amount": "<string>",
"status": "<string>",
"newEquity": "<string>",
"newTotalCollateralValue": "<string>",
"newWithdrawableCollateral": "<string>",
"strategyKey": "<string>",
"riskBucketId": "<string>",
"marginMode": "<string>",
"selectedTradingPairIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"positionMarginCredited": true
}Post apiv1marginrisk bucketscollateraltransfer in
Fund a risk bucket from the parent margin account’s unallocated
collateral (no wallet movement; the bucket is created if needed). Since
0XM-2632, funding an ISOLATED bucket that holds an open position also
credits that position’s stored margin — the same behavior as the
deprecated TransferCollateralToMarginAccount Adjust Margin rail — so
adding collateral to support a position has one behavior on every route.
A flat isolated bucket and the cross bucket stay plain allocations.
curl --request POST \
--url https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in \
--header 'Content-Type: application/json' \
--header 'X-Monaco-Signature: <api-key>' \
--data '
{
"asset": "<string>",
"amount": "<string>",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"strategyKey": "<string>",
"marginMode": "<string>",
"selectedTradingPairIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"applyToPositionMargin": true
}
'import requests
url = "https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in"
payload = {
"asset": "<string>",
"amount": "<string>",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"strategyKey": "<string>",
"marginMode": "<string>",
"selectedTradingPairIds": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"applyToPositionMargin": True
}
headers = {
"X-Monaco-Signature": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-Monaco-Signature': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
asset: '<string>',
amount: '<string>',
tradingPairId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
strategyKey: '<string>',
marginMode: '<string>',
selectedTradingPairIds: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
applyToPositionMargin: true
})
};
fetch('https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in', 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/margin/risk-buckets/collateral/transfer-in",
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([
'asset' => '<string>',
'amount' => '<string>',
'tradingPairId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'strategyKey' => '<string>',
'marginMode' => '<string>',
'selectedTradingPairIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'applyToPositionMargin' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in"
payload := strings.NewReader("{\n \"asset\": \"<string>\",\n \"amount\": \"<string>\",\n \"tradingPairId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"strategyKey\": \"<string>\",\n \"marginMode\": \"<string>\",\n \"selectedTradingPairIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"applyToPositionMargin\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Monaco-Signature", "<api-key>")
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://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in")
.header("X-Monaco-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"asset\": \"<string>\",\n \"amount\": \"<string>\",\n \"tradingPairId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"strategyKey\": \"<string>\",\n \"marginMode\": \"<string>\",\n \"selectedTradingPairIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"applyToPositionMargin\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/margin/risk-buckets/collateral/transfer-in")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Monaco-Signature"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"asset\": \"<string>\",\n \"amount\": \"<string>\",\n \"tradingPairId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"strategyKey\": \"<string>\",\n \"marginMode\": \"<string>\",\n \"selectedTradingPairIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"applyToPositionMargin\": true\n}"
response = http.request(request)
puts response.read_body{
"movementId": "<string>",
"marginAccountId": "<string>",
"asset": "<string>",
"amount": "<string>",
"status": "<string>",
"newEquity": "<string>",
"newTotalCollateralValue": "<string>",
"newWithdrawableCollateral": "<string>",
"strategyKey": "<string>",
"riskBucketId": "<string>",
"marginMode": "<string>",
"selectedTradingPairIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"positionMarginCredited": true
}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.
Body
Trading pair UUID whose isolated risk bucket receives collateral. Required for isolated risk buckets; omitted for cross risk buckets.
Risk bucket mode. Defaults to ISOLATED. Values: ISOLATED, CROSS. A CROSS transfer names no pairs: the cross bucket's scope is derived from trading — a pair joins when a cross order on it succeeds and leaves when its positions close — so funding the bucket has nothing to declare.
Deprecated: accepted and ignored. Cross scope is derived from trading (a pair joins the cross bucket when a cross order on it succeeds; after its positions close it stays listed until a later successful cross order on another pair reconciles the bucket), so a cross transfer-in has nothing to declare and can no longer replace the scope. Rejected for ISOLATED, as before. Read the current scope from the cross bucket's row in the margin-accounts list or from this response's selectedTradingPairIds; the parent row carries no scope. Pairs declared before scope became derived stay recorded until they trade and their positions close.
1What the transferred collateral becomes when the ISOLATED bucket holds an open position. The two intents want opposite fates for the same dollars, so the caller states theirs:
- true (and UNSET — the default is the human "Adjust Margin" gesture): the amount is COMMITTED to the position's stored margin. Effective leverage drops and stays down, initial margin required rises by the amount, free collateral is unchanged — new orders cannot spend it.
- false: plain allocation. Free collateral rises and the next order can spend it. Programmatic funding loops that top a bucket up to a free collateral target MUST pass false, or each top-up converts into requirement and the loop never converges.
Either way the liquidation cushion improves identically (the breach check is bucket-equity based). On a FLAT isolated bucket there is no position to commit to and both values are a plain allocation. Explicit true is rejected for CROSS buckets (cross has no per-position margin); unset/false is a plain allocation there.
The response reports what actually happened in position_margin_credited
— a credit can degrade to a plain allocation when the persisted position
row is stale (close/reopen race).
Response
OK
The largest amount a further transfer-out will accept after this one.
See MarginAccountSummary.withdrawable_collateral: this is an
allocation-bounded figure, not clamped equity headroom.
Present when collateral was allocated to a risk bucket.
Present when collateral was allocated to a risk bucket. Values: ISOLATED, CROSS.
The cross bucket's recorded pair scope: what trading has recorded (a pair joins when a cross order on it fills and leaves when its positions close), plus any pair declared before scope became derived, until it trades and its positions close. Only on cross risk-bucket transfers, and omitted while empty — i.e. until a cross order on the bucket has filled.
1Whether the transfer was committed to a position's stored margin. Present only when a position-margin credit was in play: true — the credit landed; false — a credit was requested (or defaulted) but degraded to a plain allocation because the bucket's persisted position row was stale (close/reopen race) — re-issue the Adjust Margin once the new position row lands if the commitment still matters. Absent on plain allocations, parent deposits, and releases.
Was this page helpful?

