November 9, 2026
List the Files on a Work Item
GET /v3/WorkItems/{WorkItemKey}/Files returns every file on a work item, ready to download, straight from the work item’s key:
GET https://api.karbonhq.com/v3/WorkItems/4jgPTtcXxwC2/Files?$filter=IsArchived eq false&$top=100
{
"@odata.count": 132,
"@odata.nextLink": "https://api.karbonhq.com/v3/WorkItems/4jgPTtcXxwC2/Files?$filter=IsArchived eq false&$top=100&$skip=100",
"value": [
{
"FileContextKey": "3kTq8wNpXb2R",
"FileName": "2026 Tax Return.pdf",
"FileSize": 482113,
"MimeType": "application/pdf",
"DateCreated": "2026-11-09T21:14:05Z",
"IsArchived": false,
"IsShared": true,
"DownloadUrl": "/v3/Files?token=...",
"FolderPath": "Final/Tax Returns"
},
...
]
}
Each file comes with its DownloadUrl, so you can download it without looking it up first. Files are returned newest first; follow @odata.nextLink for the next page.
| Option | Supported |
|---|---|
$filter |
eq on IsArchived, IsShared, Source, MimeType and FolderPath, combined with and. FolderPath matches ignoring case. |
$orderby |
DateCreated |
$top / $skip |
Up to 500 per page |
It works on every account. FolderPath is null for files that aren’t in a folder.
Work Item Folders
On accounts that use work item folders, you can now see a work item’s folders, list the files in a folder, and put files in them. A folder is identified by its Path: the folder names from the top-level folder down, joined with /, such as Final/Tax Returns.
List a work item’s folders
GET https://api.karbonhq.com/v3/WorkItems/{WorkItemKey}/Folders
{
"value": [
{ "Name": "Received", "Parent": null, "Path": "Received" },
{ "Name": "API Uploads", "Parent": "Received", "Path": "Received/API Uploads" },
{ "Name": "Final", "Parent": null, "Path": "Final" },
{ "Name": "Tax Returns", "Parent": "Final", "Path": "Final/Tax Returns" }
]
}
Parent is the parent folder’s Path, or null for a top-level folder. The endpoint doesn’t support query options. It returns an empty list when work item folders aren’t turned on for the account.
List the files in a folder
Filter the work item’s files on FolderPath:
GET https://api.karbonhq.com/v3/WorkItems/{WorkItemKey}/Files?$filter=FolderPath eq 'Final/Tax Returns'
Upload a file into a folder
POST /v3/Files accepts a new optional folder_path form field. Send it with exactly one workitem_keys value and no other keys:
curl -X POST https://api.karbonhq.com/v3/Files \
-H "Authorization: Bearer {token}" \
-H "AccessKey: {key}" \
-F "file=@./tax-return.pdf;type=application/pdf" \
-F "workitem_keys=4jgPTtcXxwC2" \
-F "folder_path=Final/Tax Returns"
The 201 response includes the file’s FolderPath. Leave folder_path out, or send it blank, to upload to the work item’s root.
A folder_path that doesn’t match exactly one of the work item’s folders, a client portal folder, or an account without work item folders returns a 400. If the folder changes while the file is uploading (for example, it’s deleted), the upload is removed and the request returns a 409.
Move a file between folders
PATCH /v3/FileDetails/{FileContextKey} moves a work item file into one of its work item’s folders:
PATCH https://api.karbonhq.com/v3/FileDetails/{FileContextKey}
{
"FolderPath": "Final/Tax Returns"
}
Send "FolderPath": null to move the file back to the work item’s root. FolderPath is the only property that can be patched, and it must be sent. The request returns a 204, or a 200 with the file’s details when you send Prefer: return=representation.
Files can be moved out of a client portal folder, but not into one. A FolderPath that doesn’t match exactly one folder, a file that isn’t on a work item, or an account without work item folders returns a 400.
FolderPath on file responses
GET /v3/FileList/{EntityType} and GET /v3/FileDetails/{FileContextKey} now return each file’s FolderPath, or null when the file isn’t in a folder.
Sort Payments with $orderby
GET /v3/Payments now accepts $orderby on PaymentDate, PaymentReference or GrossAmount, ascending or descending:
GET https://api.karbonhq.com/v3/Payments?$orderby=PaymentDate desc&$top=100
- Sort on one property at a time. Any other property, or more than one, returns a
400. PaymentReferencesorts as text, soKPY-10000comes beforeKPY-9999.
Refer to the API documentation for more information on listing payments.