# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/sandbox/fixed-routes/vba_abc123/simulate-deposit \
--body '<request-json>'Simulate a fixed-route source deposit (vba_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/fixed-routes/{id}/simulate-deposit"
payload = {
"amount": "1000.00",
"currency": "USD",
"reference": "sandbox_test_deposit_1",
"rail": "WIRE",
"senderBank": {
"bankName": "JPMorgan Chase",
"routingNumber": "021000021",
"swiftBic": "CHASUS33"
},
"originator": {
"name": "Sandbox Originator LLC",
"bankName": "Sandbox Test Bank",
"routingNumber": "021000021",
"accountNumber": "000123456789",
"swiftBic": "CHASUS33",
"bankCountry": "US"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: '1000.00',
currency: 'USD',
reference: 'sandbox_test_deposit_1',
rail: 'WIRE',
senderBank: {bankName: 'JPMorgan Chase', routingNumber: '021000021', swiftBic: 'CHASUS33'},
originator: {
name: 'Sandbox Originator LLC',
bankName: 'Sandbox Test Bank',
routingNumber: '021000021',
accountNumber: '000123456789',
swiftBic: 'CHASUS33',
bankCountry: 'US'
}
})
};
fetch('https://sandbox.api.infinite.dev/v1/sandbox/fixed-routes/{id}/simulate-deposit', 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/fixed-routes/{id}/simulate-deposit",
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([
'amount' => '1000.00',
'currency' => 'USD',
'reference' => 'sandbox_test_deposit_1',
'rail' => 'WIRE',
'senderBank' => [
'bankName' => 'JPMorgan Chase',
'routingNumber' => '021000021',
'swiftBic' => 'CHASUS33'
],
'originator' => [
'name' => 'Sandbox Originator LLC',
'bankName' => 'Sandbox Test Bank',
'routingNumber' => '021000021',
'accountNumber' => '000123456789',
'swiftBic' => 'CHASUS33',
'bankCountry' => 'US'
]
]),
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/fixed-routes/{id}/simulate-deposit"
payload := strings.NewReader("{\n \"amount\": \"1000.00\",\n \"currency\": \"USD\",\n \"reference\": \"sandbox_test_deposit_1\",\n \"rail\": \"WIRE\",\n \"senderBank\": {\n \"bankName\": \"JPMorgan Chase\",\n \"routingNumber\": \"021000021\",\n \"swiftBic\": \"CHASUS33\"\n },\n \"originator\": {\n \"name\": \"Sandbox Originator LLC\",\n \"bankName\": \"Sandbox Test Bank\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"000123456789\",\n \"swiftBic\": \"CHASUS33\",\n \"bankCountry\": \"US\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://sandbox.api.infinite.dev/v1/sandbox/fixed-routes/{id}/simulate-deposit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"1000.00\",\n \"currency\": \"USD\",\n \"reference\": \"sandbox_test_deposit_1\",\n \"rail\": \"WIRE\",\n \"senderBank\": {\n \"bankName\": \"JPMorgan Chase\",\n \"routingNumber\": \"021000021\",\n \"swiftBic\": \"CHASUS33\"\n },\n \"originator\": {\n \"name\": \"Sandbox Originator LLC\",\n \"bankName\": \"Sandbox Test Bank\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"000123456789\",\n \"swiftBic\": \"CHASUS33\",\n \"bankCountry\": \"US\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/sandbox/fixed-routes/{id}/simulate-deposit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"1000.00\",\n \"currency\": \"USD\",\n \"reference\": \"sandbox_test_deposit_1\",\n \"rail\": \"WIRE\",\n \"senderBank\": {\n \"bankName\": \"JPMorgan Chase\",\n \"routingNumber\": \"021000021\",\n \"swiftBic\": \"CHASUS33\"\n },\n \"originator\": {\n \"name\": \"Sandbox Originator LLC\",\n \"bankName\": \"Sandbox Test Bank\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"000123456789\",\n \"swiftBic\": \"CHASUS33\",\n \"bankCountry\": \"US\"\n }\n}"
response = http.request(request)
puts response.read_body{
"accountId": "acc_123",
"transferId": "tfr_123",
"sweepReferenceId": "sandbox_sim_550e8400-e29b-41d4-a716-446655440000"
}Simulate a fixed-route source deposit
Sandbox-only: triggers the fixed-route sweep without on-chain funds or provider webhooks. Works for fiat (vba_) and crypto (inw_) source routes. Does not use account fund-in — Infinite wallets cannot be credited that way. When the sweep target is a treasury Infinite wallet and the destination is a mintable sandbox token (USDT or USAT on Ethereum), this also mints that token to the vault so GET treasury and withdrawals see a real testnet balance. When the sweep target is a fiat balance account, this credits that balance immediately and emits balance.credited. A reused reference with the same amount returns the existing sweep and leaves its recorded rail and remitter unchanged. An unfinished sweep resumes from that deposit, not the later rail. Use a new reference per rail. On a fiat pay-in that lists sourceRails, rail is ACH, WIRE, or SWIFT. Omit it to book the stored rail (ACH when the route accepts ACH and wire). Wire, ACH, and SWIFT deposits populate source.originator with a sandbox remitter unless you pass originator or the route has allowedSenderBanks. The ACH remitter is the originator name and routing number only.
# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/sandbox/fixed-routes/vba_abc123/simulate-deposit \
--body '<request-json>'Simulate a fixed-route source deposit (vba_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/fixed-routes/{id}/simulate-deposit"
payload = {
"amount": "1000.00",
"currency": "USD",
"reference": "sandbox_test_deposit_1",
"rail": "WIRE",
"senderBank": {
"bankName": "JPMorgan Chase",
"routingNumber": "021000021",
"swiftBic": "CHASUS33"
},
"originator": {
"name": "Sandbox Originator LLC",
"bankName": "Sandbox Test Bank",
"routingNumber": "021000021",
"accountNumber": "000123456789",
"swiftBic": "CHASUS33",
"bankCountry": "US"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: '1000.00',
currency: 'USD',
reference: 'sandbox_test_deposit_1',
rail: 'WIRE',
senderBank: {bankName: 'JPMorgan Chase', routingNumber: '021000021', swiftBic: 'CHASUS33'},
originator: {
name: 'Sandbox Originator LLC',
bankName: 'Sandbox Test Bank',
routingNumber: '021000021',
accountNumber: '000123456789',
swiftBic: 'CHASUS33',
bankCountry: 'US'
}
})
};
fetch('https://sandbox.api.infinite.dev/v1/sandbox/fixed-routes/{id}/simulate-deposit', 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/fixed-routes/{id}/simulate-deposit",
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([
'amount' => '1000.00',
'currency' => 'USD',
'reference' => 'sandbox_test_deposit_1',
'rail' => 'WIRE',
'senderBank' => [
'bankName' => 'JPMorgan Chase',
'routingNumber' => '021000021',
'swiftBic' => 'CHASUS33'
],
'originator' => [
'name' => 'Sandbox Originator LLC',
'bankName' => 'Sandbox Test Bank',
'routingNumber' => '021000021',
'accountNumber' => '000123456789',
'swiftBic' => 'CHASUS33',
'bankCountry' => 'US'
]
]),
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/fixed-routes/{id}/simulate-deposit"
payload := strings.NewReader("{\n \"amount\": \"1000.00\",\n \"currency\": \"USD\",\n \"reference\": \"sandbox_test_deposit_1\",\n \"rail\": \"WIRE\",\n \"senderBank\": {\n \"bankName\": \"JPMorgan Chase\",\n \"routingNumber\": \"021000021\",\n \"swiftBic\": \"CHASUS33\"\n },\n \"originator\": {\n \"name\": \"Sandbox Originator LLC\",\n \"bankName\": \"Sandbox Test Bank\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"000123456789\",\n \"swiftBic\": \"CHASUS33\",\n \"bankCountry\": \"US\"\n }\n}")
req, _ := http.NewRequest("POST", 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.post("https://sandbox.api.infinite.dev/v1/sandbox/fixed-routes/{id}/simulate-deposit")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": \"1000.00\",\n \"currency\": \"USD\",\n \"reference\": \"sandbox_test_deposit_1\",\n \"rail\": \"WIRE\",\n \"senderBank\": {\n \"bankName\": \"JPMorgan Chase\",\n \"routingNumber\": \"021000021\",\n \"swiftBic\": \"CHASUS33\"\n },\n \"originator\": {\n \"name\": \"Sandbox Originator LLC\",\n \"bankName\": \"Sandbox Test Bank\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"000123456789\",\n \"swiftBic\": \"CHASUS33\",\n \"bankCountry\": \"US\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/sandbox/fixed-routes/{id}/simulate-deposit")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"amount\": \"1000.00\",\n \"currency\": \"USD\",\n \"reference\": \"sandbox_test_deposit_1\",\n \"rail\": \"WIRE\",\n \"senderBank\": {\n \"bankName\": \"JPMorgan Chase\",\n \"routingNumber\": \"021000021\",\n \"swiftBic\": \"CHASUS33\"\n },\n \"originator\": {\n \"name\": \"Sandbox Originator LLC\",\n \"bankName\": \"Sandbox Test Bank\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"000123456789\",\n \"swiftBic\": \"CHASUS33\",\n \"bankCountry\": \"US\"\n }\n}"
response = http.request(request)
puts response.read_body{
"accountId": "acc_123",
"transferId": "tfr_123",
"sweepReferenceId": "sandbox_sim_550e8400-e29b-41d4-a716-446655440000"
}Source account id
Pass the fixed route’s source account id —vba_… for fiat mailboxes, inw_… for crypto deposit wallets. This is the public fixed-route id.
The sweep runs without a real provider deposit. When the destination is a treasury Infinite wallet (inw_…) on a mintable sandbox token (USDT or USAT on Ethereum today), the endpoint also mints that token to the vault so GET /v1/customers/{id}/treasury and later withdrawals see a chain balance. Circle test USDC and Tron are not mintable this way.
When the sweep target is a fiat balance account, the same call credits that balance immediately and emits balance.credited. Replaying the same reference does not credit twice.
On a fiat pay-in that lists sourceRails, pass rail (ACH, WIRE, or SWIFT) to choose the inbound rail. Omit it to book the route’s stored rail — ACH when the route accepts ACH and wire. Domestic wire is WIRE. A rail the route does not accept is rejected when no sweep exists for that reference and amount. Reusing reference with the same amount returns the existing sweep and leaves its recorded rail and remitter unchanged. An unfinished sweep resumes from that deposit; use a new reference for each rail.
Wire, ACH, and SWIFT simulations populate source.originator (and the same field on transfer.created / transfer.updated webhooks) with a sandbox remitter. The ACH remitter is the originator name and routing number only. Pass originator to override, or {} to leave it null. Crypto sources stay null unless originator is set. Routes with allowedSenderBanks do not get a default remitter — omit originator and senderBank to exercise the unattributed fail-closed path.
POST /v1/sandbox/accounts/{id}/fund-in cannot replace this call for inw_ accounts.Authorizations
API Key in Bearer format (e.g., Bearer sk_test_...)
Headers
API key
Path Parameters
Fixed route source account id (vba_ for fiat, inw_ for crypto deposit wallets)
Body
Deposit amount in major units (e.g. "1000.00" for USD, "100.5" for USDT)
"1000.00"
Deposit currency; defaults to the route source currency when omitted
"USD"
Idempotency reference for the simulated deposit. A reused reference returns the existing sweep. Its rail and remitter stay as first recorded, and an unfinished sweep resumes from that deposit rather than the later rail. Use a new reference to simulate a different inbound rail.
"sandbox_test_deposit_1"
Inbound rail for a fiat pay-in that lists sourceRails. ACH, WIRE, or SWIFT. Omit to book the route's stored rail (ACH when the route accepts ACH and wire). Domestic wire is WIRE. Ignored when the route has no sourceRails.
ACH, WIRE, SWIFT "WIRE"
Sender bank reported for the simulated deposit, for exercising the allowedSenderBanks restriction on fiat pay-in routes. When omitted on a wire/FedWire/SWIFT route with no allowlist, a default remitter is used so source.originator is populated. Omit both this and originator on an allowlisted route to simulate a deposit without sender-bank data.
Show child attributes
Show child attributes
Inbound remitter identity persisted on the sweep transfer as source.originator (and transfer webhooks). Wire/FedWire/SWIFT/ACH simulations default a sandbox remitter when this is omitted and the route has no allowedSenderBanks. The ACH default is the originator name and routing number only. Pass an empty object to skip the default and leave originator null. Crypto sources stay null unless this is set.
Show child attributes
Show child attributes
Response
Fixed route sweep simulated successfully
Fixed route source account ID
"acc_123"
Sweep transfer created or replayed for this simulation
"tfr_123"
Sweep idempotency key used for this simulation
"sandbox_sim_550e8400-e29b-41d4-a716-446655440000"
Was this page helpful?