---
title: "Get Position Instructions"
method: GET
path: "/v1/accounts/{account_id}/positions/instructions"
tags: ["Positions"]
---

# Get Position Instructions

`GET /v1/accounts/{account_id}/positions/instructions`

## Request

- Base URL: `https://api.clearstreet.com`
- URL: `https://api.clearstreet.com/v1/accounts/{account_id}/positions/instructions`
- Auth: HTTP bearer

Returns the current lifecycle state of the account's position
instructions. Optionally filter by a specific contract.

Note: instructions that fail pre-acceptance validation on `POST` —
duplicates, `DO_NOT_EXERCISE` / `CONTRARY_EXERCISE` on a non-expiry day,
insufficient position, or an unresolvable instrument — are rejected
(with `status = REJECTED` and a `rejection_reason`) without being
persisted, so they surface only in the `POST` response and never appear
in this list.

## Path parameters

- `account_id` integer, required

## Query parameters

- `instrument_id` string: Instrument identifier: either an instrument UUID or a symbol (symbol for equities, OSI for options). Non-UUID inputs are resolved server-side.
- `underlying_instrument_id` string: Instrument identifier: either an instrument UUID or a symbol (symbol for equities, OSI for options). Non-UUID inputs are resolved server-side.

## Response `200`

Position instructions

- object
  - `error` ApiError: A direct mapping of tonic::Status, for use in HTTP responses.
    - `code` integer, required: The error code is used to identify the nature of the error. It corresponds to an HTTP status code.
    - `details` object[]
    - `message` string, required: A human-readable message providing more details about the error.
  - `metadata` ResponseMetadata, required: Metadata for the response. This will always contain a request ID which can be used to identify the request to Clear Street for tracing, and optionally may include pagination data.
    - `next_page_token` string, byte, nullable: Base64URL-encoded pagination token
    - `page_number` integer, nullable: Pagination. Included if this was a GET (list) response
    - `previous_page_token` string, byte, nullable: Base64URL-encoded pagination token
    - `request_id` string, required: A unique ID for this request, generated upon ingestion of the request.
    - `total_items` integer, nullable: Total number of items available (not just in this page).
    - `total_pages` integer, nullable: Total number of pages available.
  - `data` PositionInstruction[], required
    - `accepted_quantity` string, nullable: Number of contracts accepted by the clearing venue. Populated once the instruction reaches `ACCEPTED`. When a null/undefined value is observed, it indicates that there is no available data.
    - `account_id` integer, required
    - `client_instruction_id` string, required: Caller-supplied idempotency key echoed from the submit request; the server-assigned fallback when none was supplied.
    - `created_at` string, date-time, nullable: When the instruction was first accepted by the service. When a null/undefined value is observed, it indicates that there is no available data.
    - `id` string, uuid, required: Server-assigned id. Used as the path parameter on cancel.
    - `instruction_type` 'EXERCISE' | 'DO_NOT_EXERCISE' | 'CONTRARY_EXERCISE', required: The action to take against an options position.
    - `instrument_id` string, uuid, required: Identifier of the options contract this instruction acts on.
    - `quantity` string, required: Number of contracts included in the instruction.
    - `rejection` PositionInstructionRejection: Machine-readable detail for a rejected position instruction. Present on every rejected row, across the full lifecycle — submit, cancel, get, and list. Branch on `reason` for programmatic handling and template your own copy from `metadata`, or show `description` directly.
      - `description` string, required: Human-readable explanation of the rejection. Duplicates the top-level `rejection_reason`; prefer this field.
      - `domain` string, required: Namespacing domain of the `reason` code — `com.clearstreet.oems.exercise` for reasons OEMS validates, `com.clearstreet.oems.clearing` for clearing-owned reasons.
      - `metadata` object, required: Reason-specific parameters as a string→string map. Which keys are present depends on `reason`: - `INSUFFICIENT_POSITION` → `available`, `requested` - `DNE_NOT_ON_EXPIRY` / `CEA_NOT_ON_EXPIRY` → `expiry`, `business_date` - `EXERCISE_PAST_CUTOFF` → `cutoff_time` - `DUPLICATE_INSTRUCTION` → `existing_id` Empty for reasons that carry no parameters. New keys may be added over time, so treat unknown keys leniently.
      - `reason` string, required: Stable, machine-readable reason code, e.g. `DNE_NOT_ON_EXPIRY`, `INSUFFICIENT_POSITION`, `OPTIONS_LEVEL_EXCEEDED`, `EXERCISE_PAST_CUTOFF`.
    - `rejection_reason` string, nullable: Human-readable explanation populated on any non-success terminal status — `REJECTED` or `CANCEL_FAILED`. On a `207 Multi-Status` batch submit the top-level `error` field summarizes the batch; per-row detail continues to live here. When a null/undefined value is observed, it indicates it does not apply.
    - `status` 'SENT' | 'ACCEPTED' | 'REJECTED' | 'CANCEL_REQUESTED' | 'CANCELLED' | 'CANCEL_FAILED' | 'UNKNOWN', required: Lifecycle status of a position instruction. - `SENT`: accepted and submitted to the clearing venue. - `ACCEPTED`: terminal — accepted by the clearing venue. - `REJECTED`: terminal rejection; `rejection_reason` carries the detail. Covers both venue-reported rejections and rejections raised before the instruction reached the clearing venue (e.g. duplicate `client_instruction_id`, `DO_NOT_EXERCISE` / `CONTRARY_EXERCISE` submitted on a non-expiry day, insufficient position, or an instrument that does not resolve). - `CANCEL_REQUESTED`: cancel accepted; final cancel state pending. - `CANCELLED`: terminal — cancel completed. - `CANCEL_FAILED`: cancel could not be completed; operator attention required. `rejection_reason` carries the detail. - `UNKNOWN`: status could not be determined.
    - `symbol` string, required: Options symbol (OSI) for display.
    - `underlying_instrument_id` string, uuid, nullable: Identifier of the underlying instrument, when available. When a null/undefined value is observed, it indicates it does not apply.
    - `updated_at` string, date-time, nullable: When the instruction's lifecycle state last changed. When a null/undefined value is observed, it indicates that there is no available data.

## Other responses

- `400`: Invalid query parameters
- `403`: Forbidden
- `404`: Account or instrument not found
- `503`: Service temporarily unavailable

## Changes

- **2026-10-16** `1bd9eddeffc8`: 2 breaking, 5 info
  - for the `query` request parameter `instrument_id`, the minLength was increased from `0` to `1`
  - removed the required property `allOf[subschema #2]/data/items/instruction_id` from the response with the `200` status
  - added the new optional `query` request parameter `underlying_instrument_id`
  - for the `query` request parameter `instrument_id`, the type was generalized from no type to `string`
  - …3 more
- **2026-06-10** `99644beba9d7`: 1 info
  - removed the `ENGINE_REJECTED` enum value from the `allOf[subschema #2]/data/items/status` response property for the response status `200`
- **2026-05-18** `5eb49008c06f`: 1 warning
  - removed the optional property `allOf[subschema #2]/data/items/error` from the response with the `200` status

[Operation history](https://skmtc.dev/clear-street/apis/clear-street-trading-api/changes/v1/accounts/:account_id/positions/instructions/get.md)

---

[API](https://skmtc.dev/clear-street/apis/clear-street-trading-api.md) - [All operations](https://skmtc.dev/clear-street/apis/clear-street-trading-api/llms.txt) - [OpenAPI document](https://skmtc.dev/clear-street/apis/clear-street-trading-api/revisions/52e77ea7d731?raw)
