Skip to navigation

Work Orders Overview

The Work Orders API provides endpoints for managing and interacting with maintenance work orders.

Key Concepts

Work Order Status

Work Orders can be in various states:

  • OPEN
  • COMPLETED
  • CANCELED
  • ON_HOLD
  • IN_PROGRESS

Work Order Priority

Work Orders can be categorized by different priorities:

  • LOW
  • MEDIUM
  • HIGH
  • URGENT
  • WARRANTY

Work Order Entry Preference

Work Orders can have entry preference:

  • 24_HOUR_NOTICE
  • BY_APPOINTMENT
  • CALL_FIRST
  • NO_PREFERENCE
  • ANYTIME

Available Endpoints

EndpointSummaryMethod
/workordersList Work OrdersGET
/workordersCreate Work OrderPOST
/workorders/{workOrderId}Read Work OrderGET
/workorders/{workOrderId}Update Work OrderPUT
/workorders/{workOrderId}Delete Work OrderDELETE
/workorders/{workOrderId}/attachmentsList AttachmentsGET
/workorders/{workOrderId}/attachmentsCreate AttachmentPOST
/workorders/{workOrderId}/attachments/{attachmentId}/downloadUrlRead Attachment Download URLGET
/workorders/{workOrderId}/assignAssign Work OrderPATCH
/workorders/{workOrderId}/unassignUnassign Work OrderPATCH
/workorders/{workOrderId}/startStart Work OrderPATCH
/workorders/{workOrderId}/holdHold Work OrderPATCH
/workorders/{workOrderId}/completeComplete Work OrderPATCH
/workorders/{workOrderId}/cancelCancel Work OrderPATCH

Work order photos

The url on an attachment from the list endpoint is a storage reference. You cannot fetch it. To show or download a photo, request a short-lived download link for that attachment.

Your API key needs an explicit workOrders read grant for this route. A key that works on the other work-order routes but has no permissions map gets 403 here. To request the grant, contact our team.

Example

  1. List the attachments of a work order. Copy the id of the attachment you need.
curl --location 'https://api.fortresstech.io/v1/workOrders/3f2b8c1e-5a4d-4e7b-9c10-2d6e8f0a1b34/attachments' \
--header 'x-api-key: <your-api-key>'
  1. Request a download link. expiresInSeconds is optional. It defaults to 300 and the server clamps it to 60–900.
curl --location 'https://api.fortresstech.io/v1/workOrders/3f2b8c1e-5a4d-4e7b-9c10-2d6e8f0a1b34/attachments/9a7c4d02-6b1e-4f83-8e25-0c3d5b7a9e61/downloadUrl?expiresInSeconds=300' \
--header 'x-api-key: <your-api-key>'
{
"url": "https://<bucket>.s3.amazonaws.com/<key>?X-Amz-...",
"expiresAt": "2026-10-08T18:05:00.000Z",
"attachmentId": "9a7c4d02-6b1e-4f83-8e25-0c3d5b7a9e61",
"workOrderId": "3f2b8c1e-5a4d-4e7b-9c10-2d6e8f0a1b34",
"fileName": "kitchen-leak.jpg",
"contentType": "image/jpeg"
}
  1. Fetch the url with a plain GET before expiresAt. Do not send the x-api-key header. Accept Content-Encoding: gzip.
curl --location --compressed 'https://<bucket>.s3.amazonaws.com/<key>?X-Amz-...' --output kitchen-leak.jpg
  1. After expiresAt, the link stops working. Call the route from step 2 again to get a fresh link.

Never store a download link as a permanent reference to a photo. The link expires. Store the attachment id and the work order id, and request a new link each time you need the file.

Response codes

StatusMeaning
200The response holds a signed link and its expiry time.
400The request is not valid. expiresInSeconds is not an integer, workOrderId or attachmentId is not a UUID, or the key is an all-organizations key, which cannot use this route.
401The request has no x-api-key header. API Gateway returns this status with a {"message": "Unauthorized"} body before the authorizer runs.
403The API key has no permissions map, or its map has no workOrders read. The floo gateway returns this status with a {"Message": ...} body.
404The attachment or the work order was not found. The response is the same for a missing, deleted, or out-of-scope item.
415The file is not a PDF, JPEG, PNG, or GIF.
500The server could not issue the link, for example when the access log write failed. Retry later.