curl --request POST \
--url https://tx-builder-testnet.avantisfi.com/v2/twap/close \
--header 'Content-Type: application/json' \
--data '
{
"trader": "<string>",
"tradeIndex": 1,
"coinExposureToClose": "<string>",
"runTimeSeconds": 1,
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>"
}
'import requests
url = "https://tx-builder-testnet.avantisfi.com/v2/twap/close"
payload = {
"trader": "<string>",
"tradeIndex": 1,
"coinExposureToClose": "<string>",
"runTimeSeconds": 1,
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
trader: '<string>',
tradeIndex: 1,
coinExposureToClose: '<string>',
runTimeSeconds: 1,
pairIndex: 1,
pair: '<string>',
delegate: '<string>'
})
};
fetch('https://tx-builder-testnet.avantisfi.com/v2/twap/close', 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://tx-builder-testnet.avantisfi.com/v2/twap/close",
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([
'trader' => '<string>',
'tradeIndex' => 1,
'coinExposureToClose' => '<string>',
'runTimeSeconds' => 1,
'pairIndex' => 1,
'pair' => '<string>',
'delegate' => '<string>'
]),
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://tx-builder-testnet.avantisfi.com/v2/twap/close"
payload := strings.NewReader("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposureToClose\": \"<string>\",\n \"runTimeSeconds\": 1,\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://tx-builder-testnet.avantisfi.com/v2/twap/close")
.header("Content-Type", "application/json")
.body("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposureToClose\": \"<string>\",\n \"runTimeSeconds\": 1,\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tx-builder-testnet.avantisfi.com/v2/twap/close")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposureToClose\": \"<string>\",\n \"runTimeSeconds\": 1,\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"to": "0x0000000000000000000000000000000000000000",
"from": "0x0000000000000000000000000000000000000000",
"data": "<string>",
"value": "0x0",
"chainId": 123,
"description": "<string>",
"meta": {
"pair": "<string>",
"pairIndex": 123,
"tradeIndex": 123,
"coinExposureToClose": "<string>",
"runTimeSeconds": 123,
"delegated": true
}
}
}{
"ok": false,
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"details": "<unknown>"
}
}Build a TWAP close transaction (exposure unwound in slices over time)
Returns an unsigned transaction that instructs the Avantis operator to close coinExposureToClose of an open position in slices spread across runTimeSeconds.
curl --request POST \
--url https://tx-builder-testnet.avantisfi.com/v2/twap/close \
--header 'Content-Type: application/json' \
--data '
{
"trader": "<string>",
"tradeIndex": 1,
"coinExposureToClose": "<string>",
"runTimeSeconds": 1,
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>"
}
'import requests
url = "https://tx-builder-testnet.avantisfi.com/v2/twap/close"
payload = {
"trader": "<string>",
"tradeIndex": 1,
"coinExposureToClose": "<string>",
"runTimeSeconds": 1,
"pairIndex": 1,
"pair": "<string>",
"delegate": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
trader: '<string>',
tradeIndex: 1,
coinExposureToClose: '<string>',
runTimeSeconds: 1,
pairIndex: 1,
pair: '<string>',
delegate: '<string>'
})
};
fetch('https://tx-builder-testnet.avantisfi.com/v2/twap/close', 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://tx-builder-testnet.avantisfi.com/v2/twap/close",
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([
'trader' => '<string>',
'tradeIndex' => 1,
'coinExposureToClose' => '<string>',
'runTimeSeconds' => 1,
'pairIndex' => 1,
'pair' => '<string>',
'delegate' => '<string>'
]),
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://tx-builder-testnet.avantisfi.com/v2/twap/close"
payload := strings.NewReader("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposureToClose\": \"<string>\",\n \"runTimeSeconds\": 1,\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://tx-builder-testnet.avantisfi.com/v2/twap/close")
.header("Content-Type", "application/json")
.body("{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposureToClose\": \"<string>\",\n \"runTimeSeconds\": 1,\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://tx-builder-testnet.avantisfi.com/v2/twap/close")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"trader\": \"<string>\",\n \"tradeIndex\": 1,\n \"coinExposureToClose\": \"<string>\",\n \"runTimeSeconds\": 1,\n \"pairIndex\": 1,\n \"pair\": \"<string>\",\n \"delegate\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"data": {
"to": "0x0000000000000000000000000000000000000000",
"from": "0x0000000000000000000000000000000000000000",
"data": "<string>",
"value": "0x0",
"chainId": 123,
"description": "<string>",
"meta": {
"pair": "<string>",
"pairIndex": 123,
"tradeIndex": 123,
"coinExposureToClose": "<string>",
"runTimeSeconds": 123,
"delegated": true
}
}
}{
"ok": false,
"error": {
"code": "BAD_REQUEST",
"message": "<string>",
"details": "<unknown>"
}
}Body
The trader (position owner). USDC collateral is pulled from and paid out to this address.
Position slot index for this trader + pair (0-based; a trader can hold several positions on the same pair). Read it from GET /v2/positions → trades[].trade.index.
x >= 0Exposure to close, in base-asset units (e.g. 0.5 = 0.5 ETH on ETH/USD).
Execution window in seconds; the order is filled in slices spread across this duration.
x > 0Pair index (alternative to pair).
x >= 0Pair symbol, e.g. ETH/USD (separators /, -, _ accepted; case-insensitive).
1Optional pre-authorized delegate. When set, the call is wrapped in delegatedAction(trader, …) and from becomes this address — the delegate signs the transaction and pays gas. Register one via /v2/delegate/set.
Response
Success envelope: ok is true and data carries the payload documented below.