# List the pending limit orders of one maker wallet.
# Needs openssl, curl and OLYMPEX_API_KEY_ID, OLYMPEX_SECRET_KEY, OLYMPEX_PASSPHRASE.
METHOD=GET
ENDPOINT=/limit-order
QUERY='accountTo=0x1E67cb01969D79B2B895179e4A07D24a839dBb52&status=pending'
BODY='' # GET has no body: the signature covers the empty string
TS="${OLYMPEX_TIMESTAMP:-$(date +%s)}"
NONCE="${OLYMPEX_NONCE:-$(openssl rand -hex 12)}"
BODY_HASH="$(printf '%s' "$BODY" | openssl dgst -sha256 -binary | openssl base64 -A | tr '+/' '-_' | tr -d '=')"
VALUE_INFO="$(printf '%s\n%s\n%s' "$TS" "$NONCE" "$BODY_HASH")"
MESSAGE="$(printf 'OLPX-HMAC-SHA256-V2\n%s\n%s\n%s\n%s\n%s\n%s' "$TS" "$NONCE" "$METHOD" "/api/v1$ENDPOINT" "$QUERY" "$BODY_HASH")"
curl -sS -X "$METHOD" "https://api-rest.olympex.io/api/v1$ENDPOINT${QUERY:+?$QUERY}" \
-H "content-type: application/json" \
-H "x-api-key-id: $OLYMPEX_API_KEY_ID" \
-H "x-value-info: $(printf '%s' "$VALUE_INFO" | openssl base64 -A)" \
-H "x-passphrase: $OLYMPEX_PASSPHRASE" \
-H "x-signature: $(printf '%s' "$MESSAGE" | openssl dgst -sha256 -hmac "$OLYMPEX_SECRET_KEY" -binary | od -An -v -tx1 | tr -d ' \n')"
import { olympexRequest } from "./sign-request.ts"; // /authentication/sign-requests
type LimitOrder = { id: string; status: string; amount: number; priceTrigger: number; tokenASymbol: string; tokenBSymbol: string; createdAt: string };
const maker = "0x1E67cb01969D79B2B895179e4A07D24a839dBb52"; // EIP-55 form, as sent when the orders were created
const query = new URLSearchParams({ accountTo: maker, chainId: "137", status: "pending" });
const orders = await olympexRequest<LimitOrder[]>("GET", `/limit-order?${query}`);
orders.sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt)); // the list is unsorted
for (const order of orders) {
console.log(order.id, `sell ${order.amount} ${order.tokenASymbol} at ${order.priceTrigger} ${order.tokenBSymbol}`);
}
from urllib.parse import urlencode
from sign_request import olympex_request # /authentication/sign-requests
maker = "0x1E67cb01969D79B2B895179e4A07D24a839dBb52" # EIP-55 form, as sent when the orders were created
query = urlencode({"accountTo": maker, "chainId": 137, "status": "pending"})
orders = olympex_request("GET", f"/limit-order?{query}")
for order in sorted(orders, key=lambda o: o["createdAt"]): # the list is unsorted
print(order["id"], f'sell {order["amount"]} {order["tokenASymbol"]} at {order["priceTrigger"]} {order["tokenBSymbol"]}')
{
"success": true,
"data": [
{
"id": "afc47108-d059-473c-b2e1-5f2ca7951466",
"accountTo": "0x1E67cb01969D79B2B895179e4A07D24a839dBb52",
"chainId": 137,
"gasPrice": "35",
"inTokenAddress": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
"outTokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"slippage": "1",
"tokenASymbol": "ETH",
"tokenBSymbol": "USDC",
"amount": 0.5,
"price": 4200,
"priceTrigger": 4200,
"expired": "1791302400000",
"txHash": "",
"status": "pending",
"reasonFail": [],
"attemptNumber": 0,
"allowance": "",
"estimateGas": "",
"effectivePriceGas": "",
"createdAt": "2026-09-29T16:01:22.237Z",
"updatedAt": "2026-09-29T16:01:22.237Z",
"deletedAt": ""
}
],
"meta": {
"requestId": "EdkfMgWMIAMEPrQ=",
"version": "v1",
"accountType": "integrator",
"apiKeyId": "00000000-0000-4000-8000-000000000000"
}
}
{
"message": "Forbidden"
}
List limit orders
List the limit orders created with your API key, filtered by status, chain or maker wallet.
# List the pending limit orders of one maker wallet.
# Needs openssl, curl and OLYMPEX_API_KEY_ID, OLYMPEX_SECRET_KEY, OLYMPEX_PASSPHRASE.
METHOD=GET
ENDPOINT=/limit-order
QUERY='accountTo=0x1E67cb01969D79B2B895179e4A07D24a839dBb52&status=pending'
BODY='' # GET has no body: the signature covers the empty string
TS="${OLYMPEX_TIMESTAMP:-$(date +%s)}"
NONCE="${OLYMPEX_NONCE:-$(openssl rand -hex 12)}"
BODY_HASH="$(printf '%s' "$BODY" | openssl dgst -sha256 -binary | openssl base64 -A | tr '+/' '-_' | tr -d '=')"
VALUE_INFO="$(printf '%s\n%s\n%s' "$TS" "$NONCE" "$BODY_HASH")"
MESSAGE="$(printf 'OLPX-HMAC-SHA256-V2\n%s\n%s\n%s\n%s\n%s\n%s' "$TS" "$NONCE" "$METHOD" "/api/v1$ENDPOINT" "$QUERY" "$BODY_HASH")"
curl -sS -X "$METHOD" "https://api-rest.olympex.io/api/v1$ENDPOINT${QUERY:+?$QUERY}" \
-H "content-type: application/json" \
-H "x-api-key-id: $OLYMPEX_API_KEY_ID" \
-H "x-value-info: $(printf '%s' "$VALUE_INFO" | openssl base64 -A)" \
-H "x-passphrase: $OLYMPEX_PASSPHRASE" \
-H "x-signature: $(printf '%s' "$MESSAGE" | openssl dgst -sha256 -hmac "$OLYMPEX_SECRET_KEY" -binary | od -An -v -tx1 | tr -d ' \n')"
import { olympexRequest } from "./sign-request.ts"; // /authentication/sign-requests
type LimitOrder = { id: string; status: string; amount: number; priceTrigger: number; tokenASymbol: string; tokenBSymbol: string; createdAt: string };
const maker = "0x1E67cb01969D79B2B895179e4A07D24a839dBb52"; // EIP-55 form, as sent when the orders were created
const query = new URLSearchParams({ accountTo: maker, chainId: "137", status: "pending" });
const orders = await olympexRequest<LimitOrder[]>("GET", `/limit-order?${query}`);
orders.sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt)); // the list is unsorted
for (const order of orders) {
console.log(order.id, `sell ${order.amount} ${order.tokenASymbol} at ${order.priceTrigger} ${order.tokenBSymbol}`);
}
from urllib.parse import urlencode
from sign_request import olympex_request # /authentication/sign-requests
maker = "0x1E67cb01969D79B2B895179e4A07D24a839dBb52" # EIP-55 form, as sent when the orders were created
query = urlencode({"accountTo": maker, "chainId": 137, "status": "pending"})
orders = olympex_request("GET", f"/limit-order?{query}")
for order in sorted(orders, key=lambda o: o["createdAt"]): # the list is unsorted
print(order["id"], f'sell {order["amount"]} {order["tokenASymbol"]} at {order["priceTrigger"]} {order["tokenBSymbol"]}')
{
"success": true,
"data": [
{
"id": "afc47108-d059-473c-b2e1-5f2ca7951466",
"accountTo": "0x1E67cb01969D79B2B895179e4A07D24a839dBb52",
"chainId": 137,
"gasPrice": "35",
"inTokenAddress": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
"outTokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"slippage": "1",
"tokenASymbol": "ETH",
"tokenBSymbol": "USDC",
"amount": 0.5,
"price": 4200,
"priceTrigger": 4200,
"expired": "1791302400000",
"txHash": "",
"status": "pending",
"reasonFail": [],
"attemptNumber": 0,
"allowance": "",
"estimateGas": "",
"effectivePriceGas": "",
"createdAt": "2026-09-29T16:01:22.237Z",
"updatedAt": "2026-09-29T16:01:22.237Z",
"deletedAt": ""
}
],
"meta": {
"requestId": "EdkfMgWMIAMEPrQ=",
"version": "v1",
"accountType": "integrator",
"apiKeyId": "00000000-0000-4000-8000-000000000000"
}
}
{
"message": "Forbidden"
}
GET /limit-order returns every limit order created with your API key, including cancelled ones. Filter by status, chainId and accountTo to show a wallet’s open orders, or to find out whether a create call that timed out went through before you send it again.
Filters
| Query parameter | Returns only orders |
|---|---|
status | With this status: pending, executing, submitted, completed, cancelled or failed. |
chainId | On this chain, for example 137. |
accountTo | For this maker wallet, written exactly as it was sent when the order was created. The match is case-sensitive, so always send the EIP-55 checksummed form, both when you create orders and when you filter. |
limit or offset, are ignored. So is a misspelt filter, so check the spelling: ?acountTo= returns every order. Send each parameter once: a repeated parameter matches nothing and returns an empty array. Filter values aren’t validated either: an unknown status, or a chainId that isn’t a number, returns an empty array, not an error.
What the list holds
- Only your orders. The list holds the orders created with the API key that signs the request. Orders created with another API key never appear, and their IDs return
404onGET /limit-order/{id}. - Cancelled orders too. A cancelled order stays in the list with
status: "cancelled"anddeletedAtset. To show open orders, filter withstatus=pending, or keep the orders whosestatusisn’t final (completed,failedorcancelled). - Unsorted and unpaginated. Sort by
createdAtyourself. Every matching order comes back in one response, so narrow the list withaccountToandstatusinstead of fetching every order on each poll. - Numbers and normalized symbols.
amount,priceandpriceTriggercome back as JSON numbers, andtokenASymbolandtokenBSymbolcan be normalized (WETHcomes back asETH). Identify orders by token address, never by symbol.
Find an order after a create call timed out
POST /limit-order creates a new order every time it succeeds, so never resend a create call that timed out without checking first. List the maker’s orders on the chain and look for one that matches the body you sent. expired comes back exactly as you sent it, which makes it a practical field to match on.
import { olympexRequest } from "./sign-request.ts"; // /authentication/sign-requests
type LimitOrder = { id: string; inTokenAddress: string; outTokenAddress: string; amount: number; priceTrigger: number; expired: string };
// Fields from the body of the POST /limit-order call that timed out.
const sent = {
accountTo: "0x1E67cb01969D79B2B895179e4A07D24a839dBb52",
inTokenAddress: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", // WETH
outTokenAddress: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", // USDC
amount: "0.5",
priceTrigger: "4200",
expired: "1791302400000",
};
const sameAddress = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();
const query = new URLSearchParams({ accountTo: sent.accountTo, chainId: "137" });
const orders = await olympexRequest<LimitOrder[]>("GET", `/limit-order?${query}`);
const existing = orders.find(
(order) =>
order.expired === sent.expired &&
sameAddress(order.inTokenAddress, sent.inTokenAddress) &&
sameAddress(order.outTokenAddress, sent.outTokenAddress) &&
order.amount === Number(sent.amount) &&
order.priceTrigger === Number(sent.priceTrigger),
);
console.log(existing ? `Already created: ${existing.id}` : "Not created: sign the create call again and send it");
# List the pending limit orders of one maker wallet.
# Needs openssl, curl and OLYMPEX_API_KEY_ID, OLYMPEX_SECRET_KEY, OLYMPEX_PASSPHRASE.
METHOD=GET
ENDPOINT=/limit-order
QUERY='accountTo=0x1E67cb01969D79B2B895179e4A07D24a839dBb52&status=pending'
BODY='' # GET has no body: the signature covers the empty string
TS="${OLYMPEX_TIMESTAMP:-$(date +%s)}"
NONCE="${OLYMPEX_NONCE:-$(openssl rand -hex 12)}"
BODY_HASH="$(printf '%s' "$BODY" | openssl dgst -sha256 -binary | openssl base64 -A | tr '+/' '-_' | tr -d '=')"
VALUE_INFO="$(printf '%s\n%s\n%s' "$TS" "$NONCE" "$BODY_HASH")"
MESSAGE="$(printf 'OLPX-HMAC-SHA256-V2\n%s\n%s\n%s\n%s\n%s\n%s' "$TS" "$NONCE" "$METHOD" "/api/v1$ENDPOINT" "$QUERY" "$BODY_HASH")"
curl -sS -X "$METHOD" "https://api-rest.olympex.io/api/v1$ENDPOINT${QUERY:+?$QUERY}" \
-H "content-type: application/json" \
-H "x-api-key-id: $OLYMPEX_API_KEY_ID" \
-H "x-value-info: $(printf '%s' "$VALUE_INFO" | openssl base64 -A)" \
-H "x-passphrase: $OLYMPEX_PASSPHRASE" \
-H "x-signature: $(printf '%s' "$MESSAGE" | openssl dgst -sha256 -hmac "$OLYMPEX_SECRET_KEY" -binary | od -An -v -tx1 | tr -d ' \n')"
import { olympexRequest } from "./sign-request.ts"; // /authentication/sign-requests
type LimitOrder = { id: string; status: string; amount: number; priceTrigger: number; tokenASymbol: string; tokenBSymbol: string; createdAt: string };
const maker = "0x1E67cb01969D79B2B895179e4A07D24a839dBb52"; // EIP-55 form, as sent when the orders were created
const query = new URLSearchParams({ accountTo: maker, chainId: "137", status: "pending" });
const orders = await olympexRequest<LimitOrder[]>("GET", `/limit-order?${query}`);
orders.sort((a, b) => Date.parse(a.createdAt) - Date.parse(b.createdAt)); // the list is unsorted
for (const order of orders) {
console.log(order.id, `sell ${order.amount} ${order.tokenASymbol} at ${order.priceTrigger} ${order.tokenBSymbol}`);
}
from urllib.parse import urlencode
from sign_request import olympex_request # /authentication/sign-requests
maker = "0x1E67cb01969D79B2B895179e4A07D24a839dBb52" # EIP-55 form, as sent when the orders were created
query = urlencode({"accountTo": maker, "chainId": 137, "status": "pending"})
orders = olympex_request("GET", f"/limit-order?{query}")
for order in sorted(orders, key=lambda o: o["createdAt"]): # the list is unsorted
print(order["id"], f'sell {order["amount"]} {order["tokenASymbol"]} at {order["priceTrigger"]} {order["tokenBSymbol"]}')
{
"success": true,
"data": [
{
"id": "afc47108-d059-473c-b2e1-5f2ca7951466",
"accountTo": "0x1E67cb01969D79B2B895179e4A07D24a839dBb52",
"chainId": 137,
"gasPrice": "35",
"inTokenAddress": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
"outTokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
"slippage": "1",
"tokenASymbol": "ETH",
"tokenBSymbol": "USDC",
"amount": 0.5,
"price": 4200,
"priceTrigger": 4200,
"expired": "1791302400000",
"txHash": "",
"status": "pending",
"reasonFail": [],
"attemptNumber": 0,
"allowance": "",
"estimateGas": "",
"effectivePriceGas": "",
"createdAt": "2026-09-29T16:01:22.237Z",
"updatedAt": "2026-09-29T16:01:22.237Z",
"deletedAt": ""
}
],
"meta": {
"requestId": "EdkfMgWMIAMEPrQ=",
"version": "v1",
"accountType": "integrator",
"apiKeyId": "00000000-0000-4000-8000-000000000000"
}
}
{
"message": "Forbidden"
}
Authorizations
Your API key ID (UUID). See Sign requests.
Base64 of timestamp + "\n" + nonce + "\n" + bodyHash, where timestamp is Unix seconds, nonce is 24 new hexadecimal characters and bodyHash is the unpadded base64url SHA-256 of the canonical body.
Your account passphrase. Treat it like the secret key.
Lowercase hex HMAC-SHA256 (signature v2), keyed with your secret key string (UTF-8, not decoded), of seven lines joined with \n, with no trailing newline: OLPX-HMAC-SHA256-V2, timestamp, nonce, the uppercase method, path, canonicalQuery and bodyHash. path is the request path including /api/v1, without the query string, for example /api/v1/limit-order/<id>. canonicalQuery is the query parameters decoded (+ is a space), sorted by key and then by value, re-encoded per RFC 3986 and joined with &, or the empty string when there is no query. Headers signed for one request are rejected on any other. See Sign requests.
Query Parameters
Only orders for this maker wallet. Matches case-sensitively: use the exact form you sent when you created the order.
Only orders on this chain: an integer such as 137. A value that isn't an integer matches nothing and returns an empty array.
x >= 1Only orders with this status.
pending, executing, submitted, completed, cancelled, failed Response
Matching limit orders.
Was this page helpful?
