curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/orders/twap/{twapOrderId}/tca \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/orders/twap/{twapOrderId}/tca"
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/orders/twap/{twapOrderId}/tca', 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/twap/{twapOrderId}/tca",
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/orders/twap/{twapOrderId}/tca"
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/orders/twap/{twapOrderId}/tca")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/orders/twap/{twapOrderId}/tca")
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{
"twapOrderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "COMPLETED",
"side": "BUY",
"windowStartAt": "2026-08-25T10:00:00Z",
"windowTerminalAt": "2026-08-25T11:00:00Z",
"executedQuantity": "118.4",
"shortfallQuantity": "1.6",
"realizedAvgPrice": "2001.35",
"arrivalPrice": "2000.00",
"benchmarkTwapPrice": "2002.10",
"benchmarkSource": "risk_mark_1m",
"slippageVsArrivalBps": "-6.75",
"performanceVsBenchmarkBps": "3.75",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"totalQuantity": "120"
}Get TWAP order TCA report
Get TWAP execution quality (TCA) report.
Post-execution transaction cost analysis for a TERMINAL (COMPLETED or CANCELLED) TWAP parent: the realized average price measured against the arrival price and the interval-TWAP benchmark over the parent’s ACTIVE window (start to terminal time). Benchmark inputs are computed once by the persistor when the terminal row is projected, from per-minute mark history where the pair is marked, falling back to 1m candle closes; when neither series covers the window sufficiently the benchmark fields are null rather than approximate. Sign convention: positive bps means execution BEAT the reference. Users can only access their own TWAP orders; a non-terminal parent is a 400.
curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/orders/twap/{twapOrderId}/tca \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/orders/twap/{twapOrderId}/tca"
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/orders/twap/{twapOrderId}/tca', 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/twap/{twapOrderId}/tca",
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/orders/twap/{twapOrderId}/tca"
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/orders/twap/{twapOrderId}/tca")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/orders/twap/{twapOrderId}/tca")
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{
"twapOrderId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"state": "COMPLETED",
"side": "BUY",
"windowStartAt": "2026-08-25T10:00:00Z",
"windowTerminalAt": "2026-08-25T11:00:00Z",
"executedQuantity": "118.4",
"shortfallQuantity": "1.6",
"realizedAvgPrice": "2001.35",
"arrivalPrice": "2000.00",
"benchmarkTwapPrice": "2002.10",
"benchmarkSource": "risk_mark_1m",
"slippageVsArrivalBps": "-6.75",
"performanceVsBenchmarkBps": "3.75",
"tradingPairId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"totalQuantity": "120"
}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.
Path Parameters
Response
OK
TWAP parent order UUID
Terminal state the report covers: COMPLETED or CANCELLED
"COMPLETED"
Parent side: BUY or SELL (fixes the sign convention)
"BUY"
Active-window start (UTC, RFC 3339) — the measurement window's left edge
"2026-08-25T10:00:00Z"
Terminal time (completion or cancellation; UTC) — the measurement window's right edge. Never the planned end: a cancelled parent stopped trading here.
"2026-08-25T11:00:00Z"
Quantity filled over the window, as decimal string
"118.4"
Unfilled remainder (totalQuantity - executedQuantity, floored at zero)
"1.6"
Volume-weighted realized price (executedNotional / executedQuantity), GROSS of fees — the price the fills traded at, not the net cost after taker fees or maker rebates. Compared against price benchmarks, so fees are deliberately excluded. Null when nothing executed.
"2001.35"
Reference price at (or immediately before) the window start, from benchmarkSource. Null when price history could not cover the window.
"2000.00"
Average reference price over the active window, from benchmarkSource. Null when price history could not cover the window.
"2002.10"
Price series both benchmark values came from: risk_mark_1m (marked pairs) or ohlcv_1m_close (spot fallback). Null when no series qualified.
"risk_mark_1m"
Signed basis points vs the arrival price; POSITIVE means execution beat it (BUY: bought below arrival; SELL: sold above). Null when realized or arrival is null.
"-6.75"
Signed basis points vs the window-TWAP benchmark; POSITIVE means execution beat the benchmark. Null when realized or benchmark is null.
"3.75"
Trading pair the parent executed on. Present so a report is self-describing: prices and bps are meaningless without the instrument, and a dashboard should not need a second lookup to label them.
Parent order quantity, as decimal string. With executedQuantity and shortfallQuantity this closes the fill-rate arithmetic without a second lookup.
"120"
Was this page helpful?

