curl --request PATCH \
--url https://api.parley.so/v1/projects/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"accountIds": {
"add": [
"<string>"
],
"remove": [
"<string>"
]
},
"contactIds": {
"add": [
"<string>"
],
"remove": [
"<string>"
]
},
"fields": {}
}
'import requests
url = "https://api.parley.so/v1/projects/{id}"
payload = {
"name": "<string>",
"accountIds": {
"add": ["<string>"],
"remove": ["<string>"]
},
"contactIds": {
"add": ["<string>"],
"remove": ["<string>"]
},
"fields": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
accountIds: {add: ['<string>'], remove: ['<string>']},
contactIds: {add: ['<string>'], remove: ['<string>']},
fields: {}
})
};
fetch('https://api.parley.so/v1/projects/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.parley.so/v1/projects/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'accountIds' => [
'add' => [
'<string>'
],
'remove' => [
'<string>'
]
],
'contactIds' => [
'add' => [
'<string>'
],
'remove' => [
'<string>'
]
],
'fields' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.parley.so/v1/projects/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"accountIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"contactIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"fields\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}HttpResponse<String> response = Unirest.patch("https://api.parley.so/v1/projects/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"accountIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"contactIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parley.so/v1/projects/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"accountIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"contactIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"fields\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "cmf2x8k0q0001abcd",
"name": "Acme Corp H-1B petition",
"access": {
"type": "everyone"
},
"accounts": [
{
"type": "account",
"id": "cmf2x7r1p0000abcd",
"name": "Acme Corp"
}
],
"contacts": [
{
"type": "contact",
"id": "cmf2x7z3e0002abcd",
"name": "Ada Lovelace"
}
],
"createdAt": "2026-10-01T15:04:05.000Z",
"updatedAt": "2026-10-02T09:30:00.000Z",
"fields": {
"Matter Number": "IMM-2041",
"Target Date": null
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "The request is invalid.",
"details": {
"issues": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid credentials."
}
}{
"error": {
"code": "FORBIDDEN",
"message": "You don't have permission to do this."
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Not found."
}
}{
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests."
}
}Update a project
Rename a project (matter or case), change its linked accounts and contacts, or set its custom field values. Omitted fields are left unchanged.
curl --request PATCH \
--url https://api.parley.so/v1/projects/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"accountIds": {
"add": [
"<string>"
],
"remove": [
"<string>"
]
},
"contactIds": {
"add": [
"<string>"
],
"remove": [
"<string>"
]
},
"fields": {}
}
'import requests
url = "https://api.parley.so/v1/projects/{id}"
payload = {
"name": "<string>",
"accountIds": {
"add": ["<string>"],
"remove": ["<string>"]
},
"contactIds": {
"add": ["<string>"],
"remove": ["<string>"]
},
"fields": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
accountIds: {add: ['<string>'], remove: ['<string>']},
contactIds: {add: ['<string>'], remove: ['<string>']},
fields: {}
})
};
fetch('https://api.parley.so/v1/projects/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.parley.so/v1/projects/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'accountIds' => [
'add' => [
'<string>'
],
'remove' => [
'<string>'
]
],
'contactIds' => [
'add' => [
'<string>'
],
'remove' => [
'<string>'
]
],
'fields' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.parley.so/v1/projects/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"accountIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"contactIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"fields\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}HttpResponse<String> response = Unirest.patch("https://api.parley.so/v1/projects/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"accountIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"contactIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parley.so/v1/projects/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"accountIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"contactIds\": {\n \"add\": [\n \"<string>\"\n ],\n \"remove\": [\n \"<string>\"\n ]\n },\n \"fields\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "cmf2x8k0q0001abcd",
"name": "Acme Corp H-1B petition",
"access": {
"type": "everyone"
},
"accounts": [
{
"type": "account",
"id": "cmf2x7r1p0000abcd",
"name": "Acme Corp"
}
],
"contacts": [
{
"type": "contact",
"id": "cmf2x7z3e0002abcd",
"name": "Ada Lovelace"
}
],
"createdAt": "2026-10-01T15:04:05.000Z",
"updatedAt": "2026-10-02T09:30:00.000Z",
"fields": {
"Matter Number": "IMM-2041",
"Target Date": null
}
}{
"error": {
"code": "VALIDATION_FAILED",
"message": "The request is invalid.",
"details": {
"issues": [
{
"path": "<string>",
"message": "<string>"
}
]
}
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid credentials."
}
}{
"error": {
"code": "FORBIDDEN",
"message": "You don't have permission to do this."
}
}{
"error": {
"code": "NOT_FOUND",
"message": "Not found."
}
}{
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests."
}
}Authorizations
A Parley API key.
Path Parameters
The project ID.
1Body
Project name.
1Links to accounts to add or remove. Links you don't mention are left unchanged. An account can't be unlinked while contacts that belong to it stay linked: unlink them in the same call.
Show child attributes
Show child attributes
Links to contacts to add or remove. Links you don't mention are left unchanged. A contact that belongs to an account can only be linked along with that account. Link both in the same call, or link the contact to a project with no accounts and its account is linked too.
Show child attributes
Show child attributes
Custom field values to set on the project, keyed by field name or ID. A value replaces the current one, null clears it, and fields you don't mention are left alone. Each value must match its field's type: a string for text, long_text, email, url, single_select (one of the field's options), and user (the id of an active user in the organization); a number; true or false; an ISO 8601 date-time or YYYY-MM-DD date; a list of strings for collection ([] clears it); or { streetAddress, cityTown, state, country } for address. At most 50 fields.
Show child attributes
Show child attributes
Response
OK
The project ID.
1Project name.
1Who can see the project: everyone in the organization, or only its members.
- Option 1
- Option 2
Show child attributes
Show child attributes
The accounts linked to the project. Direct links only: the accountId filter on the project list also matches projects linked through one of the account's contacts.
Show child attributes
Show child attributes
The contacts linked to the project.
Show child attributes
Show child attributes
When the project was created.
When the project was last updated, including changes to its linked accounts and contacts. Field value changes do not change it.
Custom field values, keyed by field name, with a key for every field defined for projects (null when unset). The value's shape follows the field's type.
Show child attributes
Show child attributes
Was this page helpful?
