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
User bearer credential: either a Cognito JWT or an ak_ user API key. Backend integrators using HMAC must include the user API key alongside the three HMAC headers on user-scoped endpoints.
Headers
Unique key for this deposit intent. Reuse it verbatim after a timeout to replay the original response. Reusing it with a different request returns an idempotency conflict.
1 - 255"deposit-order-7f3f4d4d"
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.
Opaque public deposit identifier
"dep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X"
Opaque public funding source identifier
"fs_01JV7Q8M4Y8K6N2Z5P3R1T9W0X"
Identifier of the on-ramp created for this deposit, or null until the on-ramp record exists.
"onramp_xyz789"
authorized, processing, partially_released, completed, returned, refunded, failed exact_input, exact_output normal, high normal, high Show child attributes
Show child attributes
solana, ethereum, polygon, base, avalanche, arbitrum Asset sent to the deposit destination
USDC "USDC"
Destination wallet address for the crypto release
authorized, submitting, submitted, settled, returned, failed not_started, queued, partial, completed, failed after_settlement, early_full, early_partial