---
title: "Picks a sales order's pick transfer — all of it (the app's \"Pick All\") or given units per line (the scan dialog)."
method: POST
path: "/api/v1/sales-orders/{id}/pick"
tags: ["SalesOrders"]
---

# Picks a sales order's pick transfer — all of it (the app's "Pick All") or given units per line (the scan dialog).

`POST /api/v1/sales-orders/{id}/pick`

## Request

- Base URL: `https://app.flexonthejob.com`
- URL: `https://app.flexonthejob.com/api/v1/sales-orders/{id}/pick`
- Auth: HTTP bearer

Requires `ManageSalesOrders` and an `Idempotency-Key` header. Body optional:
`{}` or no body picks every line of the order's single `Pending` transfer in
full; `{ "transferId": 904, "lines": [ { "transferItemId": 5120, "quantity": 2 } ] }`
adds 2 to that transfer line's picked count (line ids: `lines[].id` of
`GET /api/v1/transfers/{transferId}`). Same code path as the app's transfer scan
dialog: the transfer line is stamped scanned by the key's creator and the order line's
`quantityPicked` rises by the same units. Every line is checked before anything is
written. Picking moves no stock and does not change the order's `status`; call
`/complete-pick` once every line is picked. Repeating a full pick is harmless; a
partial pick sent again with a new `Idempotency-Key` picks those units again.

## Path parameters

- `id` integer, required

## Request body

- PickSalesOrderApiRequest: Body of `POST /api/v1/sales-orders/{id}/pick`. Example (pick everything): `{ "transferId": 904 }`; example (part of one line): `{ "transferId": 904, "lines": [ { "transferItemId": 5120, "quantity": 2 } ] }`.
  - `transferId` integer, nullable: The order's Pending pick transfer to pick (the `transferId` returned by `/fulfill`). Omit when the order has exactly one Pending transfer. Example: `904`.
  - `lines` PickSalesOrderLineApiRequest[], nullable: Units to pick per transfer line, 1–500 entries. Omit (or send an empty list) to pick every line in full — the app's "Pick All". Each entry adds `quantity` to the line's picked count; every entry is checked before anything is written.
    - `transferItemId` integer: Transfer line id: `lines[].id` of `GET /api/v1/transfers/{transferId}`. Example: `5120`.
    - `quantity` integer: Units to add to the line's picked count, from 1 up to the units still unpicked on the line (`quantity` − `quantityPicked`; more is 422). Example: `2`.

## Response `200`

Picked; `unitsPicked` says how many units this call picked.

- SalesOrderStepResponse: Response of the sales-order fulfilment steps (`/pick`, `/complete-pick`, `/ship`, `/deliver`, `/complete`, `/cancel`).
  - `salesOrderId` integer: The sales order's id. Example: `318`.
  - `status` string: Order status after the step: `Pending`, `Picking`, `Packed`, `Shipped`, `Delivered`, `Complete` or `Cancelled`. Recalculated from the order's transfers, so always read it rather than assuming the next status. Example: `Packed`.
  - `fulfillmentStatus` string, nullable: Aggregate status of the order's transfers (`None`, `Pending`, `InTransit`, `AtWaypoint`, `Completed`, `Cancelled`…), as `fulfillmentStatus` on the order. Example: `InTransit`.
  - `transferId` integer, nullable: The transfer the step acted on (resolved when the request did not name one); null for `/complete` and `/cancel`. Example: `904`.
  - `message` string, nullable: Human-readable confirmation, as the app shows it. Example: `Transfer status updated to In Transit.`
  - `unitsPicked` integer: `/pick`: units marked picked by this call (0 for other steps). Example: `10`.
  - `itemsReturned` integer: `/cancel`: delivered units returned to inventory (0 for other steps). Example: `0`.
  - `transfersCancelled` integer: `/cancel`: transfers cancelled (0 for other steps). Example: `1`.

## Other responses

- `400`: Missing `Idempotency-Key` or a malformed body.
- `401`: Unauthorized
- `403`: Forbidden
- `404`: No such sales order in this organization, or `transferId` is not one of its transfers.
- `409`: The transfer is not `Pending`, the order has no `Pending` transfer, or the key's creator is unknown on this server.
- `422`: The order has several `Pending` transfers and `transferId` was omitted, or a line is not on the transfer, repeated, Returned/Failed, or asks for more units than are left to pick (field listed in `errors`). Nothing was picked.
- `429`: Too Many Requests

---

[API](https://skmtc.dev/flexonthejob/apis/flex-api.md) · [All operations](https://skmtc.dev/flexonthejob/apis/flex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/flexonthejob/apis/flex-api/revisions/19c8f4d27acf?raw)
