Trading

Place a paper order

Places an order for the key owner. The default is a paper order, as the CLI and the MCP server do: nothing is sent to Kalshi or any venue. execution kalshi sends a live Kalshi order (scope trade:write:kalshi) through the live door and does not touch the paper book. execution poly-intl sends a live Polymarket International order (scope trade:write:poly-intl) and refuses a US visitor. Polymarket US is not offered. Send X-Arena-Org to place a paper order on that organization's paper sandbox; without the header the paper order is on the personal account. An unknown or forbidden organization places nothing. A market order fills now at the live price or is refused. A limit order fills at limitPriceCents or better, rests until it fills, is canceled or expires (gtc), or is canceled at once when it does not fill (ioc, fok). Opening a position needs Arena Basic. Every paper order counts against the hard trade limits (per key 10 new orders a minute and 50 a day, 20 sells and cancels a minute; per account 20, 100 and 40), which are always enforced. No ticker, title or price in the paper answer while the venue-data switch is off.

post/portfolio/orders

Request

  • Base URL: https://arena-predictions.com/api/v1
  • URL: https://arena-predictions.com/api/v1/portfolio/orders
  • Auth: one of:
    • HTTP bearer
    • HTTP bearer
    • HTTP bearer

Headers

X-Arena-Orgstring

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.

Request body

action'buy' | 'sell'
type'market' | 'limit' 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).

idempotencyKeystring 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.

clientOrderIdstring uuid

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

instrumentIdstring

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

tickerstring

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'yes' | 'no'

Buy: the side to buy.

countinteger

Buy: contracts. Your paper balance is the limit.

tradeIdstring uuid

Sell: the open position (GET /portfolio).

limitPriceCentsinteger

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

timeInForce'gtc' | 'ioc' | 'fok' | 'good_till_canceled' | 'immediate_or_cancel' | 'fill_or_kill'
expiresAtstring date-time

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

maxPriceCentsinteger

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

minPriceCentsinteger

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

route'kalshi' | 'best'

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

statedProbPctinteger

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

execution'paper' | 'kalshi' | 'poly-intl'

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.

op'create' | 'cancel' | 'amend'

Live only. Default create.

orderIdstring uuid

Live cancel or amend: the Kalshi order id.

priceCentsinteger

Live: the price of the side, in cents.

updatedPriceCentsinteger

Live amend: the new price of the side.

updatedCountinteger

Live amend: the new contract count.

Response

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

status'executed' | 'resting' | 'canceled' required

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

action'buy' | 'sell' required
type'market' | 'limit' required
idempotencyKeystring uuid required
replayedboolean required

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

originalCreatedAtstring date-time nullable required

On a replay: when the order was first placed.

fillVenue'kalshi' | 'novig' | 'polymarket' | 'null' nullable required

Where the fill was priced. Paper only: nothing is sent there. The first leg when the ticket split.

mode'paper' required
venueDataboolean required
fillPriceCentsinteger nullable

Only while the venue-data switch is on.

Changes

No recorded changes to this operation across all 1 revision of this API.