---
title: "Create a shipment on a fulfillment order (synchronous)"
method: POST
path: "/api/v1/fulfillment-orders/{fulfillmentOrderId}/shipments"
tags: ["fulfillment-order-shipments"]
---

# Create a shipment on a fulfillment order (synchronous)

`POST /api/v1/fulfillment-orders/{fulfillmentOrderId}/shipments`

## Request

- Base URL: `https://oms-api.tenant.krzlabs.io`
- URL: `https://oms-api.tenant.krzlabs.io/api/v1/fulfillment-orders/{fulfillmentOrderId}/shipments`
- Auth: one of:
  - HTTP basic
  - HTTP bearer
- TypeScript: <https://skmtc.dev/kruzer-corp/apis/oms-api/docs/api/v1/fulfillment-orders/:fulfillmentOrderId/shipments/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a shipment (status SHIPMENT_CREATED — not yet dispatched by the carrier) linked to the fulfillment order and opens its tracking timeline with a matching event, in a single transaction. It does not change the fulfillment order status. Validates that the fulfillment order, the carrier and every package SKU exist. accountCode comes from the JWT.

## Path parameters

- `fulfillmentOrderId` string, uuid, required

## Request body

- FulfillmentOrderShipmentCreate
  - `carrier_id` string, required: Identificador (UUID) da transportadora cadastrada.
  - `tracking_code` string, nullable: Código de rastreio, quando já atribuído pela transportadora. Ausente na criação até o despacho.
  - `label` string, nullable: Referência da etiqueta de transporte, quando o carrier a emite.
  - `packages` FulfillmentOrderShipmentPackageCreate[], required: Volumes da remessa (>= 1).
    - `weight_kg` number, nullable: Peso do volume em kg (> 0).
    - `dimensions` FulfillmentOrderShipmentPackageDimensionsCreate
      - `length_cm` number, required: Comprimento em cm (> 0).
      - `width_cm` number, required: Largura em cm (> 0).
      - `height_cm` number, required: Altura em cm (> 0).
    - `items` FulfillmentOrderShipmentPackageItemCreate[], required: Itens do volume (>= 1).
      - `sku` string, required: SKU do item embarcado.
      - `quantity` number, required: Quantidade do item no volume (inteiro > 0).
    - `label_url` string, nullable: URL da etiqueta do volume, quando o carrier a emite.
  - `metadata` object, nullable

## Response `201`

Shipment created (status SHIPMENT_CREATED, awaiting dispatch). Fulfillment order status unchanged.

- FulfillmentOrderShipmentCreateResponse
  - `packages` FulfillmentOrderShipmentPackageCreateResponse[], required
    - `dimensions` object, nullable, required
      - `length_cm` number
      - `width_cm` number
      - `height_cm` number
    - `items` object[], required
      - `sku` string
      - `quantity` number
    - `weight_kg` number, nullable, required
    - `label_url` string, nullable, required
  - `metadata` object, nullable, required
  - `shipment_id` string, required
  - `fo_status` string, required
  - `fulfillment_order_id` string, required
  - `order_id` string, required
  - `carrier_id` string, required
  - `status` 'SHIPMENT_CREATED' | 'DISPATCHED' | 'IN_TRANSIT' | 'OUT_FOR_DELIVERY' | 'DELIVERED' | 'DELIVERY_FAILED' | 'RETURNED' | 'LOST' | 'LABEL_CREATED' | 'AWAITING_PICKUP' | 'IN_TRANSFER', required
  - `tracking_code` string, nullable, required
  - `label` string, nullable, required
  - `dispatched_at` string, nullable, required
  - `delivered_at` string, nullable, required
  - `created_at` string, required
  - `updated_at` string, required

## Other responses

- `400`: Invalid payload: missing/invalid carrier UUID, empty packages/items, or invalid measures.
- `401`: Authentication is missing, malformed, expired, or refers to a session that is no longer active.
- `403`: The caller is authenticated but lacks the required permission for this action.
- `404`: One of the referenced resources (FulfillmentOrder, Carrier, Product) was not found in the caller account.
- `409`: A shipment with the same tracking code already exists in the account (when a tracking code is sent).
- `500`: Unexpected server error. The response body never leaks internal details.

## Changes

- **2026-07-07** `a3b4750a505f`: 6 breaking, 5 warning, 14 info
  - the `packages` request property's minItems was increased to `1`
  - the `packages/items/items` request property's minItems was increased to `1`
  - the `label` request property type changed from `object` to `string`
  - the `packages/items/label_url` request property type changed from `object` to `string`
  - …21 more
- **2026-07-07** `84194c31ab85`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/kruzer-corp/apis/oms-api/changes/api/v1/fulfillment-orders/:fulfillmentOrderId/shipments/post.md)

---

[API](https://skmtc.dev/kruzer-corp/apis/oms-api.md) - [All operations](https://skmtc.dev/kruzer-corp/apis/oms-api/llms.txt) - [OpenAPI document](https://skmtc.dev/kruzer-corp/apis/oms-api/revisions/38ef6e16a7a8?raw)
