---
title: "Update Work Order"
method: PUT
path: "/service_orders/{purchase_order_uid}"
---

# Update Work Order

`PUT /service_orders/{purchase_order_uid}`

## Request

- Base URL: `https://dc-region.zuperpro.com/api`
- URL: `https://dc-region.zuperpro.com/api/service_orders/{purchase_order_uid}`
- Auth: API key in header `x-api-key`

Operates on Service Orders, shown in the Zuper client app as "Work Order" (in every industry). Work Orders share the exact same underlying schema and endpoints as Purchase Orders / Material Orders; they're distinguished only by the `purchase_order_type` field (`SERVICE_ORDER` here) and the `/service_orders` route prefix. All fields are optional (partial update semantics), but the full `purchase_order` wrapper object is still expected. Only allowed while the order is in an editable status; some statuses restrict edits to `line_items` only.

## Path parameters

- `purchase_order_uid` string, required

## Request body

- object
  - `purchase_order` object
    - `purchase_order_title` string: Required, min length 1.
    - `material_request` string: Material Request UID, nullable. Must reference an existing, non-deleted Material Request.
    - `job` string: Job UID, nullable.
    - `job_measurement_uids` string[]: Only validated when `job` is set.
    - `job_attachments_uids` string[]: Only validated when `job` is set.
    - `estimate` string: Quote/Estimate UID, nullable. Rejected if the estimate has a pending option selection.
    - `asset` string: Asset UID, nullable.
    - `project` string: Project UID, nullable.
    - `parent_po` string: UID of another order in this same module (purchase_order_uid), nullable. Rejected (409) if the parent is at or after SENT_TO_VENDOR with an integrated supplier.
    - `vendor` string: Vendor UID. Must be an active vendor.
    - `payment_term` string: Payment term UID.
    - `template` string: Template UID, nullable.
    - `ship_to` object
      - `street` string
      - `city` string
      - `country` string
      - `email` string
      - `phone_number` string
      - `zip_code` string
      - `state` string
      - `geo_cordinates` number[]: [latitude, longitude]
      - `landmark` string
      - `product_location` string: Product location UID
    - `billing_address` object
      - `street` string
      - `city` string
      - `country` string
      - `email` string
      - `phone_number` string
      - `zip_code` string
      - `state` string
      - `geo_cordinates` number[]: [latitude, longitude]
      - `landmark` string
    - `due_date` string, date
    - `purchase_order_date` string, date, nullable
    - `reference_number` string
    - `remarks` string
    - `line_items` object[]: Non-empty array required.
      - `line_item_type` 'ITEM' | 'HEADER' | 'PARTS' | 'GROUP'
      - `product_uid` string
      - `product_id` string
      - `location_uid` string
      - `location_name` string
      - `group_uid` string
      - `group_name` string
      - `image` string
      - `name` string
      - `brand` string
      - `specification` string
      - `uom` string
      - `description` string
      - `quantity` string
      - `unit_price` string
      - `product_type` 'PRODUCT' | 'SERVICE' | 'PARTS' | 'BUNDLE' | 'LABOR'
      - `purchase_price` string
      - `serial_nos` string[]
      - `vendor_sku` string
      - `discount` string
      - `discount_type` 'FIXED' | 'PERCENTAGE'
    - `delivery_method` 'JOB_ADDRESS' | 'WAREHOUSE' | 'PICKUP': Required when creating a Purchase Order; not required for a Work Order (Service Order).
    - `delivery_time` 'ANYTIME' | 'MORNING' | 'AFTERNOON' | 'SPECIAL_REQUEST'
    - `purchase_order_type` 'PURCHASE_ORDER' | 'SERVICE_ORDER': Optional — forced server-side to match the route you call (`/purchase_orders` → PURCHASE_ORDER, `/service_orders` → SERVICE_ORDER). Sending a conflicting value is rejected with 400.
    - `prefix` string: Supports `{{...}}` template tokens for auto-numbering.
    - `attachments` object[]
      - `file_name` string
      - `url` string
      - `file_size` integer
      - `visible_to_customer` boolean
      - `created_by` string

## Response `200`

200

- object
  - `type` 'success', required
  - `title` string, required
  - `message` string, required

## Changes

- **2026-11-03** `3c21bc232e16`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/service_orders/:purchase_order_uid/put.md)

---

[API](https://skmtc.dev/zuper/apis/zuper-pro-api.md) - [All operations](https://skmtc.dev/zuper/apis/zuper-pro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zuper/apis/zuper-pro-api/revisions/3c21bc232e16?raw)
