You trade with POST /api/orders (one order) or POST /api/orders/batch (up to 15), cancel with DELETE /api/orders/:id or DELETE /api/orders, and turn cash into pairs and back with /api/split and /api/merge. On seeryx.com every order, split and merge carries a signed object made by your trading session key: Signing orders shows how; the samples on this page do it for you.
On every POST and DELETE that trades: 8-128 letters, digits, _ or -, new for each intent. The same key with the same body answers what the first request answered and changes nothing; with another body it is refused. Keys are remembered for 24 hours.
A resting limit order; a market buy of $5 that filled; a market buy whose cap was below the best ask.
order is the id of what rests in the book, null when nothing rests. filled is shares traded now; spent and proceeds are USDC paid and received, fees included.
A market order adds requested, fee, avgPrice (cents, without the fee), unspent or unsold, status (filled, partial or none) and, when it did not fill in full, reason: no_liquidity, beyond_limit (with bestPrice) or share_limit.
A market order that fills nothing is still a 200, not an error.
Limit orders are signed until the market's close (the round's end, or an event's closesAt) and rest until then.
Market orders, splits and merges settle within seconds, so sign them for 5 minutes, never past the close. The server accepts an expiry from 5 seconds ahead up to the close.
The last 5 seconds of a round take no new orders (400 "Round is closing"). Resting orders expire at the close and show as type expire in your activity.
Rounds ahead. The next ten 5m and 15m rounds (one of 1h and 1d) already take orders, so a bot can quote a round before it starts.
POST /api/orders/batch places up to 15 orders in one request, in the order given, each with its own checks: the answer has one { status, body } per order, exactly what POST /api/orders would have said. Order i is recorded under <your key>-<i>, so retrying the whole batch with the same key places nothing twice. DELETE /api/orders cancels all your open orders, or with ?slug= those of one market, in one transaction.
curl
# two orders in one request (on seeryx.com each also carries its own "signed")curl-s-X POST https://seeryx.com/api/orders/batch \
-H"X-Auth-Token: $TOKEN"-H"Idempotency-Key: $(uuidgen)"-H"Content-Type: application/json" \
-d'{"orders":[{"slug":"btc-updown-5m-1791916200","side":"up","action":"buy","type":"limit","shares":5,"limit":40},
{"slug":"btc-updown-5m-1791916200","side":"down","action":"buy","type":"limit","shares":5,"limit":40}]}'# {"results":[{"status":200,"body":{"order":21306,...}},{"status":200,"body":{"order":21307,...}}]}# cancel everything still resting in the roundcurl-s-X DELETE "https://seeryx.com/api/orders?slug=btc-updown-5m-1791916200"-H"X-Auth-Token: $TOKEN"-H"Idempotency-Key: $(uuidgen)"# {"success":true,"cancelled":[21306,21307]}
POST /api/split with { slug, amount } turns amount USDC into as many Up and Down shares; POST /api/merge with { slug, shares } turns pairs back into $1.00 each. No fee; at least 5 pairs; signed with a PMS1 message on seeryx.com.
Cash. Resting buys hold no cash, but all your open buys in one market, with the taker fee at their limit, must fit your available cash. Cash moves only when an order fills; a buy you can no longer pay for is cancelled.
Your own orders. An order may trade with your own resting orders and then pays the taker fee like any other; post only refuses such an order instead.
Resting orders. At most 200 per account and 100 in one market (400 open_orders_limit).
Request rate. 250 order, cancel, split and merge requests per 10 seconds per account; each order of a batch counts (429 rate_limited). See Rate limits and errors.
Where GET /api/funds says onChainTrading (always on seeryx.com) the body also carries "signed", made by your trading session key: see Signing orders.
order is the id of the part that rests in the book, null when nothing rests. filled is shares traded now; spent and proceeds are USDC paid and received, fees included.
A market order answers its result in full: requested, fee, avgPrice (cents, without the fee), unspent (a buy) or unsold (a sale), status "filled", "partial" or "none", and for less than a full fill a reason: "no_liquidity" (the book ran out), "beyond_limit" with bestPrice (the rest is priced past your cap) or "share_limit" (a market buy signed in shares got all of them below its cap). A market order that fills nothing is still a 200.
Status
When
400
Invalid input ("Invalid limit", "Invalid slug"), "Round is not live", "Round is closing", "Insufficient balance", "Insufficient free shares", a signed order that does not match
400 below_minimum
Fewer shares than minOrderShares; the answer adds "minimum"
400 would_take
A post-only order that would trade at once
400 open_orders_limit
Too many resting orders; the answer adds "limit": { account, round }
400 trading_paused
The session key that signed it was closed: open a new session and sign again
429 rate_limited
More than the order requests allowed per window; wait "retryAfter" seconds
503 trading_halted
Trading is halted for everyone (see GET /api/notice); cancels still work
503
Exchange clock unavailable: the server cannot confirm the round time; try again in a few seconds
POST/api/orders/batch
Place up to 15 orders in one request
Signed in + Idempotency-Key
Field
Type
Description
ordersbodyrequired
array
1 to 15 orders, each exactly the body of POST /api/orders with its own signed object
Placed in the order given, each with its own checks; a refused order does not stop the others. Each order counts as one request against the rate limit.
Order i is recorded under the idempotency key <your key>-<i> (i from 0; your key at most 125 characters), so retrying the whole batch places nothing twice.
Status
When
400
orders is not a list of 1 to 15 orders
429 rate_limited
The batch would pass the order requests allowed per window