curl --request POST \
--url https://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,
"marginAccountId": "<string>",
"idempotencyKey": "<string>"
}
'import requests
url = "https://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,
"marginAccountId": "<string>",
"idempotencyKey": "<string>"
}
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,
marginAccountId: '<string>',
idempotencyKey: '<string>'
})
};
fetch('https://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://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,
'marginAccountId' => '<string>',
'idempotencyKey' => '<string>'
]),
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://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 \"marginAccountId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\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://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 \"marginAccountId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://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 \"marginAccountId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\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://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,
"marginAccountId": "<string>",
"idempotencyKey": "<string>"
}
'import requests
url = "https://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,
"marginAccountId": "<string>",
"idempotencyKey": "<string>"
}
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,
marginAccountId: '<string>',
idempotencyKey: '<string>'
})
};
fetch('https://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://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,
'marginAccountId' => '<string>',
'idempotencyKey' => '<string>'
]),
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://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 \"marginAccountId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\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://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 \"marginAccountId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://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 \"marginAccountId\": \"<string>\",\n \"idempotencyKey\": \"<string>\"\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.
Sub-account key of the margin account whose risk bucket this names, like
marginAccountId (default is the default margin account). Refused when it is
not a valid sub-account key, names none of the caller's open sub-accounts, or
disagrees with marginAccountId.
Risk bucket mode. Defaults to ISOLATED. Values: ISOLATED, CROSS. A CROSS transfer names no pairs: the cross bucket's scope is the markets where it has an open position, so funding the bucket has nothing to declare.
Deprecated: accepted and ignored. Cross scope is the markets where the cross bucket has an open position, 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.
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).
The margin account whose risk bucket is funded: the default margin account (the default) or any of the caller's open sub-accounts, which fund their own risk buckets from their own collateral. A copy-trading sub-account's buckets belong to its follow and are refused.
Optional submission identity, shared with order create (same 1-64 characters from [A-Za-z0-9._:-], same per user and application namespace). Retrying the same key and request within 15 minutes of the original acceptance returns the original transfer result, including its movementId, without moving money again; balance figures in a replayed response are as of the retry. The same key with a different request, or a key already used on another endpoint, returns IDEMPOTENCY_KEY_CONFLICT (HTTP 409 / gRPC ALREADY_EXISTS). ORDER_SUBMISSION_UNAVAILABLE and ORDER_SUBMISSION_CAPACITY_EXCEEDED (HTTP 503 / gRPC UNAVAILABLE) mean the outcome is held but cannot be read, or no new key can be accepted: retry with the same key and request. The window does not extend on retries; after it the key moves money again. Generate a fresh key for each intended transfer and keep it across retries of that transfer.
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. Truncated toward
zero at the collateral asset's precision.
The request's strategyKey (the sub-account key), echoed; a risk-bucket
transfer-in that sent none reports default.
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 scope: the markets where it has an open position, sorted by trading pair id. Only on cross risk-bucket transfers, and omitted while empty — i.e. while the bucket has no open position.
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?

