---
title: "Update a project"
method: POST
path: "/v1/account/{accountSlug}/project/{projectSlug}"
tags: ["Projects"]
---

# Update a project

`POST /v1/account/{accountSlug}/project/{projectSlug}`

## Request

- Base URL: `https://api.tenderly.co/api`
- URL: `https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}`
- Auth: one of:
  - API key in header `X-Access-Key`
  - HTTP bearer
- TypeScript: <https://skmtc.dev/tenderly/apis/tenderly-api/docs/v1/account/:accountSlug/project/:projectSlug/post.ts> (a function with typed inputs; its response is checked against the schema)

Partially updates a project: only the fields present in the request are applied, and at least one must be present. Renaming does not change the slug.

`name` and `options` require the update-project permission on the project.

`restricted` and `members` apply to organization projects only and require the organization's update-project permission (the organization owner always has it). They must be sent by a signed-in user; requests authenticated with an access token cannot change them. `members` replaces the full member list, and the organization owner is always kept. Restricting without `members` keeps every current organization member, so who can see the project does not change; restricting with `members` sets the list to exactly the owner plus those members.

Returns the updated project with its member list.

## Path parameters

- `accountSlug` string, required
- `projectSlug` string, required

## Request body

- UpdateProjectPayload: Partial update. Only the fields present in the request are applied; at least one must be present.
  - `name` string: New project name, 1 to 100 characters. The slug stays unchanged.
  - `options` object: Replaces the project options object.
  - `restricted` boolean: Organization projects only. `true` restricts the project to its explicit members; `false` opens it to every organization member. Restricting without `members` keeps every current organization member as a project member, so visibility does not change. Restricting together with `members` sets the member list to exactly the organization owner plus the given members (an empty list means the owner only).
  - `members` string[]: Organization projects only. Replaces the full member list with these principal IDs of accepted organization members. The organization owner is always kept. Cannot be combined with `restricted: false`.

## Response `200`

A successful response.

- object
  - `project` Project: A Tenderly project.
    - `id` string, uuid: Project ID.
    - `name` string: Display name of the project.
    - `slug` string: URL slug of the project, derived from the name at creation. The slug is permanent: renaming the project does not change it.
    - `owner_id` string, uuid: Principal ID of the owning user or organization.
    - `public` boolean
    - `restricted` boolean: `true` when the project is restricted to its explicit members (**Only invited members**). `false` when the project is open to every accepted member of the owning organization (**All members**). Always `false` on personal accounts.
    - `high_volume` boolean
    - `in_transfer` boolean: `true` while a transfer of the project to another account is pending.
    - `is_module` boolean
    - `created_at` string, date-time
    - `last_push_at` string, date-time, nullable: Timestamp of the last contract push to the project, or `null`.
    - `number_of_users` integer: Number of explicit project members. `0` when the requester is not a project member.
    - `options` object, nullable: Project options as a free-form object, or `null` when none are set.
    - `owner` ProjectOwner: The principal that owns the project. Returned to project members only.
      - `id` string, uuid: Principal ID of the owner.
      - `username` string: Username or organization slug of the owner.
      - `first_name` string: First name of the owner. Empty for organizations.
      - `last_name` string: Last name of the owner. Empty for organizations.
      - `email` string: Email address of the owner. Empty when not exposed to the requester.
      - `type` 'user' | 'organization': Principal type of the owner.
    - `permissions` ProjectPermissions: The requester's effective permissions in the project. Returned to project members only.
      - `add_contract` boolean
      - `update_contract` boolean
      - `remove_contract` boolean
      - `create_alert` boolean
      - `update_alert` boolean
      - `remove_alert` boolean
      - `create_and_update_analytics` boolean
      - `manage_collaborators` boolean
    - `members` ProjectMember[]: Explicit project members. Present on single-project responses when the requester can view the project's members. In the projects listing it is populated for restricted projects only, since an open project's audience is the whole organization.
      - `id` string, uuid: Principal ID of the member.
      - `username` string
      - `first_name` string
      - `last_name` string
      - `email` string
      - `accepted` boolean: `true` when the member has access. `false` marks a pending invitee who cannot reach the project yet.
      - `added_at` string, date-time: When the member was added to the project.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: The resource was not found.
- `429`: The request was rate limited. See the [rate limits](#section/Introduction/Rate-limits) section for the current limits and how request counts expire.
- `500`: Server error.

## Changes

- **2026-09-08** `7c89a670fe00`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/tenderly/apis/tenderly-api/changes/v1/account/:accountSlug/project/:projectSlug/post.md)

---

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