## Preview Orders

`client.V1.Orders.PreviewOrders(ctx, accountID, body) (*V1OrderPreviewOrdersResponse, error)`

**post** `/v1/accounts/{account_id}/orders/preview`

Preview the impact of orders without submitting them. For each order the
engine evaluates every pre-trade risk check and projects the account's
balances and positions as if the order were fully filled — at the limit
price for limit orders and at the current reference price for market
orders. Orders are evaluated independently: they do not see each other's
projected fills. Nothing is submitted and no account state changes.

The response carries one result per requested order, in request order.
When the request contains more than one order, every order must carry a
unique `id`, which is echoed on its result. An order that cannot be
previewed gets an `error` on its own result without affecting the rest of
the batch; the response is still `200 OK` — per-order outcomes live only
in the rows, and non-2xx statuses are reserved for request-level failures
(invalid batch, authorization, engine unavailable).

### Parameters

- `accountID int64`

- `body V1OrderPreviewOrdersParams`

  - `Preview param.Field[[]NewOrderRequest]`

    - `OrderType RequestOrderType`

      Type of order

      - `const RequestOrderTypeMarket RequestOrderType = "MARKET"`

      - `const RequestOrderTypeLimit RequestOrderType = "LIMIT"`

      - `const RequestOrderTypeStop RequestOrderType = "STOP"`

      - `const RequestOrderTypeStopLimit RequestOrderType = "STOP_LIMIT"`

      - `const RequestOrderTypeTrailingStop RequestOrderType = "TRAILING_STOP"`

      - `const RequestOrderTypeTrailingStopLimit RequestOrderType = "TRAILING_STOP_LIMIT"`

    - `Quantity string`

      Quantity to trade. For COMMON_STOCK: shares (may be fractional if supported).
      For OPTION (single-leg): contracts (must be an integer)

    - `Side Side`

      Side of the order

      - `const SideBuy Side = "BUY"`

      - `const SideSell Side = "SELL"`

    - `TimeInForce RequestTimeInForce`

      Time in force

      - `const RequestTimeInForceDay RequestTimeInForce = "DAY"`

      - `const RequestTimeInForceGoodTillCancel RequestTimeInForce = "GOOD_TILL_CANCEL"`

      - `const RequestTimeInForceImmediateOrCancel RequestTimeInForce = "IMMEDIATE_OR_CANCEL"`

      - `const RequestTimeInForceFillOrKill RequestTimeInForce = "FILL_OR_KILL"`

      - `const RequestTimeInForceGoodTillDate RequestTimeInForce = "GOOD_TILL_DATE"`

      - `const RequestTimeInForceAtOpen RequestTimeInForce = "AT_OPEN"`

      - `const RequestTimeInForceAtClose RequestTimeInForce = "AT_CLOSE"`

    - `ID string`

      Optional client-provided unique ID (idempotency). Required to be unique per account.

    - `ExpiresAt Time`

      The timestamp when the order should expire (UTC). Required when time_in_force is GOOD_TILL_DATE.

    - `ExtendedHours bool`

      Allow trading outside regular trading hours. Some brokers disallow options outside RTH.

    - `InstrumentID InstrumentIDOrSymbol`

      Instrument ID (UUID) or symbol (equity ticker or OSI option symbol). Either `symbol` or `instrument_id` must be provided.

    - `LimitOffset string`

      Limit offset for trailing stop-limit orders (signed)

    - `LimitPrice string`

      Limit price (required for LIMIT and STOP_LIMIT orders)

    - `PositionIntent RequestPositionEffect`

      Optional open/close intent for this order. When omitted, the platform
      determines the position effect.

      - `const RequestPositionEffectOpen RequestPositionEffect = "OPEN"`

      - `const RequestPositionEffectClose RequestPositionEffect = "CLOSE"`

    - `StopPrice string`

      Stop price (required for STOP and STOP_LIMIT orders)

    - `Strategy OrderStrategyUnion`

      Optional execution strategy. One of `SOR`, `VWAP`, `TWAP`, or `DMA`. Defaults
      to `SOR`, the only strategy OTC common-stock orders support. `VWAP` and `TWAP`
      are supported only on `MARKET` and `LIMIT` orders, and `DMA` only on `LIMIT`
      orders; all three require `DAY` time-in-force. `VWAP`, `TWAP`, and `DMA` do
      not support `extended_hours`.

      - `type OrderStrategyType struct{…}`

        Smart Order Router. Routes the order to the best available venue(s).

        - `Type string`

          Execution strategy type.

          - `const OrderStrategyTypeTypeSor OrderStrategyTypeType = "SOR"`

      - `type OrderStrategyObject struct{…}`

        Volume-Weighted Average Price. Works the order to track the volume-weighted average price over the execution window.

        - `Type string`

          Execution strategy type.

          - `const OrderStrategyObjectTypeVwap OrderStrategyObjectType = "VWAP"`

        - `EndAt Time`

          UTC timestamp (RFC 3339) by which to finish working the order. Defaults to market close.

        - `StartAt Time`

          UTC timestamp (RFC 3339) at which to begin working the order. Defaults to the time the order is received.

      - `type OrderStrategyObject2 struct{…}`

        Time-Weighted Average Price. Spreads execution evenly across the execution window.

        - `Type string`

          Execution strategy type.

          - `const OrderStrategyObject2TypeTwap OrderStrategyObject2Type = "TWAP"`

        - `EndAt Time`

          UTC timestamp (RFC 3339) by which to finish working the order. Defaults to market close.

        - `StartAt Time`

          UTC timestamp (RFC 3339) at which to begin working the order. Defaults to the time the order is received.

      - `type OrderStrategyObject3 struct{…}`

        Direct Market Access. Routes the order straight to the named venue.

        - `Destination string`

          Venue code the order is routed to.

        - `Type string`

          Execution strategy type.

          - `const OrderStrategyObject3TypeDma OrderStrategyObject3Type = "DMA"`

    - `Symbol string`

      Trading symbol. For equities, use the ticker symbol (e.g., "TSLA").
      For options, use the OSI symbol (e.g., "TSLA  250117C00190000").
      Either `symbol` or `instrument_id` must be provided.

    - `TrailingOffset string`

      Trailing offset amount (required for trailing orders)

    - `TrailingOffsetType TrailingOffsetType`

      Trailing offset type (PRICE or PERCENT_BPS)

      - `const TrailingOffsetTypePrice TrailingOffsetType = "PRICE"`

      - `const TrailingOffsetTypeBps TrailingOffsetType = "BPS"`

