curl --request POST \
--url https://platform.spritz.finance/v1/sandbox/deposits/direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--data '
{
"preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X"
}
'import requests
url = "https://platform.spritz.finance/v1/sandbox/deposits/direct"
payload = { "preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X" }
headers = {
"idempotency-key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'idempotency-key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({preparationId: 'prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X'})
};
fetch('https://platform.spritz.finance/v1/sandbox/deposits/direct', 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://platform.spritz.finance/v1/sandbox/deposits/direct",
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([
'preparationId' => 'prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"idempotency-key: <idempotency-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://platform.spritz.finance/v1/sandbox/deposits/direct"
payload := strings.NewReader("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("idempotency-key", "<idempotency-key>")
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://platform.spritz.finance/v1/sandbox/deposits/direct")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.spritz.finance/v1/sandbox/deposits/direct")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["idempotency-key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\"\n}"
response = http.request(request)
puts response.read_body{
"id": "dep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"sourceId": "fs_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"onRampId": "onramp_xyz789",
"status": "authorized",
"quoteType": "exact_input",
"requestedPriority": "normal",
"priority": "normal",
"feeRateBps": 123,
"principalAmountUsd": "<string>",
"instantPortionUsd": "<string>",
"settlementPortionUsd": "<string>",
"expectedAssetAmount": "<string>",
"grossFeeUsd": "<string>",
"publishedFeeUsd": "<string>",
"regularPublishedFeeUsd": "<string>",
"instantPublishedFeeUsd": "<string>",
"feeSubsidyUsd": "<string>",
"userFeeUsd": "<string>",
"totalDebitAmountUsd": "<string>",
"feeSubsidy": {
"percentage": 123,
"percentageBps": 123,
"maxAmountUsd": "<string>",
"appliedAmountUsd": "<string>"
},
"network": "solana",
"asset": "USDC",
"assetAddress": "<string>",
"address": "<string>",
"debitStatus": "authorized",
"releaseStatus": "not_started",
"releaseDecisionMode": "after_settlement",
"releasedAmountUsd": "<string>",
"confirmedReleasedAmountUsd": "<string>",
"authorizedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"settledAt": "2023-11-07T05:31:56Z",
"returnedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"returnCode": "<string>",
"returnReason": "<string>",
"debitFailureCode": "<string>",
"debitFailureReason": "<string>",
"releaseFailureCode": "<string>",
"releaseFailureReason": "<string>",
"payoutTxHash": "<string>"
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true,
"errors": [
{
"field": "<string>",
"message": "<string>",
"code": "<string>"
}
]
}{
"title": "Unauthorized",
"status": 401,
"type": "urn:problem-type:auth:unauthorized",
"detail": "Bearer token required",
"instance": "<string>",
"realm": "API",
"scope": "read:users"
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}{
"title": "<string>",
"status": 404,
"resourceType": "user",
"resourceId": "<string>",
"type": "about:blank",
"detail": "<string>",
"instance": "<string>"
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}Create a sandbox direct deposit with a simulated outcome
Runs direct deposit creation through one deterministic sandbox simulation. Provide exactly one of returnSimulation, riskSimulation, or lifecycleSimulation. Idempotency-Key is required and must be reused with the same body after a timeout.
An ACH return simulation creates the deposit normally and applies the selected return code to its sandbox debit.
A blocking risk simulation selects a public decision outcome while keeping private provider inputs and policy rules out of the API. It returns 409 and creates no deposit:
review_required→risk_review_required; the source remains active;rejected→risk_rejected; the source remains active;source_temporarily_unavailable→risk_rerouted; the source becomes temporarily ineligible withstatusReason: reroutedand anavailableAttime;decision_unavailable→risk_evaluation_unavailable; the source remains active.
High-priority simulations create a deposit successfully:
high_priority_available→ the deposit succeeds with its quoted instant portion.high_priority_downgraded→ the deposit succeeds at standard timing with no instant portion.
Risk simulations force a fresh simulated decision but do not expose or call the production decision provider. Prepare a new authorization before retrying because the preparation is consumed by the create attempt.
Lifecycle simulations never call a money-movement provider. refunded, release_failed, release_stalled, and full_delivery require a normal-priority preparation and apply the selected state before execution starts. full_delivery records a completed deposit and achDebit.delivered milestone. partial_then_full_delivery requires a high-priority preparation with both instant and settlement portions; it records deterministic achDebit.deliveryProgress and achDebit.delivered milestones for the same deposit, then returns the completed deposit.
curl --request POST \
--url https://platform.spritz.finance/v1/sandbox/deposits/direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--data '
{
"preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X"
}
'import requests
url = "https://platform.spritz.finance/v1/sandbox/deposits/direct"
payload = { "preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X" }
headers = {
"idempotency-key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'idempotency-key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({preparationId: 'prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X'})
};
fetch('https://platform.spritz.finance/v1/sandbox/deposits/direct', 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://platform.spritz.finance/v1/sandbox/deposits/direct",
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([
'preparationId' => 'prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"idempotency-key: <idempotency-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://platform.spritz.finance/v1/sandbox/deposits/direct"
payload := strings.NewReader("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("idempotency-key", "<idempotency-key>")
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://platform.spritz.finance/v1/sandbox/deposits/direct")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.spritz.finance/v1/sandbox/deposits/direct")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["idempotency-key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\"\n}"
response = http.request(request)
puts response.read_body{
"id": "dep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"sourceId": "fs_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"onRampId": "onramp_xyz789",
"status": "authorized",
"quoteType": "exact_input",
"requestedPriority": "normal",
"priority": "normal",
"feeRateBps": 123,
"principalAmountUsd": "<string>",
"instantPortionUsd": "<string>",
"settlementPortionUsd": "<string>",
"expectedAssetAmount": "<string>",
"grossFeeUsd": "<string>",
"publishedFeeUsd": "<string>",
"regularPublishedFeeUsd": "<string>",
"instantPublishedFeeUsd": "<string>",
"feeSubsidyUsd": "<string>",
"userFeeUsd": "<string>",
"totalDebitAmountUsd": "<string>",
"feeSubsidy": {
"percentage": 123,
"percentageBps": 123,
"maxAmountUsd": "<string>",
"appliedAmountUsd": "<string>"
},
"network": "solana",
"asset": "USDC",
"assetAddress": "<string>",
"address": "<string>",
"debitStatus": "authorized",
"releaseStatus": "not_started",
"releaseDecisionMode": "after_settlement",
"releasedAmountUsd": "<string>",
"confirmedReleasedAmountUsd": "<string>",
"authorizedAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"settledAt": "2023-11-07T05:31:56Z",
"returnedAt": "2023-11-07T05:31:56Z",
"completedAt": "2023-11-07T05:31:56Z",
"returnCode": "<string>",
"returnReason": "<string>",
"debitFailureCode": "<string>",
"debitFailureReason": "<string>",
"releaseFailureCode": "<string>",
"releaseFailureReason": "<string>",
"payoutTxHash": "<string>"
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true,
"errors": [
{
"field": "<string>",
"message": "<string>",
"code": "<string>"
}
]
}{
"title": "Unauthorized",
"status": 401,
"type": "urn:problem-type:auth:unauthorized",
"detail": "Bearer token required",
"instance": "<string>",
"realm": "API",
"scope": "read:users"
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}{
"title": "<string>",
"status": 404,
"resourceType": "user",
"resourceId": "<string>",
"type": "about:blank",
"detail": "<string>",
"instance": "<string>"
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}{
"title": "Unauthorized",
"status": 400,
"type": "urn:problem-type:auth:unauthorized",
"detail": "<string>",
"instance": "/errors/1234567890",
"code": "transaction_limit",
"field": "amountUsd",
"retryable": true,
"retryAfter": 5,
"suggestedAction": "auto_ramp",
"clearsAt": "2023-11-07T05:31:56Z",
"availableAt": "2023-11-07T05:31:56Z",
"permanent": true
}Authorizations
Headers
Body
Response
An ACH debit deposit authorized by the user and processed asynchronously through debit and crypto release lifecycles.
An ACH debit deposit authorized by the user and processed asynchronously through debit and crypto release lifecycles.