curl --request PATCH \
--url https://api.venlyfinance.com/v1/parties/{partyId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"version": 0,
"firstName": "Janet",
"lastName": "Doe"
}
'import requests
url = "https://api.venlyfinance.com/v1/parties/{partyId}"
payload = {
"version": 0,
"firstName": "Janet",
"lastName": "Doe"
}
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({version: 0, firstName: 'Janet', lastName: 'Doe'})
};
fetch('https://api.venlyfinance.com/v1/parties/{partyId}', 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.venlyfinance.com/v1/parties/{partyId}",
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([
'version' => 0,
'firstName' => 'Janet',
'lastName' => 'Doe'
]),
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.venlyfinance.com/v1/parties/{partyId}"
payload := strings.NewReader("{\n \"version\": 0,\n \"firstName\": \"Janet\",\n \"lastName\": \"Doe\"\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.venlyfinance.com/v1/parties/{partyId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"version\": 0,\n \"firstName\": \"Janet\",\n \"lastName\": \"Doe\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.venlyfinance.com/v1/parties/{partyId}")
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 \"version\": 0,\n \"firstName\": \"Janet\",\n \"lastName\": \"Doe\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"id": "7e3b9c2a-1f4d-4a8b-9c11-2d6e8f0a1b22",
"externalId": "user-12345",
"partyType": "INDIVIDUAL",
"status": "ACTIVE",
"firstName": "Janet",
"lastName": "Doe",
"address": {
"addressLine1": "1 Example Street",
"city": "Amsterdam",
"postalCode": "1011AB",
"country": "NL"
},
"createdAt": "2026-01-15T09:30:00Z",
"updatedAt": "2026-01-15T09:30:00Z",
"version": 0
}
}{
"success": false,
"errors": [
{
"code": "invalid-request",
"message": "The request contains invalid parameters."
}
]
}{
"success": false,
"errors": [
{
"code": "unauthenticated",
"message": "Please authenticate to perform this action."
}
]
}{
"success": false,
"errors": [
{
"code": "forbidden",
"message": "You do not have permission to access this resource."
}
]
}{
"success": false,
"errors": [
{
"code": "account-not-found",
"message": "The requested resource was not found."
}
]
}{
"success": false,
"errors": [
{
"code": "concurrent-modification",
"message": "This request has been modified by another user. Please refresh and try again."
}
]
}{
"success": false,
"errors": [
{
"code": "internal-error",
"message": "An unexpected error occurred. Please try again later."
}
]
}Update a party
Update an existing party’s name, VAT number, or address.
curl --request PATCH \
--url https://api.venlyfinance.com/v1/parties/{partyId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"version": 0,
"firstName": "Janet",
"lastName": "Doe"
}
'import requests
url = "https://api.venlyfinance.com/v1/parties/{partyId}"
payload = {
"version": 0,
"firstName": "Janet",
"lastName": "Doe"
}
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({version: 0, firstName: 'Janet', lastName: 'Doe'})
};
fetch('https://api.venlyfinance.com/v1/parties/{partyId}', 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.venlyfinance.com/v1/parties/{partyId}",
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([
'version' => 0,
'firstName' => 'Janet',
'lastName' => 'Doe'
]),
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.venlyfinance.com/v1/parties/{partyId}"
payload := strings.NewReader("{\n \"version\": 0,\n \"firstName\": \"Janet\",\n \"lastName\": \"Doe\"\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.venlyfinance.com/v1/parties/{partyId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"version\": 0,\n \"firstName\": \"Janet\",\n \"lastName\": \"Doe\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.venlyfinance.com/v1/parties/{partyId}")
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 \"version\": 0,\n \"firstName\": \"Janet\",\n \"lastName\": \"Doe\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"result": {
"id": "7e3b9c2a-1f4d-4a8b-9c11-2d6e8f0a1b22",
"externalId": "user-12345",
"partyType": "INDIVIDUAL",
"status": "ACTIVE",
"firstName": "Janet",
"lastName": "Doe",
"address": {
"addressLine1": "1 Example Street",
"city": "Amsterdam",
"postalCode": "1011AB",
"country": "NL"
},
"createdAt": "2026-01-15T09:30:00Z",
"updatedAt": "2026-01-15T09:30:00Z",
"version": 0
}
}{
"success": false,
"errors": [
{
"code": "invalid-request",
"message": "The request contains invalid parameters."
}
]
}{
"success": false,
"errors": [
{
"code": "unauthenticated",
"message": "Please authenticate to perform this action."
}
]
}{
"success": false,
"errors": [
{
"code": "forbidden",
"message": "You do not have permission to access this resource."
}
]
}{
"success": false,
"errors": [
{
"code": "account-not-found",
"message": "The requested resource was not found."
}
]
}{
"success": false,
"errors": [
{
"code": "concurrent-modification",
"message": "This request has been modified by another user. Please refresh and try again."
}
]
}{
"success": false,
"errors": [
{
"code": "internal-error",
"message": "An unexpected error occurred. Please try again later."
}
]
}manage:parties — see Required scopes.
Patches only the fields you send. Include the current version (from a prior read); a stale version returns 409 so you can refetch and retry (see Versioning). partyType cannot be changed after creation.Authorizations
OAuth2 client credentials flow. Token endpoints:
Path Parameters
Unique party identifier
Body
Update party details. Only fields applicable to the party type can be updated. For Individuals: firstName, lastName, address. For Organisations: name, vatNumber, address.
Current version of the party for optimistic locking
First name (Individual only)
100Last name (Individual only)
100Organisation name (Organisation only)
255VAT number (Organisation only)
50Contact email for the party. Optional, but supply a real one up front for an individual on a self-custody account.
When an account holder is onboarded to a partner their email is forwarded with the case. If the party
has none, a synthetic <case-id>@venlyfinance.com address is used so onboarding still proceeds — and
because the partner stores that email write-once, adding a real address later does not replace
the synthetic one. There is no way to correct it afterwards.
255Standardized address format used across all endpoints
Show child attributes
Show child attributes
Was this page helpful?

