curl --request PUT \
--url https://api.range.org/v2/accounts/{id}/team \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"team_id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11"
}
'import requests
url = "https://api.range.org/v2/accounts/{id}/team"
payload = { "team_id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11" }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({team_id: '0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11'})
};
fetch('https://api.range.org/v2/accounts/{id}/team', 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.range.org/v2/accounts/{id}/team",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'team_id' => '0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.range.org/v2/accounts/{id}/team"
payload := strings.NewReader("{\n \"team_id\": \"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.put("https://api.range.org/v2/accounts/{id}/team")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"team_id\": \"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/accounts/{id}/team")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"team_id\": \"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11\"\n}"
response = http.request(request)
puts response.read_body{
"id": "bje5mmbqxjvwjaf7oxwpyxntxdyspzZyt4vwennw5rug",
"type": "eoa",
"provider": "ledger, kraken, wallet, ...",
"groups": [
{
"id": "uuid-1",
"name": "Finance"
}
],
"status": "active",
"balances": [
{
"asset": "USDC",
"amount": "100.50",
"updated_at": "2024-01-01T00:00:00.000Z",
"symbol": "USDC",
"name": "USD Coin",
"usd": "100.50",
"price_updated_at": "2024-01-01T00:00:00.000Z",
"price_source": "coingecko",
"denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"asset_id": "ethereum:native"
}
],
"name": "Treasury wallet",
"network": "solana",
"address": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"team": {
"id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11",
"name": "Treasury"
},
"balances_usd": "1234.56",
"hidden_count": 0,
"hidden_usd": "340.12",
"balances_updated_at": "2024-01-01T00:00:00.000Z",
"details": {
"network": "solana",
"address": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"funded_by": {
"sender": "<string>",
"tx_hash": "<string>",
"tx_time": "<string>"
}
},
"notes": "Primary treasury wallet",
"role": "Treasury",
"books": "house",
"entity_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"entity": {
"id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"name": "Acme Participações Ltda",
"types": [
"client"
]
},
"regulatory": {
"custodian_code": "Z1234567",
"custodian_country": "BR",
"ownership": "client",
"is_staking": false
},
"cadoc_5710": {
"address_type": "CUSTODIA_PROPRIA_SEGREGADO",
"wallet_type": "FRIA"
},
"cadoc_5711": {
"client_tax_id": "52998224725",
"client_tax_id_type": "cpf"
},
"treasury_statement": {},
"last_synced_at": "2026-01-01T00:00:00.000Z",
"transactions_history_from": "2026-07-01T00:00:00.000Z",
"sync_unavailable_reason": "provider_region_unsupported",
"sync_status": "succeeded",
"last_balance_refresh_at": "2026-01-01T00:00:00.000Z",
"last_balance_refresh_reason": "provider_timeout",
"last_balance_refresh_status": "succeeded"
}Assign an account to a team, or detach it
Sets team_id on the account. Admin session only (API keys are refused). team_id must be a team of the caller workspace, otherwise 400 with code UNKNOWN_TEAM; null detaches the account from its team. Returns the updated account in the same shape as GET /accounts/:id.
curl --request PUT \
--url https://api.range.org/v2/accounts/{id}/team \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"team_id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11"
}
'import requests
url = "https://api.range.org/v2/accounts/{id}/team"
payload = { "team_id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11" }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({team_id: '0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11'})
};
fetch('https://api.range.org/v2/accounts/{id}/team', 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.range.org/v2/accounts/{id}/team",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'team_id' => '0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.range.org/v2/accounts/{id}/team"
payload := strings.NewReader("{\n \"team_id\": \"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.put("https://api.range.org/v2/accounts/{id}/team")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"team_id\": \"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/accounts/{id}/team")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"team_id\": \"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11\"\n}"
response = http.request(request)
puts response.read_body{
"id": "bje5mmbqxjvwjaf7oxwpyxntxdyspzZyt4vwennw5rug",
"type": "eoa",
"provider": "ledger, kraken, wallet, ...",
"groups": [
{
"id": "uuid-1",
"name": "Finance"
}
],
"status": "active",
"balances": [
{
"asset": "USDC",
"amount": "100.50",
"updated_at": "2024-01-01T00:00:00.000Z",
"symbol": "USDC",
"name": "USD Coin",
"usd": "100.50",
"price_updated_at": "2024-01-01T00:00:00.000Z",
"price_source": "coingecko",
"denom": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"asset_id": "ethereum:native"
}
],
"name": "Treasury wallet",
"network": "solana",
"address": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"team": {
"id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11",
"name": "Treasury"
},
"balances_usd": "1234.56",
"hidden_count": 0,
"hidden_usd": "340.12",
"balances_updated_at": "2024-01-01T00:00:00.000Z",
"details": {
"network": "solana",
"address": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"funded_by": {
"sender": "<string>",
"tx_hash": "<string>",
"tx_time": "<string>"
}
},
"notes": "Primary treasury wallet",
"role": "Treasury",
"books": "house",
"entity_id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"entity": {
"id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"name": "Acme Participações Ltda",
"types": [
"client"
]
},
"regulatory": {
"custodian_code": "Z1234567",
"custodian_country": "BR",
"ownership": "client",
"is_staking": false
},
"cadoc_5710": {
"address_type": "CUSTODIA_PROPRIA_SEGREGADO",
"wallet_type": "FRIA"
},
"cadoc_5711": {
"client_tax_id": "52998224725",
"client_tax_id_type": "cpf"
},
"treasury_statement": {},
"last_synced_at": "2026-01-01T00:00:00.000Z",
"transactions_history_from": "2026-07-01T00:00:00.000Z",
"sync_unavailable_reason": "provider_region_unsupported",
"sync_status": "succeeded",
"last_balance_refresh_at": "2026-01-01T00:00:00.000Z",
"last_balance_refresh_reason": "provider_timeout",
"last_balance_refresh_status": "succeeded"
}Authorizations
Authorization method required to allow user to access the api endpoints.
Path Parameters
Body
Team to place the account in, or null to detach it. Must be a Team of the caller workspace; an unknown id is refused with code UNKNOWN_TEAM.
"0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11"
Response
Stable account id. Matches account_id on workspace balance responses for joins.
"bje5mmbqxjvwjaf7oxwpyxntxdyspzZyt4vwennw5rug"
eoa, multisig, contract, custodian, exchange, bank, defi "eoa"
"ledger, kraken, wallet, ..."
Show child attributes
Show child attributes
[{ "id": "uuid-1", "name": "Finance" }]
active, updating "active"
Show child attributes
Show child attributes
Null when the account was saved without a name.
"Treasury wallet"
"solana"
"BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG"
The team the account is assigned to (set with PUT /v2/accounts/:id/team), resolved to its current name. Null when the account has no team or its team no longer exists in the workspace. Always present on persisted account responses; omitted on connection-preview stubs.
Show child attributes
Show child attributes
{
"id": "0d3f0d0a-3b1e-4b4a-9d2b-2f2b6f6a1c11",
"name": "Treasury"
}
Total USD value across all of the account balances. null when no asset has a known price.
"1234.56"
Count of balances the workspace token whitelist removed from balances/balances_usd above. 0 both when nothing was filtered and when the account has no balances at all — distinguish those with balances.length. Always 0 when show_all was requested. Always present on persisted account responses; omitted on connection-preview stubs that have never been imported.
0
Total USD value across the balances hidden_count counts — an aggregate only, never broken down by asset, so a hidden holding's identity or individual amount is never exposed on the default (filtered) response. null when nothing is hidden or none of the hidden balances have a known price. Always present on persisted account responses; omitted on preview stubs.
"340.12"
"2024-01-01T00:00:00.000Z"
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
Show child attributes
Show child attributes
"Primary treasury wallet"
"Treasury"
Which books this account sits on (custom connections — F4 / RNG-5533).
house, client "house"
The register entity this account belongs to (/v2/parties). Always present on persisted accounts; omitted on connection-preview stubs.
"a1b2c3d4-5678-90ab-cdef-1234567890ab"
Inline summary of entity_id. Always present on persisted accounts; omitted on connection-preview stubs.
Show child attributes
Show child attributes
Present when the account has account-level regulatory settings (custodian, ownership, staking).
Show child attributes
Show child attributes
Present when the account is registered for the cadoc-5710 (monthly reserves) template.
Show child attributes
Show child attributes
Present when the account is registered for the cadoc-5711 (daily custody) template.
Show child attributes
Show child attributes
Present when registered for treasury statements.
When a transaction-sync run last succeeded for this account, or null if none ever has. Always present on persisted account responses; omitted on connection-preview stubs that have never been imported. Sync is only triggered manually via POST /v2/accounts/transfers/sync (one job per account).
"2026-01-01T00:00:00.000Z"
How far back this account's transaction history has been synced, or null before the first successful sync. A first sync walks back 90 days and later syncs only walk forward, so anything older has not been fetched and may be missing from reports. POST /v2/accounts/{account_id}/transfers/resync walks back further. Only ever moves earlier. Always present on persisted account responses; omitted on connection-preview stubs.
"2026-07-01T00:00:00.000Z"
Why the most recent transaction sync failed, when the cause is permanent for this account rather than a transient error worth retrying. Classified from ops-only last_sync_error; never the raw text.
provider_region_unsupported: the provider does not serve transaction history for this account's country with the credential it was given. account_unsupported: the account has no supported transaction-history source (connection adapter, on-chain network, or address). Always present on persisted account responses; omitted on preview stubs.
provider_region_unsupported, account_unsupported "provider_region_unsupported"
Outcome of the most recent sync run for this account, or null before the first one. failed leaves last_synced_at at the last genuinely successful run. Always present on persisted account responses; omitted on preview stubs.
running, succeeded, failed "succeeded"
When the most recent balance-refresh attempt ran, or null before the first one. Advances on every attempt including a failed one — unlike balances_updated_at, which only moves on a successful read, so a client can tell "stale because nobody asked" from "stale because it keeps failing". Always present on persisted account responses; omitted on connection-preview stubs that have never been imported.
"2026-01-01T00:00:00.000Z"
Why the most recent balance-refresh attempt failed, as a stable machine code a client may branch on without string-matching prose that may be reworded. null when the last attempt succeeded, none has been made yet, or the chain has no readable balance source. Always present on persisted account responses; omitted on preview stubs, except a stub whose balance read failed or resolved only in part (balances is then empty, never the half that resolved, and this carries the reason).
reconnect_required, provider_timeout, rate_limited, authentication_failed, provider_unreachable, provider_rejected, provider_error, connection_not_found, balance_lookup_failed, unclassified_provider_error, asset_catalog_unavailable, tokens_not_enumerated "provider_timeout"
Outcome of the most recent balance-refresh attempt for this account. unsupported means this chain has no readable balance source — derived, and takes precedence over any stored status. null before the first attempt. Distinct from sync_status, which tracks transaction-history sync, not balances. Always present on persisted account responses; omitted on connection-preview stubs that have never been imported, except a stub whose balance read failed or resolved only in part (failed, or unsupported when the chain has no readable balance source): its empty balances is not a real empty account.
succeeded, failed, unsupported "succeeded"
Was this page helpful?