curl --request PATCH \
--url https://api.vaquill.ai/workspace/v1/clients/{clientId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Acme Corporation",
"email": "counsel@acme.example",
"phone": "+1 415 555 0142",
"address": "500 Howard Street",
"city": "San Francisco",
"state": "CA",
"zipCode": "94105",
"country": "US",
"clientType": "individual",
"taxId": "94-3211110",
"notes": "Primary contact is in-house counsel, not procurement.",
"metadata": {
"externalId": "CRM-4471"
}
}
'import requests
url = "https://api.vaquill.ai/workspace/v1/clients/{clientId}"
payload = {
"name": "Acme Corporation",
"email": "counsel@acme.example",
"phone": "+1 415 555 0142",
"address": "500 Howard Street",
"city": "San Francisco",
"state": "CA",
"zipCode": "94105",
"country": "US",
"clientType": "individual",
"taxId": "94-3211110",
"notes": "Primary contact is in-house counsel, not procurement.",
"metadata": { "externalId": "CRM-4471" }
}
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: 'Acme Corporation',
email: 'counsel@acme.example',
phone: '+1 415 555 0142',
address: '500 Howard Street',
city: 'San Francisco',
state: 'CA',
zipCode: '94105',
country: 'US',
clientType: 'individual',
taxId: '94-3211110',
notes: 'Primary contact is in-house counsel, not procurement.',
metadata: {externalId: 'CRM-4471'}
})
};
fetch('https://api.vaquill.ai/workspace/v1/clients/{clientId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/workspace/v1/clients/{clientId}"
payload := strings.NewReader("{\n \"name\": \"Acme Corporation\",\n \"email\": \"counsel@acme.example\",\n \"phone\": \"+1 415 555 0142\",\n \"address\": \"500 Howard Street\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94105\",\n \"country\": \"US\",\n \"clientType\": \"individual\",\n \"taxId\": \"94-3211110\",\n \"notes\": \"Primary contact is in-house counsel, not procurement.\",\n \"metadata\": {\n \"externalId\": \"CRM-4471\"\n }\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))
}{
"id": "cli_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"name": "Acme Corporation",
"email": "counsel@acme.example",
"phone": "+1 415 555 0142",
"address": "500 Howard Street",
"city": "San Francisco",
"state": "CA",
"zipCode": "94105",
"country": "US",
"clientType": "organization",
"taxId": "94-3211110",
"notes": "Primary contact is in-house counsel, not procurement.",
"metadata": {
"externalId": "CRM-4471"
},
"createdAt": "2026-08-19T14:32:10Z",
"updatedAt": "2026-08-19T14:32:10Z"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"errors": [
{
"location": "<string>",
"message": "<string>",
"type": "<string>"
}
],
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}Update a client
Apply a partial update to a client.
Omitted fields are left alone; an explicit null clears the field. name
is the one field that cannot be nulled, since the column is NOT NULL. An
empty body is refused rather than reported as a successful no-op.
curl --request PATCH \
--url https://api.vaquill.ai/workspace/v1/clients/{clientId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Acme Corporation",
"email": "counsel@acme.example",
"phone": "+1 415 555 0142",
"address": "500 Howard Street",
"city": "San Francisco",
"state": "CA",
"zipCode": "94105",
"country": "US",
"clientType": "individual",
"taxId": "94-3211110",
"notes": "Primary contact is in-house counsel, not procurement.",
"metadata": {
"externalId": "CRM-4471"
}
}
'import requests
url = "https://api.vaquill.ai/workspace/v1/clients/{clientId}"
payload = {
"name": "Acme Corporation",
"email": "counsel@acme.example",
"phone": "+1 415 555 0142",
"address": "500 Howard Street",
"city": "San Francisco",
"state": "CA",
"zipCode": "94105",
"country": "US",
"clientType": "individual",
"taxId": "94-3211110",
"notes": "Primary contact is in-house counsel, not procurement.",
"metadata": { "externalId": "CRM-4471" }
}
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: 'Acme Corporation',
email: 'counsel@acme.example',
phone: '+1 415 555 0142',
address: '500 Howard Street',
city: 'San Francisco',
state: 'CA',
zipCode: '94105',
country: 'US',
clientType: 'individual',
taxId: '94-3211110',
notes: 'Primary contact is in-house counsel, not procurement.',
metadata: {externalId: 'CRM-4471'}
})
};
fetch('https://api.vaquill.ai/workspace/v1/clients/{clientId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/workspace/v1/clients/{clientId}"
payload := strings.NewReader("{\n \"name\": \"Acme Corporation\",\n \"email\": \"counsel@acme.example\",\n \"phone\": \"+1 415 555 0142\",\n \"address\": \"500 Howard Street\",\n \"city\": \"San Francisco\",\n \"state\": \"CA\",\n \"zipCode\": \"94105\",\n \"country\": \"US\",\n \"clientType\": \"individual\",\n \"taxId\": \"94-3211110\",\n \"notes\": \"Primary contact is in-house counsel, not procurement.\",\n \"metadata\": {\n \"externalId\": \"CRM-4471\"\n }\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))
}{
"id": "cli_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"name": "Acme Corporation",
"email": "counsel@acme.example",
"phone": "+1 415 555 0142",
"address": "500 Howard Street",
"city": "San Francisco",
"state": "CA",
"zipCode": "94105",
"country": "US",
"clientType": "organization",
"taxId": "94-3211110",
"notes": "Primary contact is in-house counsel, not procurement.",
"metadata": {
"externalId": "CRM-4471"
},
"createdAt": "2026-08-19T14:32:10Z",
"updatedAt": "2026-08-19T14:32:10Z"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"errors": [
{
"location": "<string>",
"message": "<string>",
"type": "<string>"
}
],
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}{
"type": "https://vaquill.ai/docs/workspace-api/errors/insufficient-scope",
"title": "Insufficient scope",
"status": 403,
"detail": "This credential carries matters:read. This operation needs matters:write.",
"instance": "/workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6",
"requestId": "req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
}Authorizations
Workspace credential issued from the automation console at /automation. Send it as Authorization: Bearer vq_ws_.... This is NOT a Data API key: a vq_key_ credential is refused here and names the other product in the error.
Path Parameters
cli_ identifier of the client. Take it from GET /v1/clients.
Body
A partial update. Absent leaves alone; explicit null clears.
New display name. Cannot be set to null; omit it to leave the name alone.
1 - 200"Acme Corporation"
New email address, or null to clear it.
255"counsel@acme.example"
New phone number, or null to clear it.
30"+1 415 555 0142"
New street address, or null to clear it.
500"500 Howard Street"
New city, or null to clear it.
100"San Francisco"
New state or region, or null to clear it.
100"CA"
New postal code, or null to clear it.
20"94105"
New country as free text, or null to clear it.
100"US"
New client type, or null to clear it.
individual, organization, corporation "individual"
New tax or registration number, or null to clear it.
50"94-3211110"
New notes, or null to clear them.
10000"Primary contact is in-house counsel, not procurement."
Replacement metadata object, or null to clear it. Not merged with what is stored.
Response
Successful Response
A client as this API publishes it.
Public identifier, cli_ followed by 32 hex characters.
"cli_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6"
The client's display name, as the customer entered it.
"Acme Corporation"
Primary contact email address.
"counsel@acme.example"
Primary contact phone number, stored as written and not normalized.
"+1 415 555 0142"
Street address, one free-text line.
"500 Howard Street"
City or town.
"San Francisco"
State, province or region.
"CA"
Postal or ZIP code.
"94105"
Country as free text, NOT an ISO code. matters.country is a two-letter code; this column is not.
"US"
What kind of client this is. Usually one of individual, organization or corporation, but published as a plain string because the column's CHECK is the only thing constraining it. Do not branch on it without a fallback.
"organization"
Tax or company registration number.
"94-3211110"
Free-text notes the customer keeps against this client.
"Primary contact is in-house counsel, not procurement."
Arbitrary JSON the customer stores against the client. Vaquill never reads it.
When the client was created (RFC 3339). Absent on a small number of rows that predate the column default.
"2026-08-19T14:32:10Z"
When the client was last modified (RFC 3339).
"2026-08-19T14:32:10Z"
Was this page helpful?

