> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developer.fortresstech.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developer.fortresstech.io/_mcp/server.

# Update Work Order

PUT https://api.fortresstech.io/v1/workOrders/{workOrderId}
Content-Type: application/json

Update information for a specific work order

Reference: https://developer.fortresstech.io/api-reference/work-orders/update-work-order

## Authentication

- `x-api-key` header (required) — API Key authentication via header

## Request

### Path parameters

- `workOrderId` (string, required) — The id of the work order

### Body (application/json)

This endpoint expects a WorkOrderUpdate.

- `maintenanceIssueId` (string, required) — ID from the maintenance issue api response.
- `maintenanceLocationId` (string, required) — ID from the maintenance location api response.
- `priority` (enum, required)
  - Allowed values: `LOW`, `MEDIUM`, `HIGH`, `URGENT`, `WARRANTY`
- `maintenanceLocationType` (enum, required) — Indicates the type of location. Used to conditionally require certain fields (e.g., unitId, householdId).
  - Allowed values: `COMMON_AREA`, `UNIT`
- `updatedBy` (string, required)
- `customerId` (string, optional) — ID from the Customer table. Required if maintenanceLocationType is UNIT.
- `description` (string, optional)
- `hourlyServiceRate` (double, optional) — The hourly service rate.
- `entryPreference` (enum, optional)
  - Allowed values: `24_HOUR_NOTICE`, `BY_APPOINTMENT`, `CALL_FIRST`, `NO_PREFERENCE`, `ANYTIME`
- `entryNotes` (string, optional)
- `hasPetAlert` (boolean, optional) — Indicates if there are pets at the location.
- `householdId` (string, optional) — Required if maintenanceLocationType is UNIT.
- `otherLocationDetails` (string, optional)
- `requestorEmail` (string, optional, nullable) — Email address of the person who requested the work. Optional. An empty or blank value is treated as no value. On update, sending an explicit null clears a previously stored value, while omitting the field leaves it unchanged. When a non-blank value is sent it must be a valid email address of at most 100 characters.
- `requestorName` (string, optional)
- `requestorPhone` (string, optional, nullable) — Phone number of the person who requested the work. Optional. An empty or blank value is treated as no value. On update, sending an explicit null clears a previously stored value, while omitting the field leaves it unchanged. When a non-blank value is sent it must be at most 15 characters.
- `requestedStartDateFrom` (date, optional)
- `requestedStartDateTo` (date, optional)
- `requestedStartTimeFrom` (string, optional) — Time format string (HH:mm:ss or similar)
- `requestedStartTimeTo` (string, optional) — Time format string (HH:mm:ss or similar)
- `totalCostOfMaterialsUsed` (double, optional) — The total cost of materials used.
- `totalAmountOwedByResident` (double, optional) — The total amount owed by the resident.
- `unitId` (string, optional) — Required if maintenanceLocationType is UNIT.
- `technicianNotes` (string, optional) — Notes to the technician.
- `previouslyReported` (boolean, optional) — If the Issue was previously reported, this will be true.
- `serviceNotes` (string, optional)
- `vendorNotes` (string, optional)
- `holdReason` (string, optional)
- `readableId` (string, optional)
- `dueDate` (date, optional) — The due date for the work order.
- `isDoorCodeActive` (boolean, optional) — Indicates if the door code is active.
- `isAlarmActive` (boolean, optional) — Indicates if the alarm is active.
- `doorCode` (string, optional) — The door code for the location.
- `alarmCode` (string, optional) — The alarm code for the location.

## Response

### 200

Expected response to a valid request

- `status` (enum, optional)
  - Allowed values: `OPEN`, `COMPLETED`, `CANCELED`, `ON_HOLD`, `IN_PROGRESS`
- `priority` (enum, optional)
  - Allowed values: `LOW`, `MEDIUM`, `HIGH`, `URGENT`, `WARRANTY`
- `hasPetAlert` (boolean, optional)
- `completedAt` (datetime, optional)
- `requestorPhone` (string, optional, nullable)
- `requestorEmail` (string, optional, nullable)
- `requestedStartDateFrom` (date, optional)
- `requestedStartDateTo` (date, optional)
- `requestedStartTimeFrom` (string, optional)
- `requestedStartTimeTo` (string, optional)
- `dueDate` (date, optional)
- `description` (string, optional)
- `serviceNotes` (string, optional)
- `vendorNotes` (string, optional)
- `entryNotes` (string, optional)
- `entryPreference` (enum, optional)
  - Allowed values: `24_HOUR_NOTICE`, `BY_APPOINTMENT`, `CALL_FIRST`, `NO_PREFERENCE`, `ANYTIME`
- `isDoorCodeActive` (boolean, optional)
- `isAlarmActive` (boolean, optional)
- `doorCode` (string, optional)
- `alarmCode` (string, optional)
- `holdReason` (string, optional)
- `otherLocationDetail` (string, optional)
- `attachmentIds` (string, optional)
- `technicianNotes` (string, optional) — Notes to the technician.
- `previouslyReported` (boolean, optional) — If the Issue was previously reported, this will be true.
- `id` (string, optional)
- `readableId` (string, optional)
- `idempotencyId` (string, optional)
- `createdAt` (string, optional)
- `updatedAt` (datetime, optional)
- `deletedAt` (datetime, optional)
- `assignedUserId` (string, optional)
- `householdId` (string, optional)
- `customerId` (string, optional)
- `unitId` (string, optional)
- `maintenanceIssueId` (string, optional)
- `maintenanceLocationId` (string, optional)
- `propertyId` (string, optional)
- `organizationId` (string, optional)
- `totalCostOfMaterialsUsed` (double, optional) — The total cost of materials used.
- `totalAmountOwedByResident` (double, optional) — The total amount owed by the resident.
- `totalAmountOwedByProperty` (double, optional) — The total amount owed by the property.
- `hourlyServiceRate` (double, optional) — The hourly service rate.
- `totalLaborCost` (double, optional) — The total labor cost.

