curl 'https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}' \
-H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
-H 'content-type: application/json' \
--data-raw '{"name":"Mainnet Monitoring v2"}'const options = {
method: 'POST',
headers: {'X-Access-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Mainnet Monitoring v2'})
};
fetch('https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}"
payload = { "name": "Mainnet Monitoring v2" }
headers = {
"X-Access-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}"
payload := strings.NewReader("{\n \"name\": \"Mainnet Monitoring v2\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Access-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"project": {
"id": "d66fd37f-e2f8-46c3-b549-0160d60eec96",
"name": "Mainnet Monitoring v2",
"slug": "mainnet-monitoring",
"owner_id": "49309f73-1d60-48fc-94b3-120fd9982381",
"public": false,
"restricted": false,
"high_volume": false,
"in_transfer": false,
"is_module": false,
"created_at": "2026-09-07T16:12:22.895718Z",
"last_push_at": null,
"number_of_users": 1,
"options": null,
"owner": {
"id": "49309f73-1d60-48fc-94b3-120fd9982381",
"first_name": "",
"last_name": "",
"username": "acme",
"email": "",
"type": "organization"
},
"members": [
{
"id": "2f6a3c4e-1b7d-4e0a-9c11-5d2e8a7b9f30",
"username": "jane",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"accepted": true,
"added_at": "2026-09-07T16:12:23.104Z"
}
]
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "bad_request",
"message": "Bad request input parameters"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "unauthorized",
"message": "Unauthorized"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "insufficient_permissions",
"message": "Insufficient permissions"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "resource_not_found",
"message": "The resource you requested could not be found."
}
}{
"error": {
"id": "9a7bbe06-7f6f-4a45-8c78-8d64b9a9d0e1",
"slug": "too_many_requests",
"message": "API Rate limit exceeded."
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "internal_server_error",
"message": "Internal server error"
}
}Update a project
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.
curl 'https://api.tenderly.co/api/v1/account/${TENDERLY_ACCOUNT_SLUG}/project/${TENDERLY_PROJECT_SLUG}' \
-H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \
-H 'content-type: application/json' \
--data-raw '{"name":"Mainnet Monitoring v2"}'const options = {
method: 'POST',
headers: {'X-Access-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Mainnet Monitoring v2'})
};
fetch('https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}"
payload = { "name": "Mainnet Monitoring v2" }
headers = {
"X-Access-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tenderly.co/api/v1/account/{accountSlug}/project/{projectSlug}"
payload := strings.NewReader("{\n \"name\": \"Mainnet Monitoring v2\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Access-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"project": {
"id": "d66fd37f-e2f8-46c3-b549-0160d60eec96",
"name": "Mainnet Monitoring v2",
"slug": "mainnet-monitoring",
"owner_id": "49309f73-1d60-48fc-94b3-120fd9982381",
"public": false,
"restricted": false,
"high_volume": false,
"in_transfer": false,
"is_module": false,
"created_at": "2026-09-07T16:12:22.895718Z",
"last_push_at": null,
"number_of_users": 1,
"options": null,
"owner": {
"id": "49309f73-1d60-48fc-94b3-120fd9982381",
"first_name": "",
"last_name": "",
"username": "acme",
"email": "",
"type": "organization"
},
"members": [
{
"id": "2f6a3c4e-1b7d-4e0a-9c11-5d2e8a7b9f30",
"username": "jane",
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"accepted": true,
"added_at": "2026-09-07T16:12:23.104Z"
}
]
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "bad_request",
"message": "Bad request input parameters"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "unauthorized",
"message": "Unauthorized"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "insufficient_permissions",
"message": "Insufficient permissions"
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "resource_not_found",
"message": "The resource you requested could not be found."
}
}{
"error": {
"id": "9a7bbe06-7f6f-4a45-8c78-8d64b9a9d0e1",
"slug": "too_many_requests",
"message": "API Rate limit exceeded."
}
}{
"error": {
"id": "596b1dc7-af60-477b-aab3-6c93eb92ddfa",
"slug": "internal_server_error",
"message": "Internal server error"
}
}Authorizations
An API key is a token that a client provides when making API calls. Send it as the X-Access-Key request header on any endpoint:
curl '<API_ENDPOINT>' \ -H 'X-Access-Key: ${TENDERLY_ACCESS_KEY}' \ ...
Learn how to generate API access tokens at Tenderly Docs.
Path Parameters
Account slug of the user
Project slug of the account
Body
Project changes
Partial update. Only the fields present in the request are applied; at least one must be present.
New project name, 1 to 100 characters. The slug stays unchanged.
1 - 100"Mainnet Monitoring v2"
Replaces the project options object.
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).
true
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.
["2f6a3c4e-1b7d-4e0a-9c11-5d2e8a7b9f30"]
Response
A successful response.
A Tenderly project.
Show child attributes
Show child attributes