CLI
# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api PUT /v1/sandbox/customers/cus_abc123/capabilities \
--body '<request-json>'Simulate customer capabilities (cus_abc123).
# Infinite MCP is read-only for this endpoint — use a dedicated MCP tool when one exists, otherwise run the CLI tab.import requests
url = "https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities"
payload = { "capabilities": ["USD_BALANCE"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({capabilities: ['USD_BALANCE']})
};
fetch('https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities', 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.infinite.dev/v1/sandbox/customers/{id}/capabilities",
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([
'capabilities' => [
'USD_BALANCE'
]
]),
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.infinite.dev/v1/sandbox/customers/{id}/capabilities"
payload := strings.NewReader("{\n \"capabilities\": [\n \"USD_BALANCE\"\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"capabilities\": [\n \"USD_BALANCE\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"capabilities\": [\n \"USD_BALANCE\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "cus_abc123",
"capabilities": [
{
"capability": "USD_WIRE_PAYIN",
"status": "READY"
}
]
}Sandbox
Simulate customer capabilities
Make the requested capabilities READY for a sandbox customer by simulating the underlying approvals, without running real onboarding. The customer must already be ACTIVE (see the customer status endpoint). Emits the same capability webhooks as production. Simulating USD_BALANCE also approves external payout accounts that are still in review, including accounts created before the capability was enabled. Approving those payout accounts requires permission to write accounts.
PUT
/
v1
/
sandbox
/
customers
/
{id}
/
capabilities
CLI
# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api PUT /v1/sandbox/customers/cus_abc123/capabilities \
--body '<request-json>'Simulate customer capabilities (cus_abc123).
# Infinite MCP is read-only for this endpoint — use a dedicated MCP tool when one exists, otherwise run the CLI tab.import requests
url = "https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities"
payload = { "capabilities": ["USD_BALANCE"] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({capabilities: ['USD_BALANCE']})
};
fetch('https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities', 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.infinite.dev/v1/sandbox/customers/{id}/capabilities",
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([
'capabilities' => [
'USD_BALANCE'
]
]),
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.infinite.dev/v1/sandbox/customers/{id}/capabilities"
payload := strings.NewReader("{\n \"capabilities\": [\n \"USD_BALANCE\"\n ]\n}")
req, _ := http.NewRequest("PUT", 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.put("https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"capabilities\": [\n \"USD_BALANCE\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/sandbox/customers/{id}/capabilities")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"capabilities\": [\n \"USD_BALANCE\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "cus_abc123",
"capabilities": [
{
"capability": "USD_WIRE_PAYIN",
"status": "READY"
}
]
}Testing balance accounts end to end
- Set the customer status to
ACTIVEvia the customer status endpoint - Simulate
USD_BALANCEwith this endpoint - Create the balance account
- Credit it with account fund-in
The customer must be
ACTIVE before capabilities can be simulated. Capabilities that depend on provider-side configuration that cannot be simulated return 400.Simulating
USD_BALANCE also approves external payout accounts that are still in review, including ones created before the capability was enabled. Call it again to approve accounts left in review by an earlier simulation.Authorizations
API Key in Bearer format (e.g., Bearer sk_test_...)
Headers
API key
Path Parameters
Customer ID
Body
application/json
Capabilities to make READY for this customer by simulating the underlying approvals.
Available options:
USD_ACH_PAYIN, USD_ACH_PAYOUT, USD_WIRE_PAYIN, USD_WIRE_PAYOUT, USD_BALANCE, USD_YIELD, SWIFT_PAYIN, SWIFT_PAYOUT, STABLECOIN_PAYIN, STABLECOIN_PAYOUT, STABLECOIN_SWAPS, AED_FX_PAYOUT, AUD_FX_PAYOUT, BHD_FX_PAYOUT, BOB_FX_PAYOUT, BRL_FX_PAYOUT, CLP_FX_PAYOUT, CNY_FX_PAYOUT, COP_FX_PAYOUT, DOP_FX_PAYOUT, EGP_FX_PAYOUT, EUR_FX_PAYOUT, GBP_FX_PAYOUT, HKD_FX_PAYOUT, IDR_FX_PAYOUT, INR_FX_PAYOUT, JPY_FX_PAYOUT, KRW_FX_PAYOUT, KWD_FX_PAYOUT, MXN_FX_PAYOUT, MYR_FX_PAYOUT, PEN_FX_PAYOUT, PHP_FX_PAYOUT, PYG_FX_PAYOUT, QAR_FX_PAYOUT, SAR_FX_PAYOUT, SGD_FX_PAYOUT, THB_FX_PAYOUT, TRY_FX_PAYOUT, TWD_FX_PAYOUT, USD_FX_PAYOUT, VND_FX_PAYOUT Example:
["USD_BALANCE"]
Was this page helpful?