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

# Update a company project

`PATCH /v1/projects/{id}`

## Request

- Base URL: `https://gateway.remote.com`
- URL: `https://gateway.remote.com/v1/projects/{id}`
- Auth: one of:
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `https://gateway.remote.com/company.manage`
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `project:write`
  - OAuth 2
    - Authorization code: `/auth/oauth2/authorize`
    - Token URL: `/auth/oauth2/token` scopes: `all:write`
  - OAuth 2
    - Client credentials
    - Token URL: `/auth/oauth2/token` scopes: `project:write`
  - OAuth 2
    - Client credentials
    - Token URL: `/auth/oauth2/token` scopes: `all:write`
  - HTTP bearer

Updates a single contractor project by its ID.

Omitted fields are left unchanged. `lead_ids` and `team_member_ids` are replaced wholesale
when present, so send the complete desired list rather than only the additions, and send an
empty list to remove everyone. Read the project first to get its current membership.

## Authentication

This endpoint accepts any one of the following token types:

- **Company-scoped access token** (`OAuth2AuthorizationCode`) — obtained by a company manager through the Authorization Code flow or the Refresh Token flow. See [Authentication for partners](https://developer.remote.com/docs/authentication-for-partners).
- **Company-scoped access token (assertion)** (`OAuth2CompanyManagerAssertion`) — obtained through the `urn:ietf:params:oauth:grant-type:jwt-bearer` grant for a company manager. See [OAuth Assertion](https://developer.remote.com/docs/authorization-method-oauth-assertion).
- **Customer API token** (`CustomerAPIToken`) — generated by the customer on their Integration Settings page, with the scopes they choose there. See [Authorization for customers](https://developer.remote.com/docs/authorization-for-customers).

## Scopes

Any one of the scopes in a token type's row is enough. `all:write` works too.

| Token type | Category | Read only Scope | Write only Scope (read access implicit) |
|---|---|---|---|
| Company-scoped access token | Manage projects (`projects`) | - | Manage projects (`project:write`) |
| Company-scoped access token (assertion) | Manage projects (`projects`) | - | Manage projects (`project:write`) |
| Customer API token | Manage projects (`projects`) | - | Manage projects (`project:write`) |

## Path parameters

- `id` string, uuid, required: A unique identifier in UUID v4 format.

## Request body

- UpdateProjectParams: Fields to update on a company project. Every field is optional; omitted fields are left unchanged. `lead_ids` and `team_member_ids` are replaced wholesale when present, so send the complete desired list rather than only the additions. Send an empty list to remove everyone. Fetch the project first to read its current membership.
  - `description` string, nullable: Description of the project.
  - `end_date` string, date, nullable: Date when the project ends.
  - `lead_ids` UuidSlug[]: User IDs of the company admins to assign as the project's leads, replacing the current set. These are user IDs, unlike `team_member_ids`, which are employment IDs.
  - `name` string: Name of the project.
  - `start_date` string, date, nullable: Date when the project starts.
  - `status` 'active' | 'archived' | 'completed'
  - `team_member_ids` UuidSlug[]: Employment IDs of the contractors to assign as the project's team members, replacing the current set. These are employment IDs, unlike `lead_ids`, which are user IDs. Each must be an active contractor of the project's company.

## Response `200`

Success

- ProjectResponse: Response schema for a single company project.
  - `data` object, required
    - `project` Project: Company project
      - `budget` object, nullable, required: A project's budget: amount and its currency.
        - `amount` integer, required: Budget amount, in cents.
        - `currency` string, required: Currency code in [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) format.
      - `code` string, required: Code/identifier of the project.
      - `description` string, nullable: Description of the project.
      - `end_date` string, date, nullable: Date when the project ends.
      - `id` string, uuid, required: Project identifier.
      - `lead_ids` UuidSlug[], required: User IDs of the company admins assigned as the project's leads. These are user IDs, unlike `team_member_ids`, which are employment IDs.
      - `name` string, required: Name of the project.
      - `start_date` string, date, nullable: Date when the project starts.
      - `status` 'active' | 'archived' | 'completed', required
      - `team_member_ids` UuidSlug[], required: Employment IDs of the contractors assigned to the project as team members. These are employment IDs, unlike `lead_ids`, which are user IDs.

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not Found
- `422`: Unprocessable Entity

---

[API](https://skmtc.dev/remote-com/apis/contractors.md) - [All operations](https://skmtc.dev/remote-com/apis/contractors/llms.txt) - [OpenAPI document](https://skmtc.dev/remote-com/apis/contractors/revisions/e1e7f1caaada?raw)
