curl --request POST \
--url https://api.platform.dakota.xyz/sandbox/simulate/inbound \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"simulation_id": "sim_qa_run_001",
"type": "ach_inbound",
"account_id": "acc_123",
"amount": "100.00",
"currency": "USD",
"scenario": "success_immediate"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
simulation_id: 'sim_qa_run_001',
type: 'ach_inbound',
account_id: 'acc_123',
amount: '100.00',
currency: 'USD',
scenario: 'success_immediate'
})
};
fetch('https://api.platform.dakota.xyz/sandbox/simulate/inbound', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/sandbox/simulate/inbound"
payload = {
"simulation_id": "sim_qa_run_001",
"type": "ach_inbound",
"account_id": "acc_123",
"amount": "100.00",
"currency": "USD",
"scenario": "success_immediate"
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/sandbox/simulate/inbound"
payload := strings.NewReader("{\n \"simulation_id\": \"sim_qa_run_001\",\n \"type\": \"ach_inbound\",\n \"account_id\": \"acc_123\",\n \"amount\": \"100.00\",\n \"currency\": \"USD\",\n \"scenario\": \"success_immediate\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
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))
}{
"simulation_id": "sim_qa_run_001",
"state": "accepted",
"trace_id": "trace_abc123"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Invalid request",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Not available in production",
"status": 403,
"detail": "Not available in production",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Account not found",
"status": 404,
"detail": "Account not found",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#conflict",
"title": "Simulation ID conflict",
"status": 409,
"detail": "Simulation ID conflict",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#provider-error",
"title": "Provider gRPC call failed",
"status": 502,
"detail": "Provider gRPC call failed",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Simulate an inbound payment event
Triggers a simulated payment event through the mock Lead Bank provider. Accepted immediately; callbacks are delivered asynchronously. Idempotent: repeated calls with the same simulation_id and identical parameters return the original response. Conflicting parameters return 409.
curl --request POST \
--url https://api.platform.dakota.xyz/sandbox/simulate/inbound \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"simulation_id": "sim_qa_run_001",
"type": "ach_inbound",
"account_id": "acc_123",
"amount": "100.00",
"currency": "USD",
"scenario": "success_immediate"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'x-api-key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
simulation_id: 'sim_qa_run_001',
type: 'ach_inbound',
account_id: 'acc_123',
amount: '100.00',
currency: 'USD',
scenario: 'success_immediate'
})
};
fetch('https://api.platform.dakota.xyz/sandbox/simulate/inbound', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/sandbox/simulate/inbound"
payload = {
"simulation_id": "sim_qa_run_001",
"type": "ach_inbound",
"account_id": "acc_123",
"amount": "100.00",
"currency": "USD",
"scenario": "success_immediate"
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/sandbox/simulate/inbound"
payload := strings.NewReader("{\n \"simulation_id\": \"sim_qa_run_001\",\n \"type\": \"ach_inbound\",\n \"account_id\": \"acc_123\",\n \"amount\": \"100.00\",\n \"currency\": \"USD\",\n \"scenario\": \"success_immediate\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
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))
}{
"simulation_id": "sim_qa_run_001",
"state": "accepted",
"trace_id": "trace_abc123"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Invalid request",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Not available in production",
"status": 403,
"detail": "Not available in production",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Account not found",
"status": 404,
"detail": "Account not found",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#conflict",
"title": "Simulation ID conflict",
"status": 409,
"detail": "Simulation ID conflict",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#provider-error",
"title": "Provider gRPC call failed",
"status": 502,
"detail": "Provider gRPC call failed",
"instance": "https://api.platform.dakota.xyz/sandbox/simulate/inbound",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Authorizations
Headers
Unique key to ensure request idempotency. If the same key is used within a certain time window, the original response will be returned instead of executing the request again.
Sandbox-only. Applies a preset failure or behavior mode for the request, selecting a coherent combination of error step, status, and message. The full set of scenarios is also exposed dynamically via GET /sandbox/scenarios along with descriptions and per-rail applicability.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
happy_path, delayed_settlement, insufficient_funds, compliance_block, invalid_account, provider_maintenance, network_congestion, kyb_manual_review, kyb_rejected, kyb_expired, network_timeout, intermittent_errors, account_frozen, document_expired, invalid_swift "insufficient_funds"
Sandbox-only. Names the pipeline step at which the injected error fires. Pair with X-Sandbox-Error-Status and (optionally) X-Sandbox-Error-Message to drive a deterministic failure mode at a known point in the request lifecycle. Values longer than 100 characters are ignored.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
transaction_processing, compliance_check, account_validation, provider_call, kyb_submission, kyb_approval, network_call 100"provider_call"
Sandbox-only. Sets the HTTP status code returned when the sandbox injects an error at the configured step (see X-Sandbox-Error-Step). Must be a valid HTTP status code in the range 100-599; values outside that range are ignored. Status codes >= 400 cause the request to short-circuit immediately with a structured error response.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
100 <= x <= 599503
Sandbox-only. Sets the human-readable message field of the injected sandbox error response. Truncated values longer than 500 characters are ignored.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
500"Provider temporarily unavailable for maintenance."
Sandbox-only. When true, asynchronous simulation flows complete immediately rather than progressing through their normal timed states. Useful for fast end-to-end test runs that do not need to exercise intermediate webhook events. Accepts true/false (also 1/0, yes/no); other values are treated as false.
Effective only on https://api.platform.sandbox.dakota.xyz. Ignored in production.
true
Body
Unique ID for this simulation (used for idempotency)
1 - 128"sim_01H..."
Payment rail and direction. Use the fedwire_* values for
Fedwire flows; the wire_* values are accepted as legacy
aliases for backwards compatibility and may be removed in
a future major version.
Use swift_inbound to simulate an international deposit
into a SWIFT onramp account. The rail a deposit books on is
derived from the receiving account, so swift_inbound and
wire_inbound behave identically: against a SWIFT account
both produce a SWIFT deposit, and against a domestic
account both produce a Fedwire one.
ach_inbound, fedwire_inbound, wire_inbound, swift_inbound, fednow_inbound, crypto_inbound, ach_outbound_returned, ach_outbound_failed, fedwire_outbound_returned, wire_outbound_returned, swift_outbound_returned, fedwire_outbound_failed, wire_outbound_failed, swift_outbound_failed, ach_outbound_settled, ach_outbound_rejected, fedwire_outbound_settled, wire_outbound_settled, swift_outbound_settled, fedwire_outbound_rejected, wire_outbound_rejected, swift_outbound_rejected, ach_reversal, fedwire_reversal, wire_reversal, swift_reversal "ach_inbound"
Amount as a decimal string
"100.00"
Currency code
"USD"
Platform account ID of the target onramp/offramp auto account.
Required for every fiat type — all *_inbound values
except crypto_inbound, and all *_outbound_* and
*_reversal values. On an inbound simulation it is the
onramp account receiving the payment. On an outbound or
reversal simulation it is the offramp account that funded
the one-off transaction, and one_off_transaction_id is
required alongside it.
Ignored only for crypto_inbound, which uses
wallet_address instead.
"acc_123"
The on-chain wallet address returned by POST /wallets
(see the address field in the response). Required for
crypto_inbound. Ignored for other types.
"0x165cd37b4c644c2921454429e7f9358d18a45e14"
Legacy alias for wallet_address. Prefer wallet_address —
this field is accepted for backwards compatibility and may
be removed in a future major version.
"0x165cd37b4c644c2921454429e7f9358d18a45e14"
The one-off transaction ID returned by
POST /transactions/one-off (see the id field in the
response). Required for outbound types
(ach_outbound_*, fedwire_outbound_*, *_reversal).
Ignored for inbound types.
"2NfHrqBHb3cTfLVkFSGmHZqdDQ7"
Legacy alias for one_off_transaction_id. Prefer
one_off_transaction_id — this field is accepted for
backwards compatibility and may be removed in a future
major version.
"2NfHrqBHb3cTfLVkFSGmHZqdDQ7"
Simulation scenario. Defaults to success_immediate.
- success_immediate: callbacks fire immediately
- success_delayed: callbacks fire after delay_seconds (default 30s) For crypto_inbound: success_immediate | wrong_chain | unsupported_token | address_mismatch | partial_crypto | unconfirmed
"success_immediate"
Amount actually received (for crypto_inbound with scenario=partial_crypto only). Must be a valid decimal less than amount.
"50.00"
Delay in seconds for success_delayed scenario (1-86400)
1 <= x <= 8640030
Optional trace ID for correlation
Was this page helpful?

