---
title: "Update project"
method: PATCH
path: "/projects/{id}"
tags: ["Projects"]
---

# Update project

`PATCH /projects/{id}`

## Request

- Base URL: `https://app.buildworkpro.com/api/v1`
- URL: `https://app.buildworkpro.com/api/v1/projects/{id}`
- Auth: HTTP bearer

Partially updates a project. Passing `bidId` links (or, with `null`, unlinks) an existing bid — see the field.

## Path parameters

- `id` integer, required

## Headers

- `Idempotency-Key` string, uuid

## Request body

- UpdateProject
  - `name` string
  - `projectNumber` string
  - `contactId` integer, nullable
  - `projectType` string, nullable
  - `status` 'planning' | 'in_progress' | 'on_hold' | 'closeout' | 'completed' | 'cancelled'
  - `priority` string, nullable
  - `startDate` union
    - string, date-time
    - string
  - `expectedEndDate` union
    - string, date-time
    - string
  - `actualEndDate` union
    - string, date-time
    - string
  - `originalContractValue` union
    - string
    - number
  - `contractValue` union
    - string
    - number
  - `description` string, nullable
  - `siteAddress` string, nullable
  - `siteCity` string, nullable
  - `siteState` string, nullable
  - `siteZipCode` string, nullable
  - `architectName` string, nullable: Architect or engineer of record; printed in the pay application's "Via architect / engineer" cell.
  - `architectProjectNumber` string, nullable: The architect's own project number, printed on the pay application and its continuation sheet.
  - `contractFor` string, nullable: Scope line printed in the pay application's "Contract for" cell (e.g. "Structural steel — Phase 2").
  - `assignedTo` integer, nullable
  - `bidId` integer, nullable: Link an existing bid to this project (both sides), or `null` to unlink. Requires the `bids:write` scope too. Refused with 409 when the bid already belongs to another live project or this project already has a different bid — unlink first. Linking an accepted bid fills the original contract (pre-tax) and site address only if the project has none.

## Response `200`

Updated

- object
  - `data` Project, required
    - `id` integer, required
    - `name` string, required
    - `projectNumber` string, required
    - `contactId` integer, nullable, required
    - `bidId` integer, nullable, required
    - `projectType` string, nullable, required
    - `status` string, required
    - `priority` string, nullable, required
    - `startDate` union, required
      - string, date-time
      - string
    - `expectedEndDate` union, required
      - string, date-time
      - string
    - `actualEndDate` union, required
      - string, date-time
      - string
    - `contractValue` string, nullable, required
    - `originalContractValue` string, nullable, required
    - `description` string, nullable, required
    - `siteAddress` string, nullable, required
    - `siteCity` string, nullable
    - `siteState` string, nullable
    - `siteZipCode` string, nullable
    - `architectName` string, nullable
    - `architectProjectNumber` string, nullable
    - `contractFor` string, nullable
    - `assignedTo` integer, nullable, required
    - `createdAt` union, required
      - string, date-time
      - string
    - `updatedAt` union, required
      - string, date-time
      - string
    - `isPractice` boolean: Read-only. Present on GET /projects/{id}. True for the onboarding practice project a user starts from the setup wizard — demo content that "Clear sample data" removes; false for every other project.
  - `meta` ResponseMeta, required
    - `request_id` string: Server-generated request identifier
    - `pagination` PaginationMeta
      - `cursor` string, nullable, required: Opaque cursor for the next page; null when no more results
      - `has_more` boolean, required: Whether more pages are available after this one
      - `count` integer, required: Items in this page

## Other responses

- `403`: Scope insufficient, or no access to the project or bid
- `404`: Not found
- `409`: The bid is linked to another live project, or this project already has a different bid
- `422`: Validation failed

---

[API](https://skmtc.dev/buildworkpro/apis/buildworkpro-api.md) · [All operations](https://skmtc.dev/buildworkpro/apis/buildworkpro-api/llms.txt) · [OpenAPI document](https://skmtc.dev/buildworkpro/apis/buildworkpro-api/revisions/441cf40012f7?raw)
