Place an order on the practice (demo) account of the signed-in user. It is a practice order: the money is virtual, and no real order is sent to a broker or an exchange — this server has no such path at all. Call it only on a direct request of the user, and tell the user that the account is a practice one. side is buy or sell. lots is the number of LOTS, not shares: one lot is lot_size shares (see positions in paper_portfolio_state or the order in the answer). order_type is market (the default) or limit; a limit order needs limit_price — the price per share in the base currency of the account, a multiple of the price step of the instrument — and a market order takes no limit_price. Stop orders are not available through this tool. The order is a day order: it expires at the close of the trading session it can trade in. To close a position, place a sell order for its lots (available_lots in paper_portfolio_state): there is no separate closing tool. Selling more than the account holds is refused (insufficient_position, short_not_allowed): short selling is switched off. How to read the answer: created is false when client_order_id already belonged to an order — that order is returned and nothing new is placed; executed is true only when the order is filled. An accepted order is NOT a trade. Under the realistic and strict execution profiles an order is accepted and fills later, on a background tick against the first stored quote that arrives after it was placed; while the market is closed or the last quote is stale it does not fill. order.status, order.pending_reason, order.status_explanation and execution_note say exactly which of these happened. Never report an accepted order as a completed trade: call paper_portfolio_state later. Pass client_order_id (any string up to 64 characters, one per order) to make a retry safe: a repeated call with the same client_order_id returns the same order. A refusal carries the code of the practice account, among them no_market_data, insufficient_cash, notional_too_small, price_step_invalid, max_open_orders, daily_order_limit, instrument_not_found, asset_class_unsupported (only shares and funds trade here), paper_account_not_found (the user has not opened a practice account, and only the user can) paper_order_limit_reached (the ceiling of orders an agent may place in 24 hours: at most half of the user's own daily limit) and paper_open_order_limit_reached (too many orders placed by an agent are still open; an agent has no tool to cancel an order — the user cancels them in the account). If the call fails with a server error, the order may still have been placed: before repeating it, check paper_portfolio_state or repeat with the same client_order_id. This changes the user's practice account: the order appears there at once, marked as placed by an agent. Needs the paper permission of the sign-in.