# Lê uma OS, com a origem e as paradas

**GET** `/v1/objects/work-order/{id}`

`origin.type` diz de onde a OS nasceu: `receipt` (a nota), `replenishment` (a reposição), `wave` (a onda) ou `manual`. Cada parada diz o item, a posição, o esperado e o feito; numa conferência às cegas, `qty_expected` é nulo para quem confere.

> **Ação da chave: `work_order.get`** Quem cria a chave escolhe as ações que ela abre; sem esta, a rota recusa com `api_key_action_not_granted`.

## Parâmetros do caminho

- `id` (string, obrigatório)

## Devolve

O `data` do envelope `{ ok, data, error, error_code, field, trace_id }`:

- `stops` (lista de objeto, obrigatório)
  - `closed` (boolean)
  - `closed_at` (data e hora, ou nulo)
  - `closed_by` (uuid, ou nulo)
  - `closed_by_name` (string, ou nulo)
  - `from_location` (objeto, ou nulo)
    - `code` (string)
    - `id` (uuid)
  - `id` (uuid)
  - `location` (objeto)
    - `code` (string)
    - `id` (uuid)
    - `piece` (string, ou nulo)
  - `nfe_unit` (string, ou nulo)
  - `order_ref` (string, ou nulo)
  - `product` (objeto)
    - `catch_weight` (boolean, ou nulo)
    - `description` (string)
    - `ean` (string, ou nulo)
    - `id` (uuid)
    - `sku` (string, ou nulo)
    - `uom` (string)
  - `qty_done` (integer, ou nulo)
  - `qty_expected` (integer, ou nulo): Nulo para quem confere às cegas no recebimento.
  - `seq` (integer)
  - `short_reason` (string, ou nulo)
  - `tote` (string, ou nulo)
  - `unit_mismatch` (boolean)
  - `waits_replenishment` (objeto, ou nulo): A reposição que a parada espera, quando a posição está vazia.
    - `replenishment_id` (uuid)
    - `short_code` (string, ou nulo)
    - `work_order_id` (uuid, ou nulo)
  - `weight_done_g` (integer, ou nulo)
  - `weight_expected_g` (integer, ou nulo)
- `work_order` (objeto, obrigatório)
  - `cancel_reason` (string, ou nulo)
  - `cancelled_by_name` (string, ou nulo)
  - `claimed_at` (data e hora, ou nulo)
  - `claimed_by` (uuid, ou nulo)
  - `claimed_by_email` (string, ou nulo)
  - `claimed_by_name` (string, ou nulo)
  - `closed_at` (data e hora, ou nulo)
  - `created_at` (data e hora, ou nulo)
  - `created_by` (uuid, ou nulo)
  - `created_by_name` (string, ou nulo)
  - `depot_code` (string)
  - `depot_id` (uuid)
  - `id` (uuid)
  - `items` (integer): Quantas paradas a OS tem.
  - `items_done` (integer)
  - `kind` (string): `receive`, `putaway`, `pick`, `count`, `move`, `replenish` ou `unplace`.
  - `origin` (objeto): De onde a OS nasceu. Os campos dependem de `type`.
    - `code` (string, ou nulo)
    - `created_by_email` (string, ou nulo): Manual: quem abriu.
    - `id` (uuid): O recebimento, a reposição ou a onda.
    - `location_code` (string, ou nulo): Reposição: a posição a abastecer.
    - `nfe_key` (string, ou nulo): Recebimento.
    - `orders` (integer, ou nulo): Onda: quantos pedidos.
    - `qty_wanted` (integer, ou nulo): Reposição.
    - `receive_code` (string, ou nulo)
    - `receive_status` (string, ou nulo)
    - `receive_work_order_id` (uuid, ou nulo)
    - `status` (string, ou nulo): Recebimento.
    - `supplier_name` (string, ou nulo): Recebimento.
    - `trigger` (string, ou nulo): Reposição: o que a disparou (`min`, `demand`).
    - `type` ("receipt" | "replenishment" | "wave" | "manual")
    - `work_order_code` (string, ou nulo)
    - `work_order_id` (uuid, ou nulo)
    - `work_order_status` (string, ou nulo)
  - `priority` (integer)
  - `short_code` (string, ou nulo)
  - `status` (string): `open`, `in_progress`, `done` ou `cancelled`.
  - `totes` (lista de objeto): As caixas da separação em lote, com o pedido de cada uma.
    - `order_ref` (string)
    - `tote` (string)
  - `unblocks` (lista de objeto): As OS de separação que esta reposição destrava.
    - `id` (uuid)
    - `short_code` (string, ou nulo)

