curl --request POST \
--url https://api.parley.so/v1/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"access": {
"type": "everyone"
},
"accountIds": [
"<string>"
],
"contactIds": [
"<string>"
],
"fields": {}
}
'import requests
url = "https://api.parley.so/v1/projects"
payload = {
"name": "<string>",
"access": { "type": "everyone" },
"accountIds": ["<string>"],
"contactIds": ["<string>"],
"fields": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
access: {type: 'everyone'},
accountIds: ['<string>'],
contactIds: ['<string>'],
fields: {}
})
};
fetch('https://api.parley.so/v1/projects', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'access' => [
'type' => 'everyone'
],
'accountIds' => [
'<string>'
],
'contactIds' => [
'<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"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"access\": {\n \"type\": \"everyone\"\n },\n \"accountIds\": [\n \"<string>\"\n ],\n \"contactIds\": [\n \"<string>\"\n ],\n \"fields\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.parley.so/v1/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"access\": {\n \"type\": \"everyone\"\n },\n \"accountIds\": [\n \"<string>\"\n ],\n \"contactIds\": [\n \"<string>\"\n ],\n \"fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parley.so/v1/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"access\": {\n \"type\": \"everyone\"\n },\n \"accountIds\": [\n \"<string>\"\n ],\n \"contactIds\": [\n \"<string>\"\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": "TOO_MANY_REQUESTS",
"message": "Too many requests."
}
}Create a project
Create a project (matter or case), optionally linked to accounts and contacts. Visible to everyone in the organization unless access is restricted to specific members.
curl --request POST \
--url https://api.parley.so/v1/projects \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"access": {
"type": "everyone"
},
"accountIds": [
"<string>"
],
"contactIds": [
"<string>"
],
"fields": {}
}
'import requests
url = "https://api.parley.so/v1/projects"
payload = {
"name": "<string>",
"access": { "type": "everyone" },
"accountIds": ["<string>"],
"contactIds": ["<string>"],
"fields": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
access: {type: 'everyone'},
accountIds: ['<string>'],
contactIds: ['<string>'],
fields: {}
})
};
fetch('https://api.parley.so/v1/projects', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'access' => [
'type' => 'everyone'
],
'accountIds' => [
'<string>'
],
'contactIds' => [
'<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"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"access\": {\n \"type\": \"everyone\"\n },\n \"accountIds\": [\n \"<string>\"\n ],\n \"contactIds\": [\n \"<string>\"\n ],\n \"fields\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.parley.so/v1/projects")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"access\": {\n \"type\": \"everyone\"\n },\n \"accountIds\": [\n \"<string>\"\n ],\n \"contactIds\": [\n \"<string>\"\n ],\n \"fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.parley.so/v1/projects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"access\": {\n \"type\": \"everyone\"\n },\n \"accountIds\": [\n \"<string>\"\n ],\n \"contactIds\": [\n \"<string>\"\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": "TOO_MANY_REQUESTS",
"message": "Too many requests."
}
}Authorizations
A Parley API key.
Body
Project name.
1Who can access the project. Defaults to everyone in the organization.
- Option 1
- Option 2
Show child attributes
Show child attributes
IDs of accounts to link. At most 100.
1001IDs of contacts to link. At most 100. 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.
1001Custom 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
Created.
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?
