curl --request POST \
--url https://platform.spritz.finance/v1/deposits/direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--data '
{
"preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"clientIp": "1.1.1.1"
}
'import requests
url = "https://platform.spritz.finance/v1/deposits/direct"
payload = {
"preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"clientIp": "1.1.1.1"
}
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', clientIp: '1.1.1.1'})
};
fetch('https://platform.spritz.finance/v1/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/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',
'clientIp' => '1.1.1.1'
]),
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/deposits/direct"
payload := strings.NewReader("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\",\n \"clientIp\": \"1.1.1.1\"\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/deposits/direct")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\",\n \"clientIp\": \"1.1.1.1\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.spritz.finance/v1/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 \"clientIp\": \"1.1.1.1\"\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
}{
"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 direct deposit
Authorizes and creates a deposit against a raw wallet address prepared via /direct/prepare. Integrators should send the preparation’s short-lived submissionToken to the authorizing client and call this endpoint directly from that client; the capability can submit only its bound preparation. During migration, integrators can continue submitting with HMAC backend authentication but must include the public clientIp observed by their edge. Authorization is derived from the verified ACH funding source; no wallet signature is required. Idempotency-Key is required; reuse the same key and body after a timeout to recover the original response without creating another deposit.
curl --request POST \
--url https://platform.spritz.finance/v1/deposits/direct \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'idempotency-key: <idempotency-key>' \
--data '
{
"preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"clientIp": "1.1.1.1"
}
'import requests
url = "https://platform.spritz.finance/v1/deposits/direct"
payload = {
"preparationId": "prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X",
"clientIp": "1.1.1.1"
}
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', clientIp: '1.1.1.1'})
};
fetch('https://platform.spritz.finance/v1/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/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',
'clientIp' => '1.1.1.1'
]),
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/deposits/direct"
payload := strings.NewReader("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\",\n \"clientIp\": \"1.1.1.1\"\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/deposits/direct")
.header("idempotency-key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"preparationId\": \"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X\",\n \"clientIp\": \"1.1.1.1\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.spritz.finance/v1/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 \"clientIp\": \"1.1.1.1\"\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
}{
"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
Opaque public preparation identifier returned by direct prepare
"prep_01JV7Q8M4Y8K6N2Z5P3R1T9W0X"
Public client IP observed by the integrator edge. Required when an integrator submits through its backend with HMAC authentication; omit for direct submission with a submissionToken.
2 - 45"1.1.1.1"
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