## Recusas

### HTTP 400 · Pedido mal formado

- [`version_unknown`](/erros/version_unknown.md) (HTTP 400): A `Kernos-Version` pedida não existe. Use uma das versões declaradas no cabeçalho, ou não o mande.

### HTTP 401 · Sem credencial válida

- [`api_key_expired`](/erros/api_key_expired.md) (HTTP 401): A chave venceu. Gire a chave no painel e use a nova.
- [`api_key_wrong_environment`](/erros/api_key_wrong_environment.md) (HTTP 401): A chave é do outro ambiente: `ksk_test_` vai em https://stag.kernos.com.br, `ksk_live_` em https://api.kernos.com.br.
- [`unauthenticated`](/erros/unauthenticated.md) (HTTP 401): Credencial ausente, inválida ou expirada.

### HTTP 403 · Sem permissão

- [`agent_token_out_of_scope`](/erros/agent_token_out_of_scope.md) (HTTP 403): O token de agente (`kat_`) só vale na porta MCP. Para a API, use o token de sessão ou uma chave de integração.
- [`api_key_action_not_granted`](/erros/api_key_action_not_granted.md) (HTTP 403): A chave não tem esta ação. Edite as ações da chave no painel.
- [`api_key_out_of_scope`](/erros/api_key_out_of_scope.md) (HTTP 403): A chave só vale nas rotas do contrato público.
- [`depot_out_of_reach`](/erros/depot_out_of_reach.md) (HTTP 403): Quem chama não alcança o CD deste objeto. Peça alcance ao CD ou use outra credencial.
- [`forbidden_role`](/erros/forbidden_role.md) (HTTP 403): O papel de quem chama nesta empresa não permite esta ação.
- [`module_not_subscribed`](/erros/module_not_subscribed.md) (HTTP 403): A empresa não assina o módulo desta rota.
- [`tenant_mismatch`](/erros/tenant_mismatch.md) (HTTP 403): A credencial não pertence à empresa do endereço chamado.
- [`tenant_unavailable`](/erros/tenant_unavailable.md) (HTTP 403): A empresa está indisponível no momento.

### HTTP 404 · Não encontrado

- [`not_found`](/erros/not_found.md) (HTTP 404): Não existe objeto com esse identificador nesta empresa.

### HTTP 429 · Muitos pedidos

- [`rate_limited`](/erros/rate_limited.md) (HTTP 429): Muitos pedidos por segundo com esta chave. Espere o `Retry-After`, em segundos, e tente de novo.

#### curl

**Lê uma OS, com a origem e as paradas**

```sh
curl -X GET "https://stag.kernos.com.br/v1/objects/work-order/<id>" \
  -H "Authorization: Bearer ksk_test_…" \
  -H "Kernos-Version: 2026-10-03"
```

#### Node

**Lê uma OS, com a origem e as paradas**

```js
import { Kernos } from '@kernosbr/kernos'

const kernos = new Kernos(process.env.KERNOS_API_KEY)
const result = await kernos.workOrder.get('<id>')
```

#### Python

**Lê uma OS, com a origem e as paradas**

