---
title: "Update Item"
method: PATCH
path: "/claims/{claim_id}/expenditures/items/{item_id}"
tags: ["expenditures"]
---

# Update Item

`PATCH /claims/{claim_id}/expenditures/items/{item_id}`

## Request

- Base URL: `https://api.claimkit.co` (the document declares no server; this is the origin it was published from)
- URL: `https://api.claimkit.co/claims/{claim_id}/expenditures/items/{item_id}`
- Auth: none declared

Inline edit / move an item. Any change marks ``manual_override=True``
so subsequent AI re-runs don't undo the user's decision.

``item_id`` may identify either an ``AURDExpenditureItem`` (real row) or
a synthesised salaries entry (when the id is at or above
``_EMPLOYEE_RATE_ID_OFFSET``). Real items are editable as before; salary
rows are read-only on this mixed-item surface — see
``_update_salary_row``. To change an employee's R&D %, use the
expenditure Salary tab.

## Path parameters

- `claim_id` integer, required
- `item_id` integer, required

## Request body

- ItemUpdate: Partial update for an expenditure item. Most fields treat ``None`` as "omitted, leave unchanged" and use empty string to clear (e.g. ``description``). ``rd_percentage`` and ``activity_id`` are the exceptions and use "explicit null = clear" semantics — null ``activity_id`` moves the item back to the Ungrouped bucket. Distinguish "absent from JSON" from "JSON null" via ``model_fields_set`` in the handler.
  - `name` string, nullable
  - `description` string, nullable
  - `rd_percentage` union
    - number
    - string
  - `category` string, nullable
  - `subgroup_key` string, nullable
  - `activity_id` integer, nullable
  - `eligibility` 'r_and_d' | 'non_eligible', nullable
  - `refund_of_item_id` integer, nullable

## Response `200`

Successful Response

- ItemResponse
  - `id` integer, required
  - `import_id` integer, nullable, required
  - `source_sheet` string, required
  - `name` string, required
  - `description` string, nullable, required
  - `note` string, nullable
  - `source_amount` number, nullable, required
  - `source_date` string, nullable, required
  - `source_account_code` string, nullable, required
  - `source_account_name` string, nullable
  - `source_employee_name` string, nullable, required
  - `source_department` string, nullable, required
  - `source_tax_amount` number, nullable
  - `category` string, nullable, required
  - `subgroup_key` string, nullable, required
  - `activity_id` integer, nullable, required
  - `eligibility` string, required
  - `rd_percentage` number, nullable, required
  - `rd_amount` number, nullable, required
  - `manual_override` boolean, required
  - `manual_override_by_admin` boolean, nullable
  - `auto_categorised` boolean
  - `import_source_type` string, nullable
  - `open_query_count` integer
  - `apportionments` ApportionmentOut[]
    - `activity_id` integer, required
    - `activity_name` string, nullable
    - `percentage` number, required
  - `refund_of_item_id` integer, nullable
  - `refund_of_item_name` string, nullable
  - `distribution_linked` boolean
  - `distribution_link_source` string, nullable
  - `distribution_scope` string, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/claimkit/apis/claimkit-api.md) - [All operations](https://skmtc.dev/claimkit/apis/claimkit-api/llms.txt) - [OpenAPI document](https://skmtc.dev/claimkit/apis/claimkit-api/revisions/94dc85ba5326?raw)