### Returns

- `type V1OrderPreviewOrdersResponse struct{…}`

  - `Data OrderPreviewEntryList`

    - `type OrderPreviewEntryObject struct{…}`

      The order was previewed successfully.

      - `Preview OrderPreview`

        The projected impact of the order.

        - `AccountID int64`

          The account the order was previewed for.

        - `Amount OrderPreviewAmount`

          Monetary size of the previewed order.

          - `GrossAmount string`

            Total cash impact of the order before estimated fees and commissions.

          - `NetAmount string`

            Total cash impact of the order after estimated fees and commissions.

        - `BuyingPower OrderPreviewDelta`

          Buying power before and after the order.

          - `After string`

            The value with the previewed order also fully filled.

          - `Before string`

            The value before the order, as the risk engine evaluates it: the
            account's open orders are projected as filled.

          - `Change string`

            The previewed order's isolated impact: `after - before`.

        - `Currency string`

          Currency for all monetary values.

        - `Equity OrderPreviewDelta`

          Account equity before and after the order.

        - `Errors []OrderPreviewError`

          Risk-check errors that would prevent the order from being
          accepted. Empty when the order would pass every pre-trade risk check.

          - `Description string`

            Human-readable description of the error.

          - `Metadata map[string, string]`

            Structured details for the error (stringified values), e.g.
            required and available amounts, and `leg_index`/`leg_symbol` for
            multileg leg errors.

          - `Type string`

            Stable error code.

        - `MarginDetails OrderPreviewMarginDetails`

          Margin requirements and excess before and after the order.

          - `InitialMarginExcess OrderPreviewDelta`

            Initial margin excess.

          - `InitialMarginRequirement OrderPreviewDelta`

            Initial margin requirement.

          - `MaintenanceMarginExcess OrderPreviewDelta`

            Maintenance margin excess.

          - `MaintenanceMarginRequirement OrderPreviewDelta`

            Maintenance margin requirement.

          - `OvernightMarginExcess OrderPreviewDelta`

            Overnight margin excess.

          - `OvernightMarginRequirement OrderPreviewDelta`

            Overnight margin requirement.

        - `Positions []OrderPreviewPosition`

          Positions in the traded instruments before and after the order.

          - `InstrumentID string`

            The instrument's identifier.

          - `Quantity OrderPreviewDelta`

            Net position quantity before and after the order.

          - `Symbol string`

            The instrument's symbol.

      - `ID string`

        The client-provided `id` of the order this entry belongs to, echoed
        from the request. Always present when the request contains more than
        one order, since ids are required there.

    - `type OrderPreviewEntryObject2 struct{…}`

      The order could not be previewed. Shaped exactly like the top-level
      `error` object on rejected submissions.

      - `Error APIError`

        Why this order's preview failed.

        - `Code int64`

          The error code is used to identify the nature of the error. It corresponds
          to an HTTP status code.

        - `Message string`

          A human-readable message providing more details about the error.

        - `Details []map[string, any]`

          Additional error details, if any. This can include structured information
          such as field violations or error metadata.

      - `ID string`

        The client-provided `id` of the order this entry belongs to, echoed
        from the request. Always present when the request contains more than
        one order, since ids are required there.

