curl --request POST \
--url https://api.agg.market/execution/limit-orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-app-id: <api-key>' \
--data '
{
"venue": "polymarket",
"venueMarketOutcomeId": "cmf3q8z2m00a4mw0lr5t1k7yc",
"side": "buy",
"limitPriceRaw": "450000",
"sizeRaw": "20000000",
"timeInForce": "GTC",
"clientOrderId": "limit-7f3a2c"
}
'import requests
url = "https://api.agg.market/execution/limit-orders"
payload = {
"venue": "polymarket",
"venueMarketOutcomeId": "cmf3q8z2m00a4mw0lr5t1k7yc",
"side": "buy",
"limitPriceRaw": "450000",
"sizeRaw": "20000000",
"timeInForce": "GTC",
"clientOrderId": "limit-7f3a2c"
}
headers = {
"x-app-id": "<api-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-app-id': '<api-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
venue: 'polymarket',
venueMarketOutcomeId: 'cmf3q8z2m00a4mw0lr5t1k7yc',
side: 'buy',
limitPriceRaw: '450000',
sizeRaw: '20000000',
timeInForce: 'GTC',
clientOrderId: 'limit-7f3a2c'
})
};
fetch('https://api.agg.market/execution/limit-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.agg.market/execution/limit-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([
'venue' => 'polymarket',
'venueMarketOutcomeId' => 'cmf3q8z2m00a4mw0lr5t1k7yc',
'side' => 'buy',
'limitPriceRaw' => '450000',
'sizeRaw' => '20000000',
'timeInForce' => 'GTC',
'clientOrderId' => 'limit-7f3a2c'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-app-id: <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://api.agg.market/execution/limit-orders"
payload := strings.NewReader("{\n \"venue\": \"polymarket\",\n \"venueMarketOutcomeId\": \"cmf3q8z2m00a4mw0lr5t1k7yc\",\n \"side\": \"buy\",\n \"limitPriceRaw\": \"450000\",\n \"sizeRaw\": \"20000000\",\n \"timeInForce\": \"GTC\",\n \"clientOrderId\": \"limit-7f3a2c\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-app-id", "<api-key>")
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.agg.market/execution/limit-orders")
.header("x-app-id", "<api-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"venue\": \"polymarket\",\n \"venueMarketOutcomeId\": \"cmf3q8z2m00a4mw0lr5t1k7yc\",\n \"side\": \"buy\",\n \"limitPriceRaw\": \"450000\",\n \"sizeRaw\": \"20000000\",\n \"timeInForce\": \"GTC\",\n \"clientOrderId\": \"limit-7f3a2c\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agg.market/execution/limit-orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-app-id"] = '<api-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"venue\": \"polymarket\",\n \"venueMarketOutcomeId\": \"cmf3q8z2m00a4mw0lr5t1k7yc\",\n \"side\": \"buy\",\n \"limitPriceRaw\": \"450000\",\n \"sizeRaw\": \"20000000\",\n \"timeInForce\": \"GTC\",\n \"clientOrderId\": \"limit-7f3a2c\"\n}"
response = http.request(request)
puts response.read_body{
"orderId": "cmf3r1a2b00c4mw0lq8y7e3uj",
"status": "pending",
"venue": "polymarket",
"venueOrderId": null,
"reservedCostRaw": "9000000",
"limitPriceRaw": "450000",
"limitSizeRaw": "20000000",
"filledSizeRaw": "0",
"remainingSizeRaw": "20000000"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Place limit order
Places a venue-specific limit order. Managed orders reserve funds or shares. Self-custody buys can fund across supported chains using the existing client-signature flow; poll quoteId until the order is open or terminal. Fills are reconciled asynchronously.
curl --request POST \
--url https://api.agg.market/execution/limit-orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-app-id: <api-key>' \
--data '
{
"venue": "polymarket",
"venueMarketOutcomeId": "cmf3q8z2m00a4mw0lr5t1k7yc",
"side": "buy",
"limitPriceRaw": "450000",
"sizeRaw": "20000000",
"timeInForce": "GTC",
"clientOrderId": "limit-7f3a2c"
}
'import requests
url = "https://api.agg.market/execution/limit-orders"
payload = {
"venue": "polymarket",
"venueMarketOutcomeId": "cmf3q8z2m00a4mw0lr5t1k7yc",
"side": "buy",
"limitPriceRaw": "450000",
"sizeRaw": "20000000",
"timeInForce": "GTC",
"clientOrderId": "limit-7f3a2c"
}
headers = {
"x-app-id": "<api-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-app-id': '<api-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
venue: 'polymarket',
venueMarketOutcomeId: 'cmf3q8z2m00a4mw0lr5t1k7yc',
side: 'buy',
limitPriceRaw: '450000',
sizeRaw: '20000000',
timeInForce: 'GTC',
clientOrderId: 'limit-7f3a2c'
})
};
fetch('https://api.agg.market/execution/limit-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.agg.market/execution/limit-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([
'venue' => 'polymarket',
'venueMarketOutcomeId' => 'cmf3q8z2m00a4mw0lr5t1k7yc',
'side' => 'buy',
'limitPriceRaw' => '450000',
'sizeRaw' => '20000000',
'timeInForce' => 'GTC',
'clientOrderId' => 'limit-7f3a2c'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"x-app-id: <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://api.agg.market/execution/limit-orders"
payload := strings.NewReader("{\n \"venue\": \"polymarket\",\n \"venueMarketOutcomeId\": \"cmf3q8z2m00a4mw0lr5t1k7yc\",\n \"side\": \"buy\",\n \"limitPriceRaw\": \"450000\",\n \"sizeRaw\": \"20000000\",\n \"timeInForce\": \"GTC\",\n \"clientOrderId\": \"limit-7f3a2c\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-app-id", "<api-key>")
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.agg.market/execution/limit-orders")
.header("x-app-id", "<api-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"venue\": \"polymarket\",\n \"venueMarketOutcomeId\": \"cmf3q8z2m00a4mw0lr5t1k7yc\",\n \"side\": \"buy\",\n \"limitPriceRaw\": \"450000\",\n \"sizeRaw\": \"20000000\",\n \"timeInForce\": \"GTC\",\n \"clientOrderId\": \"limit-7f3a2c\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.agg.market/execution/limit-orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-app-id"] = '<api-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"venue\": \"polymarket\",\n \"venueMarketOutcomeId\": \"cmf3q8z2m00a4mw0lr5t1k7yc\",\n \"side\": \"buy\",\n \"limitPriceRaw\": \"450000\",\n \"sizeRaw\": \"20000000\",\n \"timeInForce\": \"GTC\",\n \"clientOrderId\": \"limit-7f3a2c\"\n}"
response = http.request(request)
puts response.read_body{
"orderId": "cmf3r1a2b00c4mw0lq8y7e3uj",
"status": "pending",
"venue": "polymarket",
"venueOrderId": null,
"reservedCostRaw": "9000000",
"limitPriceRaw": "450000",
"limitSizeRaw": "20000000",
"filledSizeRaw": "0",
"remainingSizeRaw": "20000000"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}{
"message": "<string>"
}Authorizations
Your application ID. Required for all app-tier and user-tier routes.
JWT access token returned by POST /auth/verify. Required for user-tier routes.
Body
Venue to place the limit order on.
kalshi, polymarket, limitless, opinion, predict, pred, tiprun, probable, myriad, hyperliquid, novig, prophetx, betdex Outcome to trade, on that venue.
buy or sell.
buy, sell Limit price. Price per share scaled by 1e6, as an integer string (530000 = 0.53).
^[1-9][0-9]*$Order size. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
^[1-9][0-9]*$GTC good till cancelled; GTD good till expiresAt; FOK fill in full now or cancel; FAK / IOC fill what you can now, cancel the rest; ALO add liquidity only (Hyperliquid's post-only). Venues support different subsets.
GTC, GTD, FOK, FAK, IOC, ALO Only rest on the book; reject instead of taking liquidity.
Expiry time, for GTD orders.
Your own id for the order, returned on GET /execution/orders.
1 - 128Self-custody, cross-chain fills only: how the token approval a bridge needs is made. sponsored (default): the wallet does not send the approve itself; it signs a one-time EIP-7702 authorization per chain, over a raw digest (not EIP-191 or EIP-712), which many wallets cannot produce. user_broadcast: the user sends the approve transaction from their wallet and pays its gas, on every bridge. Pick based on what the wallet software supports. Neither mode makes bridging free: quote with deepEstimate and read feeBreakdown.bridgeFees and feeBreakdown.setupCosts.
sponsored, user_broadcast Self-custody: other linked wallets this fill may spend from (signingAddress is always included). Order does not matter: per token, the wallet with the largest balance is used first. Omit to fund from the signing wallet only.
42Linked account EOA for self-custody; omit for managed custody. Polymarket supports GTC/GTD buys and sells, at or above the market's minimum size, and requires a previously set-up deposit wallet, which makes every order; a legacy Polymarket Safe can top up a buy's pUSD or a sell's shares by moving them into that deposit wallet first (one extra Safe signature), and legacy proxy wallets are not supported. Hyperliquid supports GTC/ALO buys and sells, whole contracts and a 0.00001 price tick, without expiresAt. Hyperliquid order actions are signed by the EOA or its approved client-held agg agent; AGG never holds an agent key. Placement returns quoteId: poll execution status and answer pendingSignatures using each request's signerAddress. Placement is pending until signatures and venue submission finish. Self-custody buys do not reserve managed balances. Funding uses supported balances across chains and the pinned deposit wallet. On a buy, fundingAddresses may add other wallets linked to the same account; their balances fund the order only by bridging in, never on the venue's own chain. Polymarket CLOB credentials are derived in memory per order or signed cancel and never stored; cancelling requires a fresh cancelSignature. Hyperliquid cancellation requires a fresh signed cancel action. An account referenced by an order cannot be disconnected, including after that order becomes terminal.
42Response
200
Order id.
Order lifecycle status. In flight: pending (accepted, funds being checked), signing, pending_bridge (funds moving to the venue's chain), submitting, submitted (sent to the venue, awaiting confirmation). Resting limit orders: open, partially_filled_open, cancel_pending (cancel requested, awaiting the venue). Terminal: filled, partial_fill (the unfilled rest will not fill; see partialFillReason), failed, expired, cancelled.
pending, signing, pending_bridge, submitting, submitted, open, partially_filled_open, cancel_pending, filled, partial_fill, failed, expired, cancelled Venue the order was placed on.
kalshi, polymarket, limitless, opinion, predict, pred, tiprun, probable, myriad, hyperliquid, novig, prophetx, betdex Limit price. Price per share scaled by 1e6, as an integer string (530000 = 0.53).
Order size. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
Shares filled so far. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
Shares not yet filled. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
Execution quote ID for polling GET /execution/status and submitting the user's signatures to POST /execution/fill/:quoteId/signatures. Present for funded buy orders.
The venue's own order id, once known.
Cash held for a managed buy. null for sells and self-custody. USD in 6-decimal atomic units, as an integer string (1000000 = $1.00).