curl --request PATCH \
--url https://sandbox-api.polygon.technology/v0.11/customers/{customerId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "<string>",
"middleName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"birthDate": "<string>",
"nationality": "<string>",
"ipAddress": "<string>",
"externalId": "<string>",
"signedAgreement": true,
"residentialAddress": {
"line1": "123 Main St",
"line2": "<string>",
"city": "New York",
"state": "NY",
"country": "US",
"zipCode": "10001"
},
"identifyingInformation": [
{
"type": "ssn",
"issuingCountry": "US",
"number": "123456789"
}
],
"endorsements": [],
"metadata": {}
}
'import requests
url = "https://sandbox-api.polygon.technology/v0.11/customers/{customerId}"
payload = {
"firstName": "<string>",
"middleName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"birthDate": "<string>",
"nationality": "<string>",
"ipAddress": "<string>",
"externalId": "<string>",
"signedAgreement": True,
"residentialAddress": {
"line1": "123 Main St",
"line2": "<string>",
"city": "New York",
"state": "NY",
"country": "US",
"zipCode": "10001"
},
"identifyingInformation": [
{
"type": "ssn",
"issuingCountry": "US",
"number": "123456789"
}
],
"endorsements": [],
"metadata": {}
}
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({
firstName: '<string>',
middleName: '<string>',
lastName: '<string>',
email: '<string>',
phone: '<string>',
birthDate: '<string>',
nationality: '<string>',
ipAddress: '<string>',
externalId: '<string>',
signedAgreement: true,
residentialAddress: {
line1: '123 Main St',
line2: '<string>',
city: 'New York',
state: 'NY',
country: 'US',
zipCode: '10001'
},
identifyingInformation: [{type: 'ssn', issuingCountry: 'US', number: '123456789'}],
endorsements: [],
metadata: {}
})
};
fetch('https://sandbox-api.polygon.technology/v0.11/customers/{customerId}', 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://sandbox-api.polygon.technology/v0.11/customers/{customerId}",
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([
'firstName' => '<string>',
'middleName' => '<string>',
'lastName' => '<string>',
'email' => '<string>',
'phone' => '<string>',
'birthDate' => '<string>',
'nationality' => '<string>',
'ipAddress' => '<string>',
'externalId' => '<string>',
'signedAgreement' => true,
'residentialAddress' => [
'line1' => '123 Main St',
'line2' => '<string>',
'city' => 'New York',
'state' => 'NY',
'country' => 'US',
'zipCode' => '10001'
],
'identifyingInformation' => [
[
'type' => 'ssn',
'issuingCountry' => 'US',
'number' => '123456789'
]
],
'endorsements' => [
],
'metadata' => [
]
]),
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://sandbox-api.polygon.technology/v0.11/customers/{customerId}"
payload := strings.NewReader("{\n \"firstName\": \"<string>\",\n \"middleName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"birthDate\": \"<string>\",\n \"nationality\": \"<string>\",\n \"ipAddress\": \"<string>\",\n \"externalId\": \"<string>\",\n \"signedAgreement\": true,\n \"residentialAddress\": {\n \"line1\": \"123 Main St\",\n \"line2\": \"<string>\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"zipCode\": \"10001\"\n },\n \"identifyingInformation\": [\n {\n \"type\": \"ssn\",\n \"issuingCountry\": \"US\",\n \"number\": \"123456789\"\n }\n ],\n \"endorsements\": [],\n \"metadata\": {}\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://sandbox-api.polygon.technology/v0.11/customers/{customerId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"<string>\",\n \"middleName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"birthDate\": \"<string>\",\n \"nationality\": \"<string>\",\n \"ipAddress\": \"<string>\",\n \"externalId\": \"<string>\",\n \"signedAgreement\": true,\n \"residentialAddress\": {\n \"line1\": \"123 Main St\",\n \"line2\": \"<string>\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"zipCode\": \"10001\"\n },\n \"identifyingInformation\": [\n {\n \"type\": \"ssn\",\n \"issuingCountry\": \"US\",\n \"number\": \"123456789\"\n }\n ],\n \"endorsements\": [],\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.11/customers/{customerId}")
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 \"firstName\": \"<string>\",\n \"middleName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"birthDate\": \"<string>\",\n \"nationality\": \"<string>\",\n \"ipAddress\": \"<string>\",\n \"externalId\": \"<string>\",\n \"signedAgreement\": true,\n \"residentialAddress\": {\n \"line1\": \"123 Main St\",\n \"line2\": \"<string>\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"zipCode\": \"10001\"\n },\n \"identifyingInformation\": [\n {\n \"type\": \"ssn\",\n \"issuingCountry\": \"US\",\n \"number\": \"123456789\"\n }\n ],\n \"endorsements\": [],\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "cst_01H9Xa8F5dN6mP3q",
"object": "customer",
"type": "individual",
"firstName": "Jane",
"middleName": null,
"lastName": "Smith",
"email": "jane@example.com",
"phone": "+12125551234",
"nationality": "US",
"externalId": "usr_12345",
"status": "active",
"signedAgreement": true,
"signedAgreementAt": "2026-03-20T14:15:22Z",
"wallets": [
{
"id": "wlt_01H9Xb3K7nM2pQ4r",
"type": "custodial",
"address": "0x7B3a9F2c4D1eA8bF6390cE5d2B7fA104C8e3D9b1",
"network": "polygon",
"asset": "usdc",
"balance": "1234.56",
"estimatedValueUsd": "1234.56",
"createdAt": "2023-11-07T05:31:56Z"
}
],
"endorsements": [
{
"rejectionReasons": [
{
"developerReason": "<string>",
"reason": "<string>"
}
],
"requirements": {
"complete": [
"<string>"
],
"pending": [
"<string>"
],
"missing": [
"<string>"
],
"issues": [
"<string>"
]
}
}
],
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"error": "Unauthorized",
"code": 1000,
"msg": "unauthorized access",
"status": 401,
"cause": "signature"
}{
"error": "Unauthorized",
"code": 1000,
"msg": "unauthorized access",
"status": 401,
"cause": "signature"
}Update a customer
Partial update. Only include fields you want to change. Compliance-relevant changes (residentialAddress, lastName, identifyingInformation, ipAddress) may trigger endorsement re-evaluation. Including endorsement names in the endorsements array explicitly triggers re-evaluation.
curl --request PATCH \
--url https://sandbox-api.polygon.technology/v0.11/customers/{customerId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"firstName": "<string>",
"middleName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"birthDate": "<string>",
"nationality": "<string>",
"ipAddress": "<string>",
"externalId": "<string>",
"signedAgreement": true,
"residentialAddress": {
"line1": "123 Main St",
"line2": "<string>",
"city": "New York",
"state": "NY",
"country": "US",
"zipCode": "10001"
},
"identifyingInformation": [
{
"type": "ssn",
"issuingCountry": "US",
"number": "123456789"
}
],
"endorsements": [],
"metadata": {}
}
'import requests
url = "https://sandbox-api.polygon.technology/v0.11/customers/{customerId}"
payload = {
"firstName": "<string>",
"middleName": "<string>",
"lastName": "<string>",
"email": "<string>",
"phone": "<string>",
"birthDate": "<string>",
"nationality": "<string>",
"ipAddress": "<string>",
"externalId": "<string>",
"signedAgreement": True,
"residentialAddress": {
"line1": "123 Main St",
"line2": "<string>",
"city": "New York",
"state": "NY",
"country": "US",
"zipCode": "10001"
},
"identifyingInformation": [
{
"type": "ssn",
"issuingCountry": "US",
"number": "123456789"
}
],
"endorsements": [],
"metadata": {}
}
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({
firstName: '<string>',
middleName: '<string>',
lastName: '<string>',
email: '<string>',
phone: '<string>',
birthDate: '<string>',
nationality: '<string>',
ipAddress: '<string>',
externalId: '<string>',
signedAgreement: true,
residentialAddress: {
line1: '123 Main St',
line2: '<string>',
city: 'New York',
state: 'NY',
country: 'US',
zipCode: '10001'
},
identifyingInformation: [{type: 'ssn', issuingCountry: 'US', number: '123456789'}],
endorsements: [],
metadata: {}
})
};
fetch('https://sandbox-api.polygon.technology/v0.11/customers/{customerId}', 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://sandbox-api.polygon.technology/v0.11/customers/{customerId}",
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([
'firstName' => '<string>',
'middleName' => '<string>',
'lastName' => '<string>',
'email' => '<string>',
'phone' => '<string>',
'birthDate' => '<string>',
'nationality' => '<string>',
'ipAddress' => '<string>',
'externalId' => '<string>',
'signedAgreement' => true,
'residentialAddress' => [
'line1' => '123 Main St',
'line2' => '<string>',
'city' => 'New York',
'state' => 'NY',
'country' => 'US',
'zipCode' => '10001'
],
'identifyingInformation' => [
[
'type' => 'ssn',
'issuingCountry' => 'US',
'number' => '123456789'
]
],
'endorsements' => [
],
'metadata' => [
]
]),
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://sandbox-api.polygon.technology/v0.11/customers/{customerId}"
payload := strings.NewReader("{\n \"firstName\": \"<string>\",\n \"middleName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"birthDate\": \"<string>\",\n \"nationality\": \"<string>\",\n \"ipAddress\": \"<string>\",\n \"externalId\": \"<string>\",\n \"signedAgreement\": true,\n \"residentialAddress\": {\n \"line1\": \"123 Main St\",\n \"line2\": \"<string>\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"zipCode\": \"10001\"\n },\n \"identifyingInformation\": [\n {\n \"type\": \"ssn\",\n \"issuingCountry\": \"US\",\n \"number\": \"123456789\"\n }\n ],\n \"endorsements\": [],\n \"metadata\": {}\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://sandbox-api.polygon.technology/v0.11/customers/{customerId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"firstName\": \"<string>\",\n \"middleName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"birthDate\": \"<string>\",\n \"nationality\": \"<string>\",\n \"ipAddress\": \"<string>\",\n \"externalId\": \"<string>\",\n \"signedAgreement\": true,\n \"residentialAddress\": {\n \"line1\": \"123 Main St\",\n \"line2\": \"<string>\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"zipCode\": \"10001\"\n },\n \"identifyingInformation\": [\n {\n \"type\": \"ssn\",\n \"issuingCountry\": \"US\",\n \"number\": \"123456789\"\n }\n ],\n \"endorsements\": [],\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.11/customers/{customerId}")
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 \"firstName\": \"<string>\",\n \"middleName\": \"<string>\",\n \"lastName\": \"<string>\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"birthDate\": \"<string>\",\n \"nationality\": \"<string>\",\n \"ipAddress\": \"<string>\",\n \"externalId\": \"<string>\",\n \"signedAgreement\": true,\n \"residentialAddress\": {\n \"line1\": \"123 Main St\",\n \"line2\": \"<string>\",\n \"city\": \"New York\",\n \"state\": \"NY\",\n \"country\": \"US\",\n \"zipCode\": \"10001\"\n },\n \"identifyingInformation\": [\n {\n \"type\": \"ssn\",\n \"issuingCountry\": \"US\",\n \"number\": \"123456789\"\n }\n ],\n \"endorsements\": [],\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"id": "cst_01H9Xa8F5dN6mP3q",
"object": "customer",
"type": "individual",
"firstName": "Jane",
"middleName": null,
"lastName": "Smith",
"email": "jane@example.com",
"phone": "+12125551234",
"nationality": "US",
"externalId": "usr_12345",
"status": "active",
"signedAgreement": true,
"signedAgreementAt": "2026-03-20T14:15:22Z",
"wallets": [
{
"id": "wlt_01H9Xb3K7nM2pQ4r",
"type": "custodial",
"address": "0x7B3a9F2c4D1eA8bF6390cE5d2B7fA104C8e3D9b1",
"network": "polygon",
"asset": "usdc",
"balance": "1234.56",
"estimatedValueUsd": "1234.56",
"createdAt": "2023-11-07T05:31:56Z"
}
],
"endorsements": [
{
"rejectionReasons": [
{
"developerReason": "<string>",
"reason": "<string>"
}
],
"requirements": {
"complete": [
"<string>"
],
"pending": [
"<string>"
],
"missing": [
"<string>"
],
"issues": [
"<string>"
]
}
}
],
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"error": "Unauthorized",
"code": 1000,
"msg": "unauthorized access",
"status": 401,
"cause": "signature"
}{
"error": "Unauthorized",
"code": 1000,
"msg": "unauthorized access",
"status": 401,
"cause": "signature"
}Authorizations
Token from POST /auth/token
Path Parameters
Body
Partial update — only send the fields you want to change. All optional fields from CustomerRequest can be updated (including ipAddress). PII fields are write-only.
One-way operation — cannot be set back to false.
Customer's residential address.
Hide child attributes
Hide child attributes
Appends to existing array. To replace an entry, submit the same type with updated fields.
Hide child attributes
Hide child attributes
ssn, itin, driversLicense, passport "ssn"
ISO 3166-1 alpha-2 country code.
"US"
The identification number.
"123456789"
Request additional endorsements. New endorsements are added; existing ones are not removed. Including endorsement names triggers re-evaluation.
basic, cryptoCustody, usd Response
Customer updated
Customer response object. PII fields (birthDate, residentialAddress, ipAddress, identifyingInformation) are write-only — accepted in POST/PATCH but never returned in responses.
"cst_01H9Xa8F5dN6mP3q"
"customer"
Customer type. Only individual is supported for MVP.
individual "individual"
"Jane"
null
"Smith"
"jane@example.com"
Primary phone in E.164 format.
"+12125551234"
ISO 3166-1 alpha-2 country code.
"US"
Developer's own user ID for cross-referencing.
"usr_12345"
active or inactive. Inactive customers cannot create new transactions. No intermediate states — all granularity lives in endorsement statuses.
active, inactive "active"
Whether the customer has accepted OMS terms of service.
true
Timestamp when signedAgreement was set to true. Null if not yet signed.
"2026-03-20T14:15:22Z"
Simplified flat view: one entry per wallet-asset combination. Use GET /wallets/{id} for the full representation.
Hide child attributes
Hide child attributes
"wlt_01H9Xb3K7nM2pQ4r"
"custodial"
"0x7B3a9F2c4D1eA8bF6390cE5d2B7fA104C8e3D9b1"
"polygon"
"usdc"
"1234.56"
"1234.56"
Endorsements track KYC/compliance status. Types: basic, cryptoCustody, usd. Statuses use SCREAMING_CASE: INACTIVE, PENDING, ISSUES, ACTIVE, REJECTED, REVOKED_ISSUES, OFFBOARDED.
Hide child attributes
Hide child attributes
basic, cryptoCustody, usd INACTIVE, PENDING, ISSUES, ACTIVE, REJECTED, REVOKED_ISSUES, OFFBOARDED Was this page helpful?