### Example

```go
package main

import (
  "context"
  "fmt"

  "github.com/clear-street/clear-street-go"
  "github.com/clear-street/clear-street-go/option"
)

func main() {
  client := clearstreet.NewClient(
    option.WithAPIKey("My API Key"),
  )
  response, err := client.V1.Orders.PreviewOrders(
    context.TODO(),
    0,
    clearstreet.V1OrderPreviewOrdersParams{
      Preview: []clearstreet.NewOrderRequestParam{clearstreet.NewOrderRequestParam{
        OrderType: clearstreet.RequestOrderTypeLimit,
        Quantity: "100",
        Side: clearstreet.SideBuy,
        TimeInForce: clearstreet.RequestTimeInForceDay,
      }, clearstreet.NewOrderRequestParam{
        OrderType: clearstreet.RequestOrderTypeLimit,
        Quantity: "10",
        Side: clearstreet.SideBuy,
        TimeInForce: clearstreet.RequestTimeInForceDay,
      }},
    },
  )
  if err != nil {
    panic(err.Error())
  }
  fmt.Printf("%+v\n", response)
}
```

#### Response

```json
{
  "data": [
    {
      "id": "preview-1",
      "preview": {
        "account_id": 19816,
        "amount": {
          "gross_amount": "10000.00",
          "net_amount": "10000.00"
        },
        "buying_power": {
          "after": "190000.00",
          "before": "200000.00",
          "change": "-10000.00"
        },
        "currency": "USD",
        "equity": {
          "after": "100000.00",
          "before": "100000.00",
          "change": "0.00"
        },
        "errors": [],
        "margin_details": {
          "initial_margin_excess": {
            "after": "95000.00",
            "before": "100000.00",
            "change": "-5000.00"
          },
          "initial_margin_requirement": {
            "after": "5000.00",
            "before": "0.00",
            "change": "5000.00"
          },
          "maintenance_margin_excess": {
            "after": "97500.00",
            "before": "100000.00",
            "change": "-2500.00"
          },
          "maintenance_margin_requirement": {
            "after": "2500.00",
            "before": "0.00",
            "change": "2500.00"
          },
          "overnight_margin_excess": {
            "after": "95000.00",
            "before": "100000.00",
            "change": "-5000.00"
          },
          "overnight_margin_requirement": {
            "after": "5000.00",
            "before": "0.00",
            "change": "5000.00"
          }
        },
        "positions": [
          {
            "instrument_id": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
            "quantity": {
              "after": "100",
              "before": "0",
              "change": "100"
            },
            "symbol": "AAPL"
          }
        ]
      }
    },
    {
      "error": {
        "code": 400,
        "message": "Security not found: BADSYM"
      },
      "id": "preview-2"
    }
  ],
  "metadata": {
    "request_id": "d3e5b1a2-8c4f-4b6e-9d2a-1f0c9b8a7654"
  }
}
```
