Skip to main content
POST
Place a paper order

Authorizations

Authorization
string
header
required

Authorization: Bearer arena_sk_... (the x-arena-key header is accepted too). Keys are made in Settings (https://arena-predictions.com/settings#api-keys) or with arena keys create, shown once, stored hashed.

Body

application/json

A buy names instrumentId or ticker, side and count. A sell names tradeId and covers the whole open position. A limit order adds limitPriceCents. Unknown fields are refused (400), so a typo never changes an order.

type
enum<string>
required

market: fills now at the live price or is refused. limit: fills at limitPriceCents or better, or rests (gtc), or is canceled (ioc, fok).

Available options:
market,
limit
idempotencyKey
string<uuid>
required

One per order. The same key again answers the stored order with replayed: true and places nothing; the same key with a different order is 409 idempotency_key_reused. Retry with the same key after a timeout or a 503.

action
enum<string>
default:buy
Available options:
buy,
sell
clientOrderId
string<uuid>

Kalshi's name for idempotencyKey. Send one of the two.

instrumentId
string

Buy: the Arena instrument; side is the instrument's side. It must list on one live Kalshi market (409 no_tradable_listing otherwise).

Pattern: ^ins_[0-9A-HJKMNP-TV-Z]{12}$
ticker
string

Buy: a Kalshi market ticker instead of instrumentId; side is the market's side. Never echoed back while the venue-data switch is off.

side
enum<string>

Buy: the side to buy.

Available options:
yes,
no
count
integer

Buy: contracts. Your paper balance is the limit.

Required range: 1 <= x <= 1000000000
tradeId
string<uuid>

Sell: the open position (GET /portfolio).

limitPriceCents
integer

Limit: your price for the side you trade, in cents (a percent).

Required range: 1 <= x <= 99
timeInForce
enum<string>
default:gtc
Available options:
gtc,
ioc,
fok,
good_till_canceled,
immediate_or_cancel,
fill_or_kill
expiresAt
string<date-time>

gtc only: when the order stops resting. At most 365 days out.

maxPriceCents
integer

Market buy: refuse to fill above this (409 price_moved, nothing placed).

Required range: 1 <= x <= 99
minPriceCents
integer

Market sell: refuse to sell below this (409 price_moved, nothing sold).

Required range: 1 <= x <= 99
route
enum<string>

best: a fill may be priced at Novig's or Polymarket's price when it passes every check. Omitted: Kalshi's.

Available options:
kalshi,
best
statedProbPct
integer

Buy: your probability for the side. Never changes the fill; scored on /eval.

Required range: 1 <= x <= 99

Response

A replay: this idempotencyKey was used before for the same order. Nothing new was placed.

status
enum<string>
required

canceled: an ioc or fok that did not fill. Nothing was spent.

Available options:
executed,
resting,
canceled
action
enum<string>
required
Available options:
buy,
sell
type
enum<string>
required
Available options:
market,
limit
idempotencyKey
string<uuid>
required
replayed
boolean
required

True when this idempotencyKey was used before: the stored order, nothing new placed.

originalCreatedAt
string<date-time> | null
required

On a replay: when the order was first placed.

order
object | null
required

The limit order. Null for a market order, which is a fill and not an order.

trade
object | null
required

The position opened (buy) or closed (sell). Null while resting or canceled.

fillVenue
enum<string> | null
required

Where the fill was priced. Paper only: nothing is sent there.

Available options:
kalshi,
novig,
polymarket,
null
mode
string
required
Allowed value: "paper"
venueData
boolean
required
fillPriceCents
integer | null

Only while the venue-data switch is on.