```python
import os
from kernos import Kernos

kernos = Kernos(os.environ["KERNOS_API_KEY"])
result = kernos.work_order.get("<id>")
```

#### PHP

**Lê uma OS, com a origem e as paradas**

```php
<?php
$kernos = new Kernos\Kernos(getenv('KERNOS_API_KEY'));
$result = $kernos->workOrder->get('<id>');
```

#### Java

**Lê uma OS, com a origem e as paradas**

```java
Kernos kernos = new Kernos(System.getenv("KERNOS_API_KEY"));
JsonNode result = kernos.workOrder().get("<id>");
```

#### C#

**Lê uma OS, com a origem e as paradas**

```csharp
var kernos = new KernosClient(Environment.GetEnvironmentVariable("KERNOS_API_KEY"));
var result = await kernos.WorkOrder.GetAsync("<id>");
```

#### Go

**Lê uma OS, com a origem e as paradas**

```go
client, err := kernos.New(os.Getenv("KERNOS_API_KEY"))
result, err := client.WorkOrder.Get(ctx, "<id>")
```

#### Rust

**Lê uma OS, com a origem e as paradas**

```rust
let kernos = Kernos::new(&std::env::var("KERNOS_API_KEY")?)?;
let result = kernos.work_order().get("<id>", None)?;
```

**Resposta · 200 (a forma, sem dado real)**

```json
{
  "ok": true,
  "data": {
    "stops": [
      {
        "closed": true,
        "closed_at": "2026-10-03T12:00:00Z",
        "closed_by": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
        "closed_by_name": "…",
        "from_location": {
          "code": "…",
          "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50"
        },
        "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
        "location": {
          "code": "…",
          "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
          "piece": "…"
        },
        "nfe_unit": "…",
        "order_ref": "…",
        "product": {
          "catch_weight": true,
          "description": "…",
          "ean": "…",
          "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
          "sku": "…",
          "uom": "…"
        },
        "qty_done": 0,
        "qty_expected": 0,
        "seq": 0,
        "short_reason": "…",
        "tote": "…",
        "unit_mismatch": true,
        "waits_replenishment": {
          "replenishment_id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
          "short_code": "…",
          "work_order_id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50"
        },
        "weight_done_g": 0,
        "weight_expected_g": 0
      }
    ],
    "work_order": {
      "cancel_reason": "…",
      "cancelled_by_name": "…",
      "claimed_at": "2026-10-03T12:00:00Z",
      "claimed_by": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
      "claimed_by_email": "…",
      "claimed_by_name": "…",
      "closed_at": "2026-10-03T12:00:00Z",
      "created_at": "2026-10-03T12:00:00Z",
      "created_by": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
      "created_by_name": "…",
      "depot_code": "…",
      "depot_id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
      "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
      "items": 0,
      "items_done": 0,
      "kind": "…",
      "origin": {
        "code": "…",
        "created_by_email": "…",
        "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
        "location_code": "…",
        "nfe_key": "…",
        "orders": 0,
        "qty_wanted": 0,
        "receive_code": "…",
        "receive_status": "…",
        "receive_work_order_id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
        "status": "…",
        "supplier_name": "…",
        "trigger": "…",
        "type": "receipt",
        "work_order_code": "…",
        "work_order_id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
        "work_order_status": "…"
      },
      "priority": 0,
      "short_code": "…",
      "status": "…",
      "totes": [
        {
          "order_ref": "…",
          "tote": "…"
        }
      ],
      "unblocks": [
        {
          "id": "3f1e0c8a-5b7d-4c21-9a3e-0b1c2d3e4f50",
          "short_code": "…"
        }
      ]
    }
  },
  "error": null,
  "error_code": null,
  "field": null,
  "trace_id": null
}
```

> **Ambiente** `ksk_test_` fala com `https://stag.kernos.com.br`; `ksk_live_`, com `https://api.kernos.com.br`. O prefixo da chave escolhe o endereço.