## Examples

**Request**

```json
{
  "maintenanceIssueId": "string",
  "maintenanceLocationId": "string",
  "priority": "LOW",
  "maintenanceLocationType": "COMMON_AREA",
  "updatedBy": "string"
}
```

**Response**

```json
{
  "status": "OPEN",
  "priority": "LOW",
  "hasPetAlert": true,
  "completedAt": "2024-01-15T09:30:00Z",
  "requestorPhone": "string",
  "requestorEmail": "string",
  "requestedStartDateFrom": "2023-01-15",
  "requestedStartDateTo": "2023-01-15",
  "requestedStartTimeFrom": "string",
  "requestedStartTimeTo": "string",
  "dueDate": "2023-01-15",
  "description": "string",
  "serviceNotes": "string",
  "vendorNotes": "string",
  "entryNotes": "string",
  "entryPreference": "24_HOUR_NOTICE",
  "isDoorCodeActive": true,
  "isAlarmActive": true,
  "doorCode": "string",
  "alarmCode": "string",
  "holdReason": "string",
  "otherLocationDetail": "string",
  "attachmentIds": "string",
  "technicianNotes": "string",
  "previouslyReported": true,
  "id": "string",
  "readableId": "string",
  "idempotencyId": "string",
  "createdAt": "string",
  "updatedAt": "2024-01-15T09:30:00Z",
  "deletedAt": "2024-01-15T09:30:00Z",
  "assignedUserId": "string",
  "householdId": "string",
  "customerId": "string",
  "unitId": "string",
  "maintenanceIssueId": "string",
  "maintenanceLocationId": "string",
  "propertyId": "string",
  "organizationId": "string",
  "totalCostOfMaterialsUsed": 1.1,
  "totalAmountOwedByResident": 1.1,
  "totalAmountOwedByProperty": 1.1,
  "hourlyServiceRate": 1.1,
  "totalLaborCost": 1.1
}
```

**SDK Code**

```python
import requests

url = "https://api.fortresstech.io/v1/workOrders/workOrderId"

payload = {
    "maintenanceIssueId": "string",
    "maintenanceLocationId": "string",
    "priority": "LOW",
    "maintenanceLocationType": "COMMON_AREA",
    "updatedBy": "string"
}
headers = {
    "x-api-key": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.fortresstech.io/v1/workOrders/workOrderId';
const options = {
  method: 'PUT',
  headers: {'x-api-key': '<apiKey>', 'Content-Type': 'application/json'},
  body: '{"maintenanceIssueId":"string","maintenanceLocationId":"string","priority":"LOW","maintenanceLocationType":"COMMON_AREA","updatedBy":"string"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.fortresstech.io/v1/workOrders/workOrderId"

	payload := strings.NewReader("{\n  \"maintenanceIssueId\": \"string\",\n  \"maintenanceLocationId\": \"string\",\n  \"priority\": \"LOW\",\n  \"maintenanceLocationType\": \"COMMON_AREA\",\n  \"updatedBy\": \"string\"\n}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("x-api-key", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.fortresstech.io/v1/workOrders/workOrderId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["x-api-key"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"maintenanceIssueId\": \"string\",\n  \"maintenanceLocationId\": \"string\",\n  \"priority\": \"LOW\",\n  \"maintenanceLocationType\": \"COMMON_AREA\",\n  \"updatedBy\": \"string\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://api.fortresstech.io/v1/workOrders/workOrderId")
  .header("x-api-key", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"maintenanceIssueId\": \"string\",\n  \"maintenanceLocationId\": \"string\",\n  \"priority\": \"LOW\",\n  \"maintenanceLocationType\": \"COMMON_AREA\",\n  \"updatedBy\": \"string\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://api.fortresstech.io/v1/workOrders/workOrderId', [
  'body' => '{
  "maintenanceIssueId": "string",
  "maintenanceLocationId": "string",
  "priority": "LOW",
  "maintenanceLocationType": "COMMON_AREA",
  "updatedBy": "string"
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'x-api-key' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.fortresstech.io/v1/workOrders/workOrderId");
var request = new RestRequest(Method.PUT);
request.AddHeader("x-api-key", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"maintenanceIssueId\": \"string\",\n  \"maintenanceLocationId\": \"string\",\n  \"priority\": \"LOW\",\n  \"maintenanceLocationType\": \"COMMON_AREA\",\n  \"updatedBy\": \"string\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "x-api-key": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [
  "maintenanceIssueId": "string",
  "maintenanceLocationId": "string",
  "priority": "LOW",
  "maintenanceLocationType": "COMMON_AREA",
  "updatedBy": "string"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.fortresstech.io/v1/workOrders/workOrderId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```