curl --request POST \
--url https://api.range.org/v2/account-connections \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"name": "<string>",
"cubist": {
"login_id": "<string>",
"refresh_token": "<string>",
"org_id": "<string>"
}
}
'import requests
url = "https://api.range.org/v2/account-connections"
payload = {
"name": "<string>",
"cubist": {
"login_id": "<string>",
"refresh_token": "<string>",
"org_id": "<string>"
}
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
cubist: {login_id: '<string>', refresh_token: '<string>', org_id: '<string>'}
})
};
fetch('https://api.range.org/v2/account-connections', 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/account-connections",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'cubist' => [
'login_id' => '<string>',
'refresh_token' => '<string>',
'org_id' => '<string>'
]
]),
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/account-connections"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"cubist\": {\n \"login_id\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"org_id\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.range.org/v2/account-connections")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"cubist\": {\n \"login_id\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"org_id\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/account-connections")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"cubist\": {\n \"login_id\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"org_id\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "conn_abc123",
"name": "My Utila Account",
"type": "utila",
"provider_display_name": "Utila",
"kind": "account",
"public_data": {
"public_key": "pk_abc123"
},
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Create account, ledger, risk or travel-rule connection
Stores connection credentials. Account providers support preview/import; ledger providers (e.g. quickbooks, xero) store OAuth tokens only; risk providers (merkle_science, chainalysis) store a BYO screening key, at most one per workspace: a merkle_science key is verified against the vendor before it is stored; a chainalysis key is stored with public_data.key_status unverified and settled by its first real screen; travel-rule providers (notabene) store OAuth client credentials and an entity DID, verified against the vendor before they are stored, at most one per workspace. For multisig providers (safe, squads, realms), an address that fails to resolve returns a classified error body { statusCode, error, code, message } with code one of: invalid_address (bad format), multisig_not_found (well-formed address, no multisig there), wrong_network (Safe only — exists, but on a different chain than selected), upstream_unavailable (the provider/RPC failed — transient, safe to retry).
curl --request POST \
--url https://api.range.org/v2/account-connections \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"name": "<string>",
"cubist": {
"login_id": "<string>",
"refresh_token": "<string>",
"org_id": "<string>"
}
}
'import requests
url = "https://api.range.org/v2/account-connections"
payload = {
"name": "<string>",
"cubist": {
"login_id": "<string>",
"refresh_token": "<string>",
"org_id": "<string>"
}
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
cubist: {login_id: '<string>', refresh_token: '<string>', org_id: '<string>'}
})
};
fetch('https://api.range.org/v2/account-connections', 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/account-connections",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'cubist' => [
'login_id' => '<string>',
'refresh_token' => '<string>',
'org_id' => '<string>'
]
]),
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/account-connections"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"cubist\": {\n \"login_id\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"org_id\": \"<string>\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.range.org/v2/account-connections")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"cubist\": {\n \"login_id\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"org_id\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.range.org/v2/account-connections")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"cubist\": {\n \"login_id\": \"<string>\",\n \"refresh_token\": \"<string>\",\n \"org_id\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "conn_abc123",
"name": "My Utila Account",
"type": "utila",
"provider_display_name": "Utila",
"kind": "account",
"public_data": {
"public_key": "pk_abc123"
},
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Authorizations
Authorization method required to allow user to access the api endpoints.
Body
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Response
"conn_abc123"
"My Utila Account"
utila, kraken, binance, okx, bybit, bitget, gate, kucoin, plaid, squads, altitude, coinbase, realms, wise, safe, hyperliquid, cubist, privy, dfns, anchorage, revolut_business, turnkey, fordefi, coins_ph, fireblocks, pave_bank, meow, copper, custom, quickbooks, xero, merkle_science, chainalysis, notabene "utila"
Canonical brand label for type (e.g. okx → OKX, plaid → Bank, gate → Gate.io).
"Utila"
Connection family: account (import Range Accounts), ledger (bookkeeping) or risk (BYO risk-provider key).
account, ledger, risk, travel_rule "account"
Non-sensitive public metadata
{ "public_key": "pk_abc123" }
"2026-01-01T00:00:00.000Z"
Last config edit: creation, rename, or a credential/session refresh. Transaction-sync lifecycle lives on accounts (AccountDto.last_synced_at / sync_status), not on connections.
"2026-01-01T00:00:00.000Z"
Was this page helpful?