/transact

Our newest endpoint for transacting, which will eventually replace /issue, /redeem, and /transfer. Must be used to make use of our new ACHNow product, or use instant rails.

This request triggers the issuance or remittance of funds with various options to customize how the payment is sent. With this endpoint, you can send payments either as regular ACH transactions (eg, Standard and Same Day ACH), or via ACHNow.

For now, this endpoint can be used to move funds between Sila wallets and linked bank accounts, but will be opened up to accepting many different payment instrument options as the source or the destination as we support more. The CKO integration is supported.

❗️

IMPORTANT - RfP (Request for Payment) Notifications

Please be aware that RfP notifications come from end users' respective banking institutions and are NOT within Sila's environment or control.

We recommend advising your end users to verify their notifications are set up correctly with their respective banking institution.

If your end users are having trouble with receiving notifications, please reach out to the end user's banking institution.

Terminology

Selected Routes:

  • ach_issue: bank account -> user wallet via ACH ("ACH pull")
  • ach_redeem: user wallet -> bank account via ACH ("ACH push")
  • instant_settlement: a multi-stage version of the ach_issue (ach_pull) funds_flow, where funds are available in the user_wallet immediately
  • ledger_to_ledger: user wallet -> user wallet
  • card_cko: debit card -> user wallet
  • same_day_ach_pull: identical to ach_issue, but is sent to the Federal Reserve via one of multiple cutoff windows rather that in a single batch at the end of business day.
  • same_day_ach_push: identical to ach_redeem, but is sent to the Federal Reserve via one of multiple cutoff windwos rather that in a single batch at the end of business day.
  • rtp_pull: bank account -> user wallet via the RTP network
  • rtp_push: user wallet -> bank_account via the RTP network
  • fednow_push - bank account -> user wallet via the FedNow network
  • future - fednow_pull: user wallet -> bank_account via the FedNow network (currently almost no banks support FedNow RequestForPayment (RfP, pull), so this feature is not implemented at this time.

Capability Values:

  • RTPCreditEnabled - institution (bank) supports accepting RTP push
  • RTPDebitEnabled - institution (bank) supports accepting RTP RequestForPayment (RfP) - rpt_pull
  • FedNowCreditEnabled - institution (bank) supports accepting FedNow push
  • FedNowDebitEnabled - institution (bank) supports accepting FedNow RequestForPayment (RfP) - fednow_pull

Using this endpoint

  • You MUST be approved by Sila before using ACHNow or instant rail functionality.
  • You MUST use this endpoint to use ACHNow, RTP, and FedNow functionality. You do not have to use these features to use /transact.
  • This endpoint is only accessible through HTTP requests.
  • We are NOT updating SDKs to support this endpoint.

Sending an ACH transaction via Instant Settlement

When an ACH payment is sent via Instant Settlement, the Sila-side location is credited or debited immediately. Because we are not yet able to control the routes themselves, the transaction may not land in the outside account until later.

If you would like the payment to land as soon as possible to the outside account, we recommend making use of the Same Day ACH method.

Request

🚧

RTP and FedNow

Currently:

  • RTP is available for both push and pull transactions (Sila wallet <> bank account)
  • FedNow is only available for push transactions (Sila wallet > bank account)

Requirements

  • Source of funds and destination for those funds are both required for transacting.
  • Either the source or the destination must be a Sila-associated or Sila-linked account or wallet.
  • Use route for specific route options like standard and Same Day ACH, instant settlement, card, and RTP.
    • Your app must be enabled for instant settlement, the Checkout integration, or RTP and FedNow to make use of those features.
    • NOTE: Because the default behavior is fastest, it is STRONGLY recommended that if you wish to use Standard ACH that you specify this in the route field.
  • Use route_selection_behavior for ACHNow and behavior (fastest or cheapest) selections.
  • If neither a route or route_selection_behavior are provided, the request will default to route_selection_behavior = fastest. Please see How Payment Route is Determined chart below for more.
  • route and route_selection_behavior are mutually exclusive. Provide one or the other, NOT both, which will result in a 400 error.
  • The difference between route_selection_behavior = ACHNow and route_selection_behavior = fastest: ACHNow will trigger a cascading behavior - trying the fastest route, then next fastest, and so on. fastest will try the fastest route available, but will not cascade down to try the next fastest if that fails.

📘

Transaction Amount in Decimal Units

Please be aware that the amount value for this endpoint is in decimal units, just like /issue and /redeem.

EX:

Transaction for $10 USD

/transact amount value = 1000

🚧

ACHNow Amount in Sandbox

If testing ACHNow in Sandbox, the amount MUST be $10.00 or less, or you will receive a 400 error.

Authorization / Authentication

Apps using Access Token Authorization

Use a valid access token in an Authorization: Bearer request header.

See Authenticating with an Access Token for more details.

NOTE: Sila will support existing customers with ECDSA apps. New customers implementing ACHNow must use the JWT access token.

POST /0.2/transact HTTP/1.1
sandbox.silamoney.com
Content-Type: application/json
Authorization: Bearer [GENERATED JWT TOKEN HERE]

{
  "header": {
    "created": 1234567890, //required
    "app_handle": "handle.silamoney.eth", // required
    "user_handle":"user.silamoney.eth", // required
    "version": "0.2", // optional
    "reference": "<your unique id>" // optional
  }, 
  "amount": 1000, //required
  "source_id": "<ID to uniquely identify where funds are originating from>", // required
  "destination_id": "<ID to uniquely identify the destination of funds>", // required
  "route": "<how you want payment sent>", // required for card transactions
  "route_selection_behavior": "fastest or cheapest", // optional, ACHNow only
  "description": "transaction descriptor", // optional
  "transaction_idempotency_id": "<UUID to uniquely identify a transaction for idempotency>", // optional
  "customer_reference": "customer chosen reference string", // optional
  "ach_attributes": { // for ACH transactions, optional
    "ach_descriptor": "ach descriptor in the NACHA file", // optional
    "sec_code": "3-character SEC code" // optional
    }
}

***

HTTP/1.1 200 OK

{
  "reference": "<your unique id>",
  "message": "Transaction submitted to the processing queue.",
  "success": true,
  "status": "SUCCESS",
  "response_time_ms": "171", 
  "transaction_id": "UUID of the submitted transaction",
  "itinerary_selected": "payement method used to move funds",
  "description": "optional description for the transaction"
}

Request Attributes

KeyTypeDescription
headerJSON objectRequired.

Required keys:

created - Unix epoch timestamp in seconds. Must not be future-dated and must not be dated more than 5 minutes in the past.
app_handle - your app handle
user_handle - the user_handle for the entity sending funds (source)

Optional keys:

reference: String. Can be any value for your own reference. If not provided, one will be assigned.
version: Cannot be null if key is present. Valid values: 0.2, v0.2, V0.2
amountintegerRequired.

Amount, in decimal units (ie, $10.00 in USD is 1000).

Amount must be $10 USD or below for test transactions in Sandbox environment.
source_idstringRequired.

Payment instrument id where the funds are originate from.
destination_idstringRequired.

Payment instrument id where the funds are sent to.
routestringRequired for card transactions. Optional otherwise. Strongly recommended if you wish to use Standard ACH.

What route you want the payment sent by. Valid options:

ach (standard ACH)
same_day_ach
instant_settlement
card (for CKO integration)
rtp
fednow (only for push, wallet > bank account)
internal (for wallet > wallet transfers)

If not supplied, default will be route_selection_behavior = fastest.
route_selection_behaviorstringOptional.

Based on attribute provided, route will be determined for the customer on the backend.

fastest
cheapest
ACHNow (case sensitive)
real_time_only - checks RTP and FedNow, but doesn't cascade further

If not supplied, will default to fastest.
descriptionstringOptional.
transaction_idempotency_idstringOptional.

UUID to uniquely identify the transaction to make it idempotent. If transaction is submitted multiple times with the same transaction_idempotency_id, it will only be processed once.

ACH-Specific Attributes

KeyTypeDescription
ach_descriptorstringOptional.

Max 10 characters. Description for receiver, will be passed along in the NACHA file
sec_codestringOptional.

3 character limit. Specify the SEC code you wish to use.

Responses

Status CodeSuccess AttributeDescriptionerror_code
200true
403falseThe fields provided would result in a transaction that cannot be processed. For example, a standard ACH transaction that would arrive on the same day.TX_NOT_POSSIBLE
400falseThe fields provided are invalid.
400falseThe mock error header provided does not apply to the transaction being submitted
403falseApp has not been enabled for ACHNow use.

How is the Payment Route Determined?

Below is a table that can be used to help determine which payment route will be used in which case.

The "->" represents a fall back, if the method to the left of the arrow is not configured then the method to the right of the arrow will be used.

Source TypeDestination TypeRoute Selection BehaviorRoute SelectionResulting Transaction Itinerary
Sila WalletSila Walletfastestledger to leger
Sila WalletSila Walletcheapestledger to ledger
Sila WalletSila Walletinternalledger to ledger
Bank AccountSila WalletfastestRTP if possible → instant_settlement → Same Day ACH
Bank AccountSila WalletcheapestStandard ACH
Bank AccountSila Walletinstant_settlementinstant settlement
Bank AccountSila WalletrtpRTP
Bank AccountSila Walletsame_day_achSame Day ACH
Bank AccountSila WalletachStandard ACH
Sila WalletBank AccountfastestRTP if possible → Same Day ACH
Sila WalletBank AccountcheapestStandard ACH
Sila WalletBank AccountrtpRTP
Sila WalletBank Accountsame_day_achSame Day ACH
Sila WalletBank AccountachStandard ACH

Payment routes in order of speed (fastest to slowest):

  1. Instant Settlement (instant)
  2. RTP (instant)
  3. Same Day ACH (1 day)
  4. Standard ACH (approx. 3 days)

Payment routes in order of cost (cheapest to most expensive):

  1. Standard ACH
  2. Same Day ACH
  3. RTP
  4. Instant Settlement

Please note that Instant Settlement is only valid for transactions from a bank account to a Sila Wallet.

Mocking Errors

You can set the Sila-Mock-Error header in a request in order to mock an error in Sandbox. The error mocked will be based on the value of the header. Please see the table below for the which values mock which errors:

Sila-Mock-Error valueDescription
aws-sqs-timeoutMocks an AWS timeout, as if AWS sqs was not functioning correctly.
ach-return-r<return code digits>Mocks a standard ach return with the specified return code. Example: ach_return_r05 mocks an R05 return
ach-late-return-r<return code digits>Mocks a late dated ach return with the specified return code. Example: ach_late_return_r16 mocks an R16 return
insufficent-fundsMocks a insufficient funds error.
delay-<time amt><time units>Mocks a delay in processing the transaction due to a service outage. Exmaple: delay-10mmocks a 10 minute processing delay. delay-10d mocks a 10 day delay
rtp-failureMocks a failure during an RTP transaction
rtp-bank-not-supportedMocks the associated bank being unable to perform RTP transactions
reserve-wallet-warningCauses the response to return the reserve wallet low warning response
reserve-wallet-nsfMocks the reserve wallet not having enough funds for the transaction
limit-exceededMocks the fund limit for the endpoint being exceeded
rtp-bank-debit-unsupportedMocks the associated bank being unable to accept RTP debits (RTP RfPs / RTP Pulls)
rtp-bank-credit-unsupportedMocks the associated bank being unable to accept RTP credits (RTP pushes)

Note that if the header does not apply to the transaction information provided, a 400 error will be returned.