curl --request POST \
--url https://platform.spritz.finance/v1/bank-accounts/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "us",
"ownership": "personal",
"routingNumber": "021000021",
"accountNumber": "123456789",
"accountSubtype": "checking"
}
'import requests
url = "https://platform.spritz.finance/v1/bank-accounts/"
payload = {
"type": "us",
"ownership": "personal",
"routingNumber": "021000021",
"accountNumber": "123456789",
"accountSubtype": "checking"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'us',
ownership: 'personal',
routingNumber: '021000021',
accountNumber: '123456789',
accountSubtype: 'checking'
})
};
fetch('https://platform.spritz.finance/v1/bank-accounts/', 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/bank-accounts/",
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([
'type' => 'us',
'ownership' => 'personal',
'routingNumber' => '021000021',
'accountNumber' => '123456789',
'accountSubtype' => 'checking'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/bank-accounts/"
payload := strings.NewReader("{\n \"type\": \"us\",\n \"ownership\": \"personal\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"123456789\",\n \"accountSubtype\": \"checking\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/bank-accounts/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"us\",\n \"ownership\": \"personal\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"123456789\",\n \"accountSubtype\": \"checking\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.spritz.finance/v1/bank-accounts/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"us\",\n \"ownership\": \"personal\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"123456789\",\n \"accountSubtype\": \"checking\"\n}"
response = http.request(request)
puts response.read_body{
"id": "ba_abc123",
"status": "active",
"statusReason": "account_invalid",
"accountHolderName": "John Doe",
"supportedRails": [
"ach_standard",
"rtp"
],
"createdAt": "2023-11-07T05:31:56Z",
"fundingSourceId": "<string>",
"type": "us",
"currency": "USD",
"accountNumberLast4": "6789",
"routingNumberLast4": "0021",
"institution": {
"name": "Chase",
"logo": "https://example.com/chase-logo.png"
},
"label": "Primary Checking",
"accountSubtype": "checking"
}{
"title": "Unauthorized",
"status": 401,
"type": "urn:problem-type:auth:unauthorized",
"detail": "Bearer token required",
"instance": "<string>",
"realm": "API",
"scope": "read:users"
}{
"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
}Add a bank account
Adds a new bank account as an off-ramp destination. The type field determines the required fields.
Account Types
| Type | Region | Required Fields | Supported Rails |
|---|---|---|---|
us | United States | routingNumber, accountNumber | ACH, RTP, Wire |
ca | Canada | institutionNumber, transitNumber, accountNumber | EFT |
uk | United Kingdom | sortCode, accountNumber | FPS |
iban | Europe / SEPA | iban, bic | SEPA |
For iban accounts the beneficiary’s address is required. When ownership is
personal it is taken from your verified identity; when thirdParty you must
supply accountHolder.address, including its country.
Examples
US Bank Account:
{
"type": "us",
"ownership": "personal",
"routingNumber": "021000021",
"accountNumber": "123456789",
"accountSubtype": "checking"
}
Canadian Bank Account:
{
"type": "ca",
"ownership": "thirdParty",
"accountHolder": { "firstName": "Jane", "lastName": "Smith" },
"institutionNumber": "001",
"transitNumber": "12345",
"accountNumber": "1234567"
}
IBAN (SEPA) Bank Account:
{
"type": "iban",
"ownership": "personal",
"iban": "DE89370400440532013000",
"bic": "COBADEFFXXX"
}
The account will be verified before becoming active.
curl --request POST \
--url https://platform.spritz.finance/v1/bank-accounts/ \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "us",
"ownership": "personal",
"routingNumber": "021000021",
"accountNumber": "123456789",
"accountSubtype": "checking"
}
'import requests
url = "https://platform.spritz.finance/v1/bank-accounts/"
payload = {
"type": "us",
"ownership": "personal",
"routingNumber": "021000021",
"accountNumber": "123456789",
"accountSubtype": "checking"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
type: 'us',
ownership: 'personal',
routingNumber: '021000021',
accountNumber: '123456789',
accountSubtype: 'checking'
})
};
fetch('https://platform.spritz.finance/v1/bank-accounts/', 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/bank-accounts/",
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([
'type' => 'us',
'ownership' => 'personal',
'routingNumber' => '021000021',
'accountNumber' => '123456789',
'accountSubtype' => 'checking'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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/bank-accounts/"
payload := strings.NewReader("{\n \"type\": \"us\",\n \"ownership\": \"personal\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"123456789\",\n \"accountSubtype\": \"checking\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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/bank-accounts/")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"type\": \"us\",\n \"ownership\": \"personal\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"123456789\",\n \"accountSubtype\": \"checking\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.spritz.finance/v1/bank-accounts/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"type\": \"us\",\n \"ownership\": \"personal\",\n \"routingNumber\": \"021000021\",\n \"accountNumber\": \"123456789\",\n \"accountSubtype\": \"checking\"\n}"
response = http.request(request)
puts response.read_body{
"id": "ba_abc123",
"status": "active",
"statusReason": "account_invalid",
"accountHolderName": "John Doe",
"supportedRails": [
"ach_standard",
"rtp"
],
"createdAt": "2023-11-07T05:31:56Z",
"fundingSourceId": "<string>",
"type": "us",
"currency": "USD",
"accountNumberLast4": "6789",
"routingNumberLast4": "0021",
"institution": {
"name": "Chase",
"logo": "https://example.com/chase-logo.png"
},
"label": "Primary Checking",
"accountSubtype": "checking"
}{
"title": "Unauthorized",
"status": 401,
"type": "urn:problem-type:auth:unauthorized",
"detail": "Bearer token required",
"instance": "<string>",
"realm": "API",
"scope": "read:users"
}{
"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
}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.
Body
Create a bank account. The type field determines the required fields.
- Option 1
- Option 2
- Option 3
- Option 4
Create a bank account. The type field determines the required fields.
US bank account type
us Who owns this bank account. "personal" = the authenticated user (holder info inferred from profile). "thirdParty" = someone else (requires accountHolder).
personal, thirdParty "personal"
9-digit ABA routing number
^[0-9]{9}$"021000021"
Bank account number
"123456789"
Account holder details. Required when ownership is "thirdParty".
Show child attributes
Show child attributes
Type of bank account (checking or savings)
checking, savings "checking"
Friendly name for the account
"Primary Checking"
Response
Bank account details. The type field indicates the account variant.
- Option 1
- Option 2
- Option 3
- Option 4
Bank account details. The type field indicates the account variant.
Unique identifier for the bank account
"ba_abc123"
Whether the account can receive payouts. active is the only payable state; every other value means the account cannot be paid, and statusReason says why. Treat any value that is not active as unpayable rather than switching on the full list — new states may be added and will always follow that rule.
active, inactive "active"
Why the account cannot receive payouts. Always present when status is not active, and always null when it is.
account_invalid— the receiving bank does not recognise the account details.account_closed— the account has been closed at the bank.account_blocked— the bank will not accept credits to this account.not_supported— Spritz cannot pay accounts of this type or region.
All four are terminal: the account will not recover, so prompt the user to add a different one.
account_invalid, account_closed, account_blocked, not_supported, null "account_invalid"
Display name recorded on the user's bank account. This is not an ownership-match or eligibility decision.
"John Doe"
Payment rails available for this account
Fiat delivery rail.
ach_standard: ACH bank transfer, next business day.ach_same_day: ACH same-day transfer, delivered same business day.rtp: Real-time payment, seconds, 24/7.wire: Wire transfer, same/next day.eft: Electronic funds transfer, 1-2 business days.sepa: SEPA transfer (EU), 1-2 business days.faster_payments: UK Faster Payments, near-instant.push_to_card: Push to debit card, minutes.bill_pay: Bill payment rail.card_deposit: Deposit to crypto card.
ach_standard, ach_same_day, rtp, wire, eft, sepa, faster_payments, push_to_card, bill_pay, card_deposit ["ach_standard", "rtp"]
When the account was created
Associated opaque public funding source identifier, or null when no funding source exists for this bank account.
us USD Last 4 digits of account number
"6789"
Last 4 digits of routing number
"0021"
Financial institution details
Show child attributes
Show child attributes
Friendly name for the account
"Primary Checking"
Type of bank account (checking or savings)
checking, savings "checking"