---
title: "Admin Orders Place"
method: POST
path: "/api/admin/schwab/orders/place"
tags: ["admin"]
---

# Admin Orders Place

`POST /api/admin/schwab/orders/place`

## Request

- Base URL: `https://api.equity-rank.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.equity-rank.com/api/admin/schwab/orders/place`
- Auth: HTTP bearer

Place a Schwab order with full audit trail.

Append-only flow:
  1. INSERT row state=DRAFT (intent captured before any network call)
  2. Build Schwab payload via build_order_payload
  3. Call schwab_service.place_order
     - On 2xx → INSERT row state=SENT (with schwab_order_id) → 200 to caller
     - On 4xx → INSERT row state=REJECTED (with reason)       → 400 to caller
     - On 401/403 (SchwabAuthExpiredError) → INSERT REJECTED  → 401 to caller

ORDER-01: admin-only endpoint + UI confirmation gate
ORDER-02: immutable audit log — every transition is a new INSERT
ORDER-05: full Schwab order type set (MARKET / LIMIT in 23-01,
          STOP / STOP_LIMIT in 23-02, TRAILING_STOP in 23-03)

## Request body

- PlaceOrderRequest: Request body for POST /api/admin/schwab/orders/place. Validates required price/offset fields per order_type at the FastAPI 422 layer, before any Schwab call.
  - `account_hash` string, required
  - `symbol` string, required
  - `side` string, required
  - `quantity` number, required
  - `order_type` 'MARKET' | 'LIMIT' | 'STOP' | 'STOP_LIMIT' | 'TRAILING_STOP', required
  - `asset_type` 'EQUITY' | 'OPTION'
  - `limit_price` number, nullable
  - `stop_price` number, nullable
  - `trailing_offset` number, nullable
  - `trailing_basis` 'PERCENT' | 'VALUE'

## Response `200`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/equity-rank/apis/equity-rank-api.md) · [All operations](https://skmtc.dev/equity-rank/apis/equity-rank-api/llms.txt) · [OpenAPI document](https://skmtc.dev/equity-rank/apis/equity-rank-api/revisions/c2f2463fee33?raw)
