> ## Documentation Index
> Fetch the complete documentation index at: https://developers.redo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# pickSession

> Fetch a single pick session by its id, or by the legacy Mongo ObjectId shown in the Redo app.

**Required scopes:** [`pick_sessions_read`](/docs/api-reference/v3/reference/scopes#scope-pick_sessions_read)

## Arguments

<ResponseField name="id" type="ID!" required>
  The id of the pick session: a branded Redo id or a 24-char Mongo ObjectId hex.
</ResponseField>

## Returns

<ResponseField name="pickSession" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session">PickSession</a>}>
  A batch of orders a warehouse picker collects in one trip, with the lines to pick.

  <Expandable title="fields" lazyRender>
    <ResponseField name="assignedBy" type={<a href="/docs/api-reference/v3/reference/shipping/warehouse-team-member">WarehouseTeamMember</a>}>
      The team member who queued the session for its picker. Null when the picker created it themselves.

      **Requires:** [`pick_sessions_read`](/docs/api-reference/v3/reference/scopes#scope-pick_sessions_read)

      <Expandable title="fields" lazyRender>
        <ResponseField name="email" type="String">
          Email address of the team member.
        </ResponseField>

        <ResponseField name="name" type="String">
          Display name of the team member. Null when the user has no name set.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="completedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
      When the session was completed.
    </ResponseField>

    <ResponseField name="consolidatedInto" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session">PickSession</a>}>
      Zone picking: the session this one's items were moved into, when its status is CONSOLIDATED.

      **Requires:** [`pick_sessions_read`](/docs/api-reference/v3/reference/scopes#scope-pick_sessions_read)
    </ResponseField>

    <ResponseField name="continuedFrom" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session">PickSession</a>}>
      Zone picking: the upstream session whose leftover items started this one.

      **Requires:** [`pick_sessions_read`](/docs/api-reference/v3/reference/scopes#scope-pick_sessions_read)
    </ResponseField>

    <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
      When the session was created.
    </ResponseField>

    <ResponseField name="filterName" type="String">
      The name of the saved pick filter the session was built from, if any.
    </ResponseField>

    <ResponseField name="id" type="ID!" required>
      The id of this pick session.
    </ResponseField>

    <ResponseField name="inventorySource" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session-inventory-source">PickSessionInventorySource!</a>} required>
      Which stock the session draws from.
    </ResponseField>

    <ResponseField name="items" type={<a href="/docs/api-reference/v3/pagination">PickSessionItemConnection!</a>} required>
      The session's active lines in pick order. Archived lines after a split are omitted; session totals still include them.

      **Requires:** [`pick_sessions_read`](/docs/api-reference/v3/reference/scopes#scope-pick_sessions_read)

      <Expandable title="fields" lazyRender>
        **Arguments**

        <ResponseField name="after" type="String">
          Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
        </ResponseField>

        <ResponseField name="before" type="String">
          Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
        </ResponseField>

        <ResponseField name="first" type="Int">
          Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
        </ResponseField>

        <ResponseField name="last" type="Int">
          Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
        </ResponseField>

        **Fields**

        <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[PickSessionItemEdge!]!</a>} required>
          The list of edges (each a node plus its pagination `cursor`).

          <Expandable title="fields" lazyRender>
            <ResponseField name="cursor" type="String!" required>
              Opaque cursor for this item; pass to `after`/`before` to page from here.
            </ResponseField>

            <ResponseField name="node" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session-item">PickSessionItem!</a>} required>
              The item at this edge.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session-item">[PickSessionItem!]!</a>} required>
          The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.

          <Expandable title="fields" lazyRender>
            <ResponseField name="barcode" type="String">
              The barcode a picker scans for this item.
            </ResponseField>

            <ResponseField name="bin" type="String">
              The name of the bin to pick from. Null when no bin holds the stock.
            </ResponseField>

            <ResponseField name="expirationDate" type={<a href="/docs/api-reference/v3/reference/common/date">Date</a>}>
              The expiration date of the lot to pick. Null when the lot has no expiration set.
            </ResponseField>

            <ResponseField name="lotNumber" type="String">
              The lot to pick, for lot-tracked products.
            </ResponseField>

            <ResponseField name="orderName" type="String">
              The name of the order this line belongs to, e.g. #1001.
            </ResponseField>

            <ResponseField name="productTitle" type="String!" required>
              The product's title.
            </ResponseField>

            <ResponseField name="quantity" type="Int!" required>
              Units of this line to pick.
            </ResponseField>

            <ResponseField name="quantityOutOfStock" type="Int!" required>
              Units the picker marked out of stock.
            </ResponseField>

            <ResponseField name="quantityPicked" type="Int!" required>
              Units picked so far.
            </ResponseField>

            <ResponseField name="sku" type="String">
              The SKU to pick.
            </ResponseField>

            <ResponseField name="variantTitle" type="String!" required>
              The variant's title.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
          Pagination metadata for the current page.

          <Expandable title="fields" lazyRender>
            <ResponseField name="endCursor" type="String">
              Cursor of the last edge in this page; pass to `after` to page forward.
            </ResponseField>

            <ResponseField name="hasNextPage" type="Boolean!" required>
              Whether more items exist after this page (drives forward pagination with `first`/`after`).
            </ResponseField>

            <ResponseField name="hasPreviousPage" type="Boolean!" required>
              Whether more items exist before this page (drives backward pagination with `last`/`before`).
            </ResponseField>

            <ResponseField name="startCursor" type="String">
              Cursor of the first edge in this page; pass to `before` to page backward.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="legacyId" type="String!" required>
      The pick session's legacy Mongo ObjectId (24-char hex), as shown in the Redo app's URLs.
    </ResponseField>

    <ResponseField name="location" type={<a href="/docs/api-reference/v3/reference/inventory/location">Location</a>}>
      The warehouse the session picks from. Null if unset or no longer readable.

      **Requires:** [`locations_read`](/docs/api-reference/v3/reference/scopes#scope-locations_read)

      <Expandable title="fields" lazyRender>
        <ResponseField name="city" type="String">
          The city of the location's address.
        </ResponseField>

        <ResponseField name="company" type="String">
          The company name associated with the location.
        </ResponseField>

        <ResponseField name="countryCode" type="String">
          The country code, e.g. "US".
        </ResponseField>

        <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When the record was created.
        </ResponseField>

        <ResponseField name="id" type="ID!" required>
          The id of this location.
        </ResponseField>

        <ResponseField name="inventoryItems" type={<a href="/docs/api-reference/v3/pagination">InventoryItemConnection!</a>} required>
          Traceable inventory units at this warehouse.

          **Requires:** [`inventory_read`](/docs/api-reference/v3/reference/scopes#scope-inventory_read)

          <Expandable title="fields" lazyRender>
            **Arguments**

            <ResponseField name="after" type="String">
              Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
            </ResponseField>

            <ResponseField name="before" type="String">
              Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
            </ResponseField>

            <ResponseField name="first" type="Int">
              Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
            </ResponseField>

            <ResponseField name="last" type="Int">
              Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
            </ResponseField>

            **Fields**

            <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[InventoryItemEdge!]!</a>} required>
              The list of edges (each a node plus its pagination `cursor`).
            </ResponseField>

            <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/inventory/inventory-item">[InventoryItem!]!</a>} required>
              The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.
            </ResponseField>

            <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
              Pagination metadata for the current page.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="inventoryLevels" type={<a href="/docs/api-reference/v3/pagination">LocationInventoryLevelConnection!</a>} required>
          Per-product inventory levels held at this location.

          **Requires:** [`inventory_read`](/docs/api-reference/v3/reference/scopes#scope-inventory_read)

          <Expandable title="fields" lazyRender>
            **Arguments**

            <ResponseField name="after" type="String">
              Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
            </ResponseField>

            <ResponseField name="before" type="String">
              Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
            </ResponseField>

            <ResponseField name="first" type="Int">
              Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
            </ResponseField>

            <ResponseField name="last" type="Int">
              Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
            </ResponseField>

            **Fields**

            <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[LocationInventoryLevelEdge!]!</a>} required>
              The list of edges (each a node plus its pagination `cursor`).
            </ResponseField>

            <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/inventory/location-inventory-level">[LocationInventoryLevel!]!</a>} required>
              The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.
            </ResponseField>

            <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
              Pagination metadata for the current page.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="name" type="String!" required>
          The location's display name.
        </ResponseField>

        <ResponseField name="phone" type="String">
          The contact phone number for the location.
        </ResponseField>

        <ResponseField name="postalCode" type="String">
          The postal or ZIP code, e.g. "84101".
        </ResponseField>

        <ResponseField name="stateCode" type="String">
          The state or province code, e.g. "UT".
        </ResponseField>

        <ResponseField name="storageLocations" type={<a href="/docs/api-reference/v3/pagination">StorageLocationConnection!</a>} required>
          Bins and other storage locations within this warehouse.

          **Requires:** [`locations_read`](/docs/api-reference/v3/reference/scopes#scope-locations_read)

          <Expandable title="fields" lazyRender>
            **Arguments**

            <ResponseField name="after" type="String">
              Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
            </ResponseField>

            <ResponseField name="before" type="String">
              Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
            </ResponseField>

            <ResponseField name="first" type="Int">
              Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
            </ResponseField>

            <ResponseField name="last" type="Int">
              Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
            </ResponseField>

            **Fields**

            <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[StorageLocationEdge!]!</a>} required>
              The list of edges (each a node plus its pagination `cursor`).
            </ResponseField>

            <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/inventory/storage-location">[StorageLocation!]!</a>} required>
              The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.
            </ResponseField>

            <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
              Pagination metadata for the current page.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="street1" type="String">
          The first line of the street address.
        </ResponseField>

        <ResponseField name="street2" type="String">
          The second line of the street address.
        </ResponseField>

        <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When the record was last updated.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="orderCount" type="Int!" required>
      How many orders the session holds, including orders on archived lines.
    </ResponseField>

    <ResponseField name="pickedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
      When picking finished.
    </ResponseField>

    <ResponseField name="picker" type={<a href="/docs/api-reference/v3/reference/shipping/warehouse-team-member">WarehouseTeamMember</a>}>
      The team member picking the session. Null before someone claims it or when the user no longer exists.

      **Requires:** [`pick_sessions_read`](/docs/api-reference/v3/reference/scopes#scope-pick_sessions_read)

      <Expandable title="fields" lazyRender>
        <ResponseField name="email" type="String">
          Email address of the team member.
        </ResponseField>

        <ResponseField name="name" type="String">
          Display name of the team member. Null when the user has no name set.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="printedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
      When labels for the session's orders were printed.
    </ResponseField>

    <ResponseField name="quantityOutOfStock" type="Int!" required>
      Units marked out of stock across every line, including archived lines.
    </ResponseField>

    <ResponseField name="quantityPicked" type="Int!" required>
      Units picked so far across every line, including archived lines.
    </ResponseField>

    <ResponseField name="scanType" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session-scan-type">PickSessionScanType!</a>} required>
      Where picked items are scanned and sorted into orders.
    </ResponseField>

    <ResponseField name="status" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session-status">PickSessionStatus!</a>} required>
      Where the session is in its lifecycle.
    </ResponseField>

    <ResponseField name="strategy" type={<a href="/docs/api-reference/v3/reference/shipping/pick-session-strategy">PickSessionStrategy!</a>} required>
      How orders were grouped into the session.
    </ResponseField>

    <ResponseField name="totalQuantity" type="Int!" required>
      Units to pick across every line, including archived lines.
    </ResponseField>

    <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
      When the session last changed.
    </ResponseField>
  </Expandable>
</ResponseField>

## Example

```graphql theme={null}
query {
  pickSession(id: "...") {
    completedAt
    createdAt
    filterName
    id
    inventorySource
    items {
      nodes {
        barcode
        bin
        expirationDate
        lotNumber
        orderName
        productTitle
        quantity
        quantityOutOfStock
        # ...
      }
      pageInfo { hasNextPage endCursor }
    }
    legacyId
    orderCount
    # ...
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.