---
title: "Update project"
method: PUT
path: "/api/v1/projects/{id}"
tags: ["projects"]
---

# Update project

`PUT /api/v1/projects/{id}`

## Request

- Base URL: `https://demo.invoiceninja.com`
- URL: `https://demo.invoiceninja.com/api/v1/projects/{id}`
- Auth: none declared. Required headers: `X-API-TOKEN`, `X-Requested-With`
- TypeScript: <https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference/docs/api/v1/projects/:id/put.ts> (a function with typed inputs; its response is checked against the schema)

Handles the updating of a project by id

## Path parameters

- `id` string, string, required

## Query parameters

- `include` string

## Headers

- `X-API-TOKEN` string, required
- `X-Requested-With` string, required

## Request body

- ProjectRequest
  - `name` string, required: Project name
  - `client_id` string, required: The hashed ID of the client
  - `description` string: Project description
  - `budgeted_hours` number: Budgeted hours for the project
  - `task_rate` number: Hourly rate for tasks in this project
  - `due_date` string, date: Due date for the project
  - `custom_value1` string: Custom field value 1
  - `custom_value2` string: Custom field value 2
  - `custom_value3` string: Custom field value 3
  - `custom_value4` string: Custom field value 4
  - `is_deleted` boolean: Whether the project is deleted
  - `archived_at` integer: Timestamp when project was archived
  - `color` string: Project color for UI display
  - `tags` string[]: Full sync array of hashed tag IDs. Omit to leave existing tags unchanged; send [] to detach all tags.

## Response `200`

Returns the project object

- Project
  - `id` string, required: The project hashed id
  - `user_id` string, required: The user hashed id
  - `assigned_user_id` string: The assigned user identifier associated with the project
  - `client_id` string: The client identifier associated with the project
  - `name` string, required: The name of the project
  - `task_rate` number, float, required: The default rate per task for the project
  - `due_date` string, date: The due date for the project
  - `private_notes` string: Private notes associated with the project
  - `budgeted_hours` number, float, required: The number of budgeted hours for the project
  - `custom_value1` string: Custom value field 1
  - `custom_value2` string: Custom value field 2
  - `custom_value3` string: Custom value field 3
  - `custom_value4` string: Custom value field 4
  - `created_at` number: The timestamp of the project creation
  - `updated_at` number: The timestamp of the last project update
  - `archived_at` number: The timestamp of the project deletion
  - `public_notes` string: Public notes associated with the project
  - `is_deleted` boolean, required: A flag indicating if the project is deleted
  - `number` string: The project number
  - `color` string, required: The color associated with the project
  - `tags` TagAssignment[]: Tags assigned to the project
    - `id` string, required: The hashed tag id
    - `name` string, required: The tag name
    - `color` string, nullable: The tag color as a hex value, or null when unset

## Other responses

- `401`: Authentication error
- `403`: Authorization error
- `422`: Validation error
- `429`: Rate Limit Exceeded
- `5XX`: Server error
- `default`: Unexpected Error

## Changes

- **2026-05-31** `28befcbfadda`: 1 breaking
  - the response property `tags/items/color` became optional for the status `200`
- **2026-05-31** `edde330209e2`: 2 info
  - added the new optional request property `tags`
  - added the optional property `tags` to the response with the `200` status
- **2026-04-20** `69a36036d334`: 1 info
  - the response required property `id` became read-only for the status `200`
- **2025-10-10** `873a5da14619`: 1 breaking
  - added required request body
- **2024-06-06** `8e82a2bd77e0`: 2 breaking, 22 info
  - the response's body type changed from no type to `object` for status `200`
  - the response's body type changed from no type to `object` for status `default`
  - added the optional property `archived_at` to the response with the `200` status
  - added the optional property `assigned_user_id` to the response with the `200` status
  - …20 more

[Operation history](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference/changes/api/v1/projects/:id/put.md)

---

[API](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference.md) - [All operations](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference/llms.txt) - [OpenAPI document](https://skmtc.dev/invoiceninja/apis/invoice-ninja-api-reference/revisions/bcda1f823746?raw)
