curl --request GET \
--url https://test.deribit.com/api/v2/private/move_positions \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": 3,
"method": "private/move_positions",
"params": {
"currency": "BTC",
"source_uid": 3,
"target_uid": 23,
"trades": [
{
"instrument_name": "BTC-PERPETUAL",
"price": "35800",
"amount": "110"
},
{
"instrument_name": "BTC-28JAN22-32500-C",
"amount": "0.1"
}
]
}
}
'import requests
url = "https://test.deribit.com/api/v2/private/move_positions"
payload = {
"jsonrpc": "2.0",
"id": 3,
"method": "private/move_positions",
"params": {
"currency": "BTC",
"source_uid": 3,
"target_uid": 23,
"trades": [
{
"instrument_name": "BTC-PERPETUAL",
"price": "35800",
"amount": "110"
},
{
"instrument_name": "BTC-28JAN22-32500-C",
"amount": "0.1"
}
]
}
}
headers = {"Content-Type": "application/json"}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: 3,
method: 'private/move_positions',
params: {
currency: 'BTC',
source_uid: 3,
target_uid: 23,
trades: [
{instrument_name: 'BTC-PERPETUAL', price: '35800', amount: '110'},
{instrument_name: 'BTC-28JAN22-32500-C', amount: '0.1'}
]
}
})
};
fetch('https://test.deribit.com/api/v2/private/move_positions', 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://test.deribit.com/api/v2/private/move_positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => 3,
'method' => 'private/move_positions',
'params' => [
'currency' => 'BTC',
'source_uid' => 3,
'target_uid' => 23,
'trades' => [
[
'instrument_name' => 'BTC-PERPETUAL',
'price' => '35800',
'amount' => '110'
],
[
'instrument_name' => 'BTC-28JAN22-32500-C',
'amount' => '0.1'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://test.deribit.com/api/v2/private/move_positions"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": 3,\n \"method\": \"private/move_positions\",\n \"params\": {\n \"currency\": \"BTC\",\n \"source_uid\": 3,\n \"target_uid\": 23,\n \"trades\": [\n {\n \"instrument_name\": \"BTC-PERPETUAL\",\n \"price\": \"35800\",\n \"amount\": \"110\"\n },\n {\n \"instrument_name\": \"BTC-28JAN22-32500-C\",\n \"amount\": \"0.1\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("GET", url, payload)
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.get("https://test.deribit.com/api/v2/private/move_positions")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": 3,\n \"method\": \"private/move_positions\",\n \"params\": {\n \"currency\": \"BTC\",\n \"source_uid\": 3,\n \"target_uid\": 23,\n \"trades\": [\n {\n \"instrument_name\": \"BTC-PERPETUAL\",\n \"price\": \"35800\",\n \"amount\": \"110\"\n },\n {\n \"instrument_name\": \"BTC-28JAN22-32500-C\",\n \"amount\": \"0.1\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.deribit.com/api/v2/private/move_positions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": 3,\n \"method\": \"private/move_positions\",\n \"params\": {\n \"currency\": \"BTC\",\n \"source_uid\": 3,\n \"target_uid\": 23,\n \"trades\": [\n {\n \"instrument_name\": \"BTC-PERPETUAL\",\n \"price\": \"35800\",\n \"amount\": \"110\"\n },\n {\n \"instrument_name\": \"BTC-28JAN22-32500-C\",\n \"amount\": \"0.1\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 3,
"result": [
{
"target_uid": 23,
"source_uid": 3,
"price": 0.1223,
"instrument_name": "BTC-28JAN22-32500-C",
"direction": "sell",
"amount": 0.1
},
{
"target_uid": 23,
"source_uid": 3,
"price": 35800,
"instrument_name": "BTC-PERPETUAL",
"direction": "buy",
"amount": 110
}
]
}private/move_positions
Moves positions from a source subaccount to a target subaccount. This operation transfers open positions between subaccounts, which is useful for rebalancing or reorganizing trading activities.
Positions can be filtered by currency. The operation creates trades to transfer positions, which may affect P&L and margin calculations.
Note - This method has distinct API rate limiting requirements:
- Sustained rate: 6 requests/minute
- Weekly limit: 100 move_position uses per week (168 hours)
For more information, see Rate Limits.
Important: In rare cases, the request may return an internal_server_error. This does not necessarily mean the operation failed entirely. Part or all of the position transfer might have still been processed successfully. Check the positions in both accounts to verify the transfer status.
๐ Related Article: Moving Positions
Scope: trade:read_write
curl --request GET \
--url https://test.deribit.com/api/v2/private/move_positions \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": 3,
"method": "private/move_positions",
"params": {
"currency": "BTC",
"source_uid": 3,
"target_uid": 23,
"trades": [
{
"instrument_name": "BTC-PERPETUAL",
"price": "35800",
"amount": "110"
},
{
"instrument_name": "BTC-28JAN22-32500-C",
"amount": "0.1"
}
]
}
}
'import requests
url = "https://test.deribit.com/api/v2/private/move_positions"
payload = {
"jsonrpc": "2.0",
"id": 3,
"method": "private/move_positions",
"params": {
"currency": "BTC",
"source_uid": 3,
"target_uid": 23,
"trades": [
{
"instrument_name": "BTC-PERPETUAL",
"price": "35800",
"amount": "110"
},
{
"instrument_name": "BTC-28JAN22-32500-C",
"amount": "0.1"
}
]
}
}
headers = {"Content-Type": "application/json"}
response = requests.get(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: 3,
method: 'private/move_positions',
params: {
currency: 'BTC',
source_uid: 3,
target_uid: 23,
trades: [
{instrument_name: 'BTC-PERPETUAL', price: '35800', amount: '110'},
{instrument_name: 'BTC-28JAN22-32500-C', amount: '0.1'}
]
}
})
};
fetch('https://test.deribit.com/api/v2/private/move_positions', 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://test.deribit.com/api/v2/private/move_positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => 3,
'method' => 'private/move_positions',
'params' => [
'currency' => 'BTC',
'source_uid' => 3,
'target_uid' => 23,
'trades' => [
[
'instrument_name' => 'BTC-PERPETUAL',
'price' => '35800',
'amount' => '110'
],
[
'instrument_name' => 'BTC-28JAN22-32500-C',
'amount' => '0.1'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$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://test.deribit.com/api/v2/private/move_positions"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": 3,\n \"method\": \"private/move_positions\",\n \"params\": {\n \"currency\": \"BTC\",\n \"source_uid\": 3,\n \"target_uid\": 23,\n \"trades\": [\n {\n \"instrument_name\": \"BTC-PERPETUAL\",\n \"price\": \"35800\",\n \"amount\": \"110\"\n },\n {\n \"instrument_name\": \"BTC-28JAN22-32500-C\",\n \"amount\": \"0.1\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("GET", url, payload)
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.get("https://test.deribit.com/api/v2/private/move_positions")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": 3,\n \"method\": \"private/move_positions\",\n \"params\": {\n \"currency\": \"BTC\",\n \"source_uid\": 3,\n \"target_uid\": 23,\n \"trades\": [\n {\n \"instrument_name\": \"BTC-PERPETUAL\",\n \"price\": \"35800\",\n \"amount\": \"110\"\n },\n {\n \"instrument_name\": \"BTC-28JAN22-32500-C\",\n \"amount\": \"0.1\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.deribit.com/api/v2/private/move_positions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": 3,\n \"method\": \"private/move_positions\",\n \"params\": {\n \"currency\": \"BTC\",\n \"source_uid\": 3,\n \"target_uid\": 23,\n \"trades\": [\n {\n \"instrument_name\": \"BTC-PERPETUAL\",\n \"price\": \"35800\",\n \"amount\": \"110\"\n },\n {\n \"instrument_name\": \"BTC-28JAN22-32500-C\",\n \"amount\": \"0.1\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 3,
"result": [
{
"target_uid": 23,
"source_uid": 3,
"price": 0.1223,
"instrument_name": "BTC-28JAN22-32500-C",
"direction": "sell",
"amount": 0.1
},
{
"target_uid": 23,
"source_uid": 3,
"price": 35800,
"instrument_name": "BTC-PERPETUAL",
"direction": "buy",
"amount": 110
}
]
}Query Parameters
The currency symbol
Currency, i.e "BTC", "ETH", "USDC"
BTC, ETH, USDC, USDT, EURR Id of source subaccount. Can be found in My Account >> Subaccounts tab
1
Id of target subaccount. Can be found in My Account >> Subaccounts tab
1
List of trades for position move
Hide child attributes
Hide child attributes
Instrument name
"BTC-PERPETUAL"
Price for trade - if not provided average price of the position is used
It represents the requested trade size. For perpetual and inverse futures the amount is in USD units. For options and linear futures it is the underlying base currency coin. Amount can't exceed position size.
Response
Success response
The JSON-RPC version (2.0)
2.0 Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Unique instrument identifier
"BTC-PERPETUAL"
Trade direction from source perspective
buy, sell The price of the trade
Trade amount. For perpetual and inverse futures the amount is in USD units. For options and linear futures it is the underlying base currency coin.
Trade source uid
Trade target uid
The id that was sent in the request
Was this page helpful?