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.

Headers

X-Arena-Org
string

Organization id. When present, this call uses that organization's paper sandbox. When absent, the key owner's personal paper account. A value that is not an organization id is 400 invalid_request. An unknown organization is 404 organization_not_found and one this key cannot use is 403 organization_forbidden. The personal account is never the fallback. Paper only. This header does not select a Combine evaluation account.

Maximum string length: 63

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. Paper only.

Required range: 1 <= x <= 99
execution
enum<string>
default:paper

paper (default) uses the paper book and trade:write. kalshi sends a live Kalshi order and needs trade:write:kalshi. poly-intl sends a live Polymarket International order and needs trade:write:poly-intl. Polymarket US is not a value.

Available options:
paper,
kalshi,
poly-intl
op
enum<string>

Live only. Default create.

Available options:
create,
cancel,
amend
orderId
string<uuid>

Live cancel or amend: the Kalshi order id.

priceCents
integer

Live: the price of the side, in cents.

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

Live amend: the new price of the side.

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

Live amend: the new contract count.

Required range: x >= 1

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. The first leg when the ticket split.

Available options:
kalshi,
novig,
polymarket,
null
mode
string
required
Allowed value: "paper"
venueData
boolean
required
fills
object[]

Present when route best split one ticket across venues. priceCents is omitted while venue data is off.

fillPriceCents
integer | null

Only while the venue-data switch is on.

organization
object

Present when X-Arena-Org selected an organization sandbox. Absent on the personal account.