curl --request POST \
--url https://api.ondoperps.xyz/v1/spot/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"side": "buy",
"size": "20.30",
"market": "SPY-USDC",
"price": "1.55",
"clientOrderId": "order123",
"type": "limit",
"timeInForce": "GTC",
"postOnly": false
}
'import requests
url = "https://api.ondoperps.xyz/v1/spot/orders"
payload = {
"side": "buy",
"size": "20.30",
"market": "SPY-USDC",
"price": "1.55",
"clientOrderId": "order123",
"type": "limit",
"timeInForce": "GTC",
"postOnly": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
side: 'buy',
size: '20.30',
market: 'SPY-USDC',
price: '1.55',
clientOrderId: 'order123',
type: 'limit',
timeInForce: 'GTC',
postOnly: false
})
};
fetch('https://api.ondoperps.xyz/v1/spot/orders', 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://api.ondoperps.xyz/v1/spot/orders",
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([
'side' => 'buy',
'size' => '20.30',
'market' => 'SPY-USDC',
'price' => '1.55',
'clientOrderId' => 'order123',
'type' => 'limit',
'timeInForce' => 'GTC',
'postOnly' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.ondoperps.xyz/v1/spot/orders"
payload := strings.NewReader("{\n \"side\": \"buy\",\n \"size\": \"20.30\",\n \"market\": \"SPY-USDC\",\n \"price\": \"1.55\",\n \"clientOrderId\": \"order123\",\n \"type\": \"limit\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.ondoperps.xyz/v1/spot/orders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"side\": \"buy\",\n \"size\": \"20.30\",\n \"market\": \"SPY-USDC\",\n \"price\": \"1.55\",\n \"clientOrderId\": \"order123\",\n \"type\": \"limit\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ondoperps.xyz/v1/spot/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"side\": \"buy\",\n \"size\": \"20.30\",\n \"market\": \"SPY-USDC\",\n \"price\": \"1.55\",\n \"clientOrderId\": \"order123\",\n \"type\": \"limit\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"orderId": "70a37d8f972f2494837f9dba8364cbb4",
"side": "buy",
"price": "1.55",
"size": "20.30",
"market": "SPY-USDC",
"filledSize": "5.403",
"lastFillSize": "5.403",
"filledCost": "8.37465",
"fee": "0.0837",
"status": "open",
"createdAt": "2022-06-16T12:35:11.123456Z",
"type": "limit",
"clientOrderId": "order123",
"filledAt": "2022-06-16T12:35:11.123456Z",
"canceledAt": "2022-06-16T12:35:11.123456Z",
"cancelReason": "liquidation",
"timeInForce": "GTC"
}
}{
"success": false,
"error": "Description of the error",
"error_code": "too_many_requests"
}Place Spot order
Place a fully funded Spot limit or market order. Use base-denominated size; quoteSize is unsupported. Acknowledgement is not a fill guarantee. Reconcile an uncertain submission by clientOrderId before replacing it. Client IDs are not idempotency keys: accepted-ID reuse fails with clientOrderID_collision. Price protection uses the underlying oracle; see /mark-price-protection. Some flows require /v1/spot/orders/delayed; re-sign the new path when instructed.
See the Spot API guide. Requires authentication; API-key scope: trade.
curl --request POST \
--url https://api.ondoperps.xyz/v1/spot/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"side": "buy",
"size": "20.30",
"market": "SPY-USDC",
"price": "1.55",
"clientOrderId": "order123",
"type": "limit",
"timeInForce": "GTC",
"postOnly": false
}
'import requests
url = "https://api.ondoperps.xyz/v1/spot/orders"
payload = {
"side": "buy",
"size": "20.30",
"market": "SPY-USDC",
"price": "1.55",
"clientOrderId": "order123",
"type": "limit",
"timeInForce": "GTC",
"postOnly": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
side: 'buy',
size: '20.30',
market: 'SPY-USDC',
price: '1.55',
clientOrderId: 'order123',
type: 'limit',
timeInForce: 'GTC',
postOnly: false
})
};
fetch('https://api.ondoperps.xyz/v1/spot/orders', 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://api.ondoperps.xyz/v1/spot/orders",
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([
'side' => 'buy',
'size' => '20.30',
'market' => 'SPY-USDC',
'price' => '1.55',
'clientOrderId' => 'order123',
'type' => 'limit',
'timeInForce' => 'GTC',
'postOnly' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://api.ondoperps.xyz/v1/spot/orders"
payload := strings.NewReader("{\n \"side\": \"buy\",\n \"size\": \"20.30\",\n \"market\": \"SPY-USDC\",\n \"price\": \"1.55\",\n \"clientOrderId\": \"order123\",\n \"type\": \"limit\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://api.ondoperps.xyz/v1/spot/orders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"side\": \"buy\",\n \"size\": \"20.30\",\n \"market\": \"SPY-USDC\",\n \"price\": \"1.55\",\n \"clientOrderId\": \"order123\",\n \"type\": \"limit\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ondoperps.xyz/v1/spot/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"side\": \"buy\",\n \"size\": \"20.30\",\n \"market\": \"SPY-USDC\",\n \"price\": \"1.55\",\n \"clientOrderId\": \"order123\",\n \"type\": \"limit\",\n \"timeInForce\": \"GTC\",\n \"postOnly\": false\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"orderId": "70a37d8f972f2494837f9dba8364cbb4",
"side": "buy",
"price": "1.55",
"size": "20.30",
"market": "SPY-USDC",
"filledSize": "5.403",
"lastFillSize": "5.403",
"filledCost": "8.37465",
"fee": "0.0837",
"status": "open",
"createdAt": "2022-06-16T12:35:11.123456Z",
"type": "limit",
"clientOrderId": "order123",
"filledAt": "2022-06-16T12:35:11.123456Z",
"canceledAt": "2022-06-16T12:35:11.123456Z",
"cancelReason": "liquidation",
"timeInForce": "GTC"
}
}{
"success": false,
"error": "Description of the error",
"error_code": "too_many_requests"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Spot limit or market order. Size is a positive multiple of baseIncrement; the minimum quantity is one increment. There is no separate minimum notional. Limit orders require price, a positive multiple of quoteIncrement below 10000000. Omit price and timeInForce for market orders. quoteSize, reduceOnly, TP/SL, builderCode, and rpi are not supported. See the Spot API guide for price protection and reconciliation.
buy or sell
buy, sell "buy"
Order quantity in base currency. Used for both limit and market orders. Must be aligned with baseIncrement from /v1/markets.
"20.30"
Trading market pair
"SPY-USDC"
Limit price. Must be aligned with quoteIncrement from /v1/markets. Omit for market orders.
"1.55"
Optional client-provided order ID. Must be alphanumeric including underscores and dashes, and at most 64 characters.
64^[A-Za-z0-9_-]+$"order123"
Order type. Defaults to "limit".
limit, market "limit"
"GTC" (Good until cancelled) or "IOC" (Immediate or cancel). Cannot be set for market orders. Defaults to "GTC".
GTC, IOC "GTC"
Use only with a GTC limit order. Rejects an order that would immediately match; cannot be combined with IOC.
false