curl --request POST \
--url https://staging.apimonaco.xyz/api/v1/orders/batch-replace \
--header 'Content-Type: application/json' \
--header 'X-Monaco-Signature: <api-key>' \
--data '
{
"orders": [
{
"orderId": "123e4567-e89b-12d3-a456-426614174000",
"price": "35500.00",
"quantity": "0.7",
"useMasterBalance": false,
"postOnly": false,
"clientOrderId": "quote-btc-1130-a",
"selfTradePreventionMode": "CANCEL_TAKER"
}
]
}
'import requests
url = "https://staging.apimonaco.xyz/api/v1/orders/batch-replace"
payload = { "orders": [
{
"orderId": "123e4567-e89b-12d3-a456-426614174000",
"price": "35500.00",
"quantity": "0.7",
"useMasterBalance": False,
"postOnly": False,
"clientOrderId": "quote-btc-1130-a",
"selfTradePreventionMode": "CANCEL_TAKER"
}
] }
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({
orders: [
{
orderId: '123e4567-e89b-12d3-a456-426614174000',
price: '35500.00',
quantity: '0.7',
useMasterBalance: false,
postOnly: false,
clientOrderId: 'quote-btc-1130-a',
selfTradePreventionMode: 'CANCEL_TAKER'
}
]
})
};
fetch('https://staging.apimonaco.xyz/api/v1/orders/batch-replace', 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/orders/batch-replace",
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([
'orders' => [
[
'orderId' => '123e4567-e89b-12d3-a456-426614174000',
'price' => '35500.00',
'quantity' => '0.7',
'useMasterBalance' => false,
'postOnly' => false,
'clientOrderId' => 'quote-btc-1130-a',
'selfTradePreventionMode' => 'CANCEL_TAKER'
]
]
]),
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/orders/batch-replace"
payload := strings.NewReader("{\n \"orders\": [\n {\n \"orderId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"price\": \"35500.00\",\n \"quantity\": \"0.7\",\n \"useMasterBalance\": false,\n \"postOnly\": false,\n \"clientOrderId\": \"quote-btc-1130-a\",\n \"selfTradePreventionMode\": \"CANCEL_TAKER\"\n }\n ]\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/orders/batch-replace")
.header("X-Monaco-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"orders\": [\n {\n \"orderId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"price\": \"35500.00\",\n \"quantity\": \"0.7\",\n \"useMasterBalance\": false,\n \"postOnly\": false,\n \"clientOrderId\": \"quote-btc-1130-a\",\n \"selfTradePreventionMode\": \"CANCEL_TAKER\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/orders/batch-replace")
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 \"orders\": [\n {\n \"orderId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"price\": \"35500.00\",\n \"quantity\": \"0.7\",\n \"useMasterBalance\": false,\n \"postOnly\": false,\n \"clientOrderId\": \"quote-btc-1130-a\",\n \"selfTradePreventionMode\": \"CANCEL_TAKER\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"totalRequested": 3,
"totalSucceeded": 3,
"totalFailed": 0,
"results": [
{
"originalOrderId": "123e4567-e89b-12d3-a456-426614174000",
"newOrderId": "987e6543-e21b-12d3-a456-426614174000",
"updatedFields": {
"price": "35500.00",
"quantity": "0.7"
},
"matchResult": {
"tradesCount": 2,
"totalFilled": "0.2",
"remainingQuantity": "0.3",
"averageFillPrice": "35100.00",
"status": "PARTIALLY_FILLED",
"actualSlippageBps": 15,
"maxSlippageBps": 50,
"executionPriceRange": {
"bestPrice": "2045.00",
"worstPrice": "2052.00"
}
},
"error": {
"code": "ORDER_NOT_FOUND",
"message": "Order not found or already filled"
}
}
]
}Batch replace orders
Batch replace orders.
Replace multiple orders in one engine step with per-item results: every original is cancelled first, then each replacement is placed in request order. A two-sided quote can therefore shift across its own resting prices in one call, and a replacement may use funds freed by any original in the batch.
Failure semantics: an item that fails validation, or whose original cannot be found, leaves the original resting. An item whose replacement fails to PLACE (for example insufficient balance or self-trade prevention) reports the error with its original already cancelled.
POST_ONLY_WOULD_CROSS is the exception: a post-only replacement that would cross is refused BEFORE the cancel pass, against the book as it will stand once the batch’s own cancels are applied, so the item normally reports the error with its original still resting. It is not a guarantee — the pre-cancel check cannot see what pass 2 will insert or consume, nor an original that fails to cancel, and the same original listed twice is judged per occurrence — so confirm against open orders rather than relying on the code alone.
curl --request POST \
--url https://staging.apimonaco.xyz/api/v1/orders/batch-replace \
--header 'Content-Type: application/json' \
--header 'X-Monaco-Signature: <api-key>' \
--data '
{
"orders": [
{
"orderId": "123e4567-e89b-12d3-a456-426614174000",
"price": "35500.00",
"quantity": "0.7",
"useMasterBalance": false,
"postOnly": false,
"clientOrderId": "quote-btc-1130-a",
"selfTradePreventionMode": "CANCEL_TAKER"
}
]
}
'import requests
url = "https://staging.apimonaco.xyz/api/v1/orders/batch-replace"
payload = { "orders": [
{
"orderId": "123e4567-e89b-12d3-a456-426614174000",
"price": "35500.00",
"quantity": "0.7",
"useMasterBalance": False,
"postOnly": False,
"clientOrderId": "quote-btc-1130-a",
"selfTradePreventionMode": "CANCEL_TAKER"
}
] }
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({
orders: [
{
orderId: '123e4567-e89b-12d3-a456-426614174000',
price: '35500.00',
quantity: '0.7',
useMasterBalance: false,
postOnly: false,
clientOrderId: 'quote-btc-1130-a',
selfTradePreventionMode: 'CANCEL_TAKER'
}
]
})
};
fetch('https://staging.apimonaco.xyz/api/v1/orders/batch-replace', 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/orders/batch-replace",
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([
'orders' => [
[
'orderId' => '123e4567-e89b-12d3-a456-426614174000',
'price' => '35500.00',
'quantity' => '0.7',
'useMasterBalance' => false,
'postOnly' => false,
'clientOrderId' => 'quote-btc-1130-a',
'selfTradePreventionMode' => 'CANCEL_TAKER'
]
]
]),
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/orders/batch-replace"
payload := strings.NewReader("{\n \"orders\": [\n {\n \"orderId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"price\": \"35500.00\",\n \"quantity\": \"0.7\",\n \"useMasterBalance\": false,\n \"postOnly\": false,\n \"clientOrderId\": \"quote-btc-1130-a\",\n \"selfTradePreventionMode\": \"CANCEL_TAKER\"\n }\n ]\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/orders/batch-replace")
.header("X-Monaco-Signature", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"orders\": [\n {\n \"orderId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"price\": \"35500.00\",\n \"quantity\": \"0.7\",\n \"useMasterBalance\": false,\n \"postOnly\": false,\n \"clientOrderId\": \"quote-btc-1130-a\",\n \"selfTradePreventionMode\": \"CANCEL_TAKER\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/orders/batch-replace")
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 \"orders\": [\n {\n \"orderId\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"price\": \"35500.00\",\n \"quantity\": \"0.7\",\n \"useMasterBalance\": false,\n \"postOnly\": false,\n \"clientOrderId\": \"quote-btc-1130-a\",\n \"selfTradePreventionMode\": \"CANCEL_TAKER\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"totalRequested": 3,
"totalSucceeded": 3,
"totalFailed": 0,
"results": [
{
"originalOrderId": "123e4567-e89b-12d3-a456-426614174000",
"newOrderId": "987e6543-e21b-12d3-a456-426614174000",
"updatedFields": {
"price": "35500.00",
"quantity": "0.7"
},
"matchResult": {
"tradesCount": 2,
"totalFilled": "0.2",
"remainingQuantity": "0.3",
"averageFillPrice": "35100.00",
"status": "PARTIALLY_FILLED",
"actualSlippageBps": 15,
"maxSlippageBps": 50,
"executionPriceRange": {
"bestPrice": "2045.00",
"worstPrice": "2052.00"
}
},
"error": {
"code": "ORDER_NOT_FOUND",
"message": "Order not found or already filled"
}
}
]
}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
1 - 100 elementsShow child attributes
Show child attributes
Was this page helpful?

