curl --request GET \
--url https://sandbox-api.polygon.technology/v0.13/customers \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.13/customers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.polygon.technology/v0.13/customers', 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.13/customers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sandbox-api.polygon.technology/v0.13/customers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-api.polygon.technology/v0.13/customers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.13/customers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "cst_01H9Xa8F5dN6mP3q",
"type": "individual",
"name": "Jane Smith",
"firstName": "Jane",
"middleName": null,
"lastName": "Smith",
"email": "jane@example.com",
"phone": "+12125551234",
"nationality": "US",
"externalId": "usr_12345",
"status": "active",
"hold": {
"code": "verificationRequired",
"message": "<string>"
},
"failure": {
"code": "onboardingRejected",
"message": "<string>",
"retryable": true
},
"signedAgreement": true,
"signedAgreementAt": "2026-03-20T14:15:22Z",
"totalBalance": {
"totalUsd": "1250.00",
"fiatUsd": "1000.00",
"cryptoUsd": "250.00"
},
"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": [
{
"type": "basic",
"status": "pending",
"requirements": {
"complete": [
"<string>"
],
"pending": [
"<string>"
],
"missing": [
"<string>"
],
"issues": [
"<string>"
]
},
"failure": {
"code": "onboardingRejected",
"message": "<string>",
"retryable": true
}
}
],
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"hasMore": true,
"cursor": "<string>"
}{
"error": "Unauthorized",
"code": 1000,
"msg": "unauthorized access",
"status": 401,
"cause": "signature"
}List customers
Returns a paginated list of customers under the current Project.
curl --request GET \
--url https://sandbox-api.polygon.technology/v0.13/customers \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox-api.polygon.technology/v0.13/customers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox-api.polygon.technology/v0.13/customers', 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.13/customers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://sandbox-api.polygon.technology/v0.13/customers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox-api.polygon.technology/v0.13/customers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox-api.polygon.technology/v0.13/customers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "cst_01H9Xa8F5dN6mP3q",
"type": "individual",
"name": "Jane Smith",
"firstName": "Jane",
"middleName": null,
"lastName": "Smith",
"email": "jane@example.com",
"phone": "+12125551234",
"nationality": "US",
"externalId": "usr_12345",
"status": "active",
"hold": {
"code": "verificationRequired",
"message": "<string>"
},
"failure": {
"code": "onboardingRejected",
"message": "<string>",
"retryable": true
},
"signedAgreement": true,
"signedAgreementAt": "2026-03-20T14:15:22Z",
"totalBalance": {
"totalUsd": "1250.00",
"fiatUsd": "1000.00",
"cryptoUsd": "250.00"
},
"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": [
{
"type": "basic",
"status": "pending",
"requirements": {
"complete": [
"<string>"
],
"pending": [
"<string>"
],
"missing": [
"<string>"
],
"issues": [
"<string>"
]
},
"failure": {
"code": "onboardingRejected",
"message": "<string>",
"retryable": true
}
}
],
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}
],
"hasMore": true,
"cursor": "<string>"
}{
"error": "Unauthorized",
"code": 1000,
"msg": "unauthorized access",
"status": 401,
"cause": "signature"
}Authorizations
Token from POST /auth/token
Query Parameters
Filter by status. Default returns all. A page holds only the customers that match, so it can hold fewer than limit; keep paging while hasMore is true.
pending, actionRequired, active, rejected, offboarded Filter by exact email match.
Filter by externalId.
Filter customers created after this timestamp.
Filter customers created before this timestamp.
x <= 100Response
List of customers
Hide child attributes
Hide child attributes
"cst_01H9Xa8F5dN6mP3q"
Customer type. Individuals are subject to the project's KYC policy, businesses to its KYB policy.
individual, business "individual"
An individual's first, middle and last names joined by spaces, or a business's legal name. Left out when the customer has no name.
"Jane Smith"
"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"
Where the customer is in onboarding. actionRequired carries a hold saying what to do, and rejected carries a failure. offboarded is a deleted or deactivated customer.
pending, actionRequired, active, rejected, offboarded "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"
USD rollup of a customer's balances. Returned on GET /customers/{id} only — never on list, create, or update. Covers fiat wallets and custodial crypto wallets; noncustodial wallets are not yet valued, so a customer holding one reads an undercount here. Omitted entirely when the rollup cannot be read; a partial total is never returned, so treat an absent field as "unknown", not as zero.
Hide child attributes
Hide child attributes
fiatUsd + cryptoUsd, 2 decimal places, sign preserved.
"1250.00"
Sum of the customer's USD fiat wallet balances as last reported by the holding bank. Can be negative — an ACH clawback can overdraw a deposit account — so render the sign verbatim and never clamp.
"1000.00"
Sum of the customer's custodial crypto wallet balances at the custodian's own per-asset USD estimate. "0.00" for a customer with no custodial crypto account.
"250.00"
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"
What the customer is endorsed for. An endorsement never reads further along than its customer, and one that was not requested is left out.
Hide child attributes
Hide child attributes
basic, cryptoCustody, usd pending, actionRequired, active, rejected, offboarded Opaque pagination cursor — pass back as the cursor query param to fetch the next page. Absent on the last page.
Was this page helpful?