Simulate a crypto deposit to a sandbox wallet
Accepts a synthetic crypto deposit event for an ACTIVE sandbox wallet. The event is processed exactly like a real provider deposit notification — asynchronously — so the response is an acknowledgement carrying the (chain, txHash) the deposit is detected under, not the deposit itself. Observe the deposit via the transaction.created webhook or GET /v2/transactions?txHash=…. Re-using a (chain, txHash) re-acknowledges the existing deposit rather than creating a second one. Sandbox supplies default sender information so happy-path deposits clear the deposit compliance gate automatically; the default is suppressed when the documented sender-information drivers fire (sourceAddress ending in DE5E11F1 or amount at/above the Travel Rule threshold) so the gate parks instead of clearing. Pass an explicit originator object to override the default and clear the gate.
curl --request POST \
--url https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"assetAmount": {
"amount": "<string>"
},
"externalReference": "<string>",
"detectedAt": "2023-11-07T05:31:56Z",
"txHash": "<string>",
"sourceAddress": "<string>",
"originator": {
"entityType": "business",
"legalName": "<string>",
"country": "<string>"
}
}
'import requests
url = "https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate"
payload = {
"assetAmount": { "amount": "<string>" },
"externalReference": "<string>",
"detectedAt": "2023-11-07T05:31:56Z",
"txHash": "<string>",
"sourceAddress": "<string>",
"originator": {
"entityType": "business",
"legalName": "<string>",
"country": "<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({
assetAmount: {amount: '<string>'},
externalReference: '<string>',
detectedAt: '2023-11-07T05:31:56Z',
txHash: '<string>',
sourceAddress: '<string>',
originator: {entityType: 'business', legalName: '<string>', country: '<string>'}
})
};
fetch('https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate', 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.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate",
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([
'assetAmount' => [
'amount' => '<string>'
],
'externalReference' => '<string>',
'detectedAt' => '2023-11-07T05:31:56Z',
'txHash' => '<string>',
'sourceAddress' => '<string>',
'originator' => [
'entityType' => 'business',
'legalName' => '<string>',
'country' => '<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.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate"
payload := strings.NewReader("{\n \"assetAmount\": {\n \"amount\": \"<string>\"\n },\n \"externalReference\": \"<string>\",\n \"detectedAt\": \"2023-11-07T05:31:56Z\",\n \"txHash\": \"<string>\",\n \"sourceAddress\": \"<string>\",\n \"originator\": {\n \"entityType\": \"business\",\n \"legalName\": \"<string>\",\n \"country\": \"<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.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"assetAmount\": {\n \"amount\": \"<string>\"\n },\n \"externalReference\": \"<string>\",\n \"detectedAt\": \"2023-11-07T05:31:56Z\",\n \"txHash\": \"<string>\",\n \"sourceAddress\": \"<string>\",\n \"originator\": {\n \"entityType\": \"business\",\n \"legalName\": \"<string>\",\n \"country\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate")
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 \"assetAmount\": {\n \"amount\": \"<string>\"\n },\n \"externalReference\": \"<string>\",\n \"detectedAt\": \"2023-11-07T05:31:56Z\",\n \"txHash\": \"<string>\",\n \"sourceAddress\": \"<string>\",\n \"originator\": {\n \"entityType\": \"business\",\n \"legalName\": \"<string>\",\n \"country\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"txHash": "<string>"
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_READ_ONLY",
"title": "API Key Is Read-Only",
"status": 403,
"detail": "This API key has read-only access and cannot perform write operations. Read-only keys may make read requests (GET, HEAD, OPTIONS) only.",
"resolution": "Use a read-write API key for this request, or have an organization admin mint one from the dashboard.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-read-only",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "WALLET_NOT_FOUND",
"title": "Wallet Not Found",
"status": 404,
"detail": "No wallet exists with the specified ID, or the wallet belongs to a different organization.",
"resolution": "Verify the wallet ID is correct. Use the list wallets endpoint to find valid wallet IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#wallet-not-found",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "UNSUPPORTED_MEDIA_TYPE",
"title": "Unsupported Media Type",
"status": 415,
"detail": "The request carries a body with a Content-Type this endpoint cannot parse. JSON endpoints accept 'application/json'; a body with no Content-Type header at all is assumed to be JSON. File-upload endpoints accept only 'multipart/form-data' — JSON or undeclared bodies are rejected there.",
"resolution": "Send the request body with the 'Content-Type: application/json' header. For file uploads, use 'Content-Type: multipart/form-data' — upload endpoints accept no other body type.",
"docs": "https://conduit-v2.mintlify.app/errors#unsupported-media-type",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "WALLET_NOT_ACTIVE",
"title": "Wallet Not Active",
"status": 422,
"detail": "The wallet is not in ACTIVE status and cannot be used at this time (e.g. a frozen non-custodial wallet cannot initiate a payout).",
"resolution": "Check the wallet's current status. Only ACTIVE wallets can receive deposits or initiate payouts; a frozen wallet must be cleared by Conduit before it can move funds again.",
"docs": "https://conduit-v2.mintlify.app/errors#wallet-not-active",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset on rate-limited route responses.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}Authorizations
Body
Show child attributes
Show child attributes
completed, frozen, returned 1 - 255^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$1 - 1281 - 255- Option 1
- Option 2
Show child attributes
Show child attributes
pending_confirmation, finalized Response
Deposit accepted for ingestion; carries the detection identity to poll on
Chain the simulated deposit landed on
ethereum, base, solana, polygon, arbitrum, optimism, avalanche, tron, stellar, bsc, bitcoin Transaction hash the deposit is detected under — the one supplied on the request in canonical form (hashes on hex chains fold to lowercase), or a synthetic sandbox_… hash when it was omitted. Poll GET /v2/transactions?txHash=… to observe the deposit; match destination.walletId on the results if you reused one hash across several wallets, which returns a row per credited wallet.
curl --request POST \
--url https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"assetAmount": {
"amount": "<string>"
},
"externalReference": "<string>",
"detectedAt": "2023-11-07T05:31:56Z",
"txHash": "<string>",
"sourceAddress": "<string>",
"originator": {
"entityType": "business",
"legalName": "<string>",
"country": "<string>"
}
}
'import requests
url = "https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate"
payload = {
"assetAmount": { "amount": "<string>" },
"externalReference": "<string>",
"detectedAt": "2023-11-07T05:31:56Z",
"txHash": "<string>",
"sourceAddress": "<string>",
"originator": {
"entityType": "business",
"legalName": "<string>",
"country": "<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({
assetAmount: {amount: '<string>'},
externalReference: '<string>',
detectedAt: '2023-11-07T05:31:56Z',
txHash: '<string>',
sourceAddress: '<string>',
originator: {entityType: 'business', legalName: '<string>', country: '<string>'}
})
};
fetch('https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate', 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.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate",
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([
'assetAmount' => [
'amount' => '<string>'
],
'externalReference' => '<string>',
'detectedAt' => '2023-11-07T05:31:56Z',
'txHash' => '<string>',
'sourceAddress' => '<string>',
'originator' => [
'entityType' => 'business',
'legalName' => '<string>',
'country' => '<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.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate"
payload := strings.NewReader("{\n \"assetAmount\": {\n \"amount\": \"<string>\"\n },\n \"externalReference\": \"<string>\",\n \"detectedAt\": \"2023-11-07T05:31:56Z\",\n \"txHash\": \"<string>\",\n \"sourceAddress\": \"<string>\",\n \"originator\": {\n \"entityType\": \"business\",\n \"legalName\": \"<string>\",\n \"country\": \"<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.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"assetAmount\": {\n \"amount\": \"<string>\"\n },\n \"externalReference\": \"<string>\",\n \"detectedAt\": \"2023-11-07T05:31:56Z\",\n \"txHash\": \"<string>\",\n \"sourceAddress\": \"<string>\",\n \"originator\": {\n \"entityType\": \"business\",\n \"legalName\": \"<string>\",\n \"country\": \"<string>\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/sandbox/customers/{customerId}/wallets/{walletId}/deposits/simulate")
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 \"assetAmount\": {\n \"amount\": \"<string>\"\n },\n \"externalReference\": \"<string>\",\n \"detectedAt\": \"2023-11-07T05:31:56Z\",\n \"txHash\": \"<string>\",\n \"sourceAddress\": \"<string>\",\n \"originator\": {\n \"entityType\": \"business\",\n \"legalName\": \"<string>\",\n \"country\": \"<string>\"\n }\n}"
response = http.request(request)
puts response.read_body{
"txHash": "<string>"
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_READ_ONLY",
"title": "API Key Is Read-Only",
"status": 403,
"detail": "This API key has read-only access and cannot perform write operations. Read-only keys may make read requests (GET, HEAD, OPTIONS) only.",
"resolution": "Use a read-write API key for this request, or have an organization admin mint one from the dashboard.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-read-only",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "WALLET_NOT_FOUND",
"title": "Wallet Not Found",
"status": 404,
"detail": "No wallet exists with the specified ID, or the wallet belongs to a different organization.",
"resolution": "Verify the wallet ID is correct. Use the list wallets endpoint to find valid wallet IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#wallet-not-found",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "UNSUPPORTED_MEDIA_TYPE",
"title": "Unsupported Media Type",
"status": 415,
"detail": "The request carries a body with a Content-Type this endpoint cannot parse. JSON endpoints accept 'application/json'; a body with no Content-Type header at all is assumed to be JSON. File-upload endpoints accept only 'multipart/form-data' — JSON or undeclared bodies are rejected there.",
"resolution": "Send the request body with the 'Content-Type: application/json' header. For file uploads, use 'Content-Type: multipart/form-data' — upload endpoints accept no other body type.",
"docs": "https://conduit-v2.mintlify.app/errors#unsupported-media-type",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "WALLET_NOT_ACTIVE",
"title": "Wallet Not Active",
"status": 422,
"detail": "The wallet is not in ACTIVE status and cannot be used at this time (e.g. a frozen non-custodial wallet cannot initiate a payout).",
"resolution": "Check the wallet's current status. Only ACTIVE wallets can receive deposits or initiate payouts; a frozen wallet must be cleared by Conduit before it can move funds again.",
"docs": "https://conduit-v2.mintlify.app/errors#wallet-not-active",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset on rate-limited route responses.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "req_a1b2c3d4",
"timestamp": "2026-01-15T09:30:00.000Z"
}