Virtual Account External Transactions

Sila’s Virtual Accounts feature allows customers to open a virtual account for their end users and provide them with an account and routing number that can be used for incoming "external" ACH transactions. "External" means that these transactions are originated from a bank outside of Sila, and we receive those transactions to the virtual account. Those incoming external ACH transactions can be credits or debits.

Testing External Incoming ACH Transactions on Virtual Accounts

You must be pre-approved for access to Virtual Accounts


This endpoint, which is only callable in Sandbox, will create an external, incoming virtual account ACH transaction for testing purposes.


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.

Apps using ECDSA Authentication

Only the authsignature header is required for this request. See the section on ECDSA Authentication for more detail about ECDSA signature generation.

Note - We recently renamed the field auth_handle to app_handle. For backward compatibility, auth_handle is still valid but has been removed from our documentation.

POST /0.2/create_test_virtual_account_ach_transaction HTTP/1.1
Content-Type: application/json
// if using OAuth2
Authorization: Bearer [GENERATED JWT TOKEN HERE]
// if using ECDSA

  "header": {
    "created": 1234567890, 
    "app_handle": "handle.silamoney.eth", 
    "version": "0.2",
    "crypto": "ETH", 
    "reference": "<your unique id>"
    "amount": "amount of sila to fund the virtual account with",
    "virtual_account_number": "vaccount number to transact with",
    "tran_code": "transaction code for the generated file transaction",
    "effective_date": "effective date for the generated file transaction",
    "entity_name": "Name of test entity for transaction",
    "ced": "PAYROLL",
    "ach_name": "ach business name"


HTTP/1.1 200 OK

  "success": true,
  "status": "SUCCESS",
  "response_time_ms": "171",
  "reference": "<your unique id>",
  "message": "Transaction submitted to the processing queue."
let vAccountId = 'virtual account id';
let accountNumber = 'virtual account number';

const res = await sila.createTestVirtualAccountAchTransaction(userHandle, userPrivateKey, vAccountId,accountNumber);    

// Success Response Object  
  "statusCode": 200,
  "headers": {
    "server": "nginx/1.14.0 (Ubuntu)",
    "date": "Fri, 25 Mar 2022 11:45:18 GMT",
    "content-type": "application/json",
    "content-length": "166",
    "connection": "close",
    "access-control-allow-origin": "*",
    "access-control-allow-headers": "*",
    "allow": "POST, OPTIONS",
    "vary": "Cookie"
  "data": {
    "success": true,
    "status": "SUCCESS",
    "message": "Transaction submitted to processing queue.",
    "reference": "44cfa09b-794a-43ca-bae3-6b796e5dd26b",
    "response_time_ms": "188"
payload = {
    "user_handle": user_handle,
    "amount": 50,
    "virtual_account_number": v_no,
    "tran_code": 22,
    "entity_name": "Test transfer",

User.testVirtualAaccountAchTransaction(app, payload, eth_private_key)

# Success

   "message":"Transaction submitted to processing queue.",
String userHandle = "user.silamoney.eth";
String userPrivateKey = "some private key";
int amount = 50; // amount of sila to fund the virtual account with
String virtualAccountNumber = "vaccount number to transact with";
Date effectiveDate = new LocalDate(2022, 03, 23).toDate(); // Optional. effective date for the generated file transaction
int tranCode= "transaction code for the generated file transaction";
String entityName ="Name of test entity for transaction";
String ced= "PAYROLL"; // Optional
String achName= "ach business name"; // Optional
ApiResponse response = api.createTestVirtualAccountAchTransaction(userHandle,userPrivateKey, amount, virtualAccountNumber, effectiveDate, tranCode,entityName,ced,achName);

// Success Response
System.out.println(response.getStatusCode()); // 200
BaseResponse parsedResponse = (BaseResponse) response.getData();
System.out.println(parsedResponse.getStatus()); // SUCCESS
System.out.println(parsedResponse.getSuccess()); // true
System.out.println(parsedResponse.getReference()); // Reference number
//Load your information
$userHandle = 'user.silamoney.eth';
$userPrivateKey = 'some private key';
$virtualAccountNumber = "Virtual Account Number";
$amount = 100;
$tranCode = 22;
$entityName = "entity Name";
$effectiveDate = null;// Optional
$ced = null;// Optional 
$achName = null;// Optional

$response = self::$config->api->createTestVirtualAccountAchTransaction($handle, $privateKey, $virtualAccountNumber, $amount, $tranCode, $entityName, $effectiveDate, $ced, $achName);
//Load your informations
int amount = 100;
string virtualAccountNumber = "9710000000000101";
int tranCode = 22;
string entityName = "Sally Smith";
DateTime? effectiveDate = DateTime.Now;
string ced = "PAYROLL";
string achName = "SILA INC";

var response = api.CreateTestVirtualAccountAchTransaction(userHandle, userPrivateKey, amount, virtualAccountNumber, tranCode, entityName, effectiveDate, ced, achName);
// Success Object Response
Console.WriteLine(response.StatusCode); // 200           
Console.WriteLine(((BaseResponse)response.Data).Message); // Message
Console.WriteLine(((BaseResponse)response.Data).Success); // true
Console.WriteLine(((BaseResponse)response.Data).Status); // SUCCESS
Console.WriteLine(((BaseResponse)response.Data).Reference); // ccb35eb8-xxxx-xxxx-xxxx-xxxxx
Console.WriteLine(((BaseResponse)response.Data).ResponseTimeMs); // API responses time

Testing External Outgoing ACH Transactions on Virtual Accounts

You must be pre-approved for access to Virtual Accounts
This endpoint is not available at this time.

headerJSON objectRequired. Requires these keys in JSON format: created, app_handle, user_handle.
See the /check_handle endpoint for the complete list of fields in this object.
amountIntegerRequired. Amount of sila to transact with.
Example: 100
virtual_account_numberStringRequired. Account number of the virtual account.
Example: 971000123456789
effective_dateDateOptional. This is the date that the transaction will settle. Defaults to the current date
tran_codeIntegerRequired. Transaction code to determine operation to be preformed on the virtual account. A list of transaction codes can be found here:
22: Automated deposit (checking credit)
23: Prenote of checking credit
27: Automated payment (checking debit)
28: Prenote of checking debit
32: Automated deposit (savings credit)
33: Prenote of savings credit
37: Automated payment (savings debit)
38: Prenote of savings debit
entity_nameStringRequired. Any string. Will show up as the entity name for the virtual account ACH transaction
cedStringOptional. Defaults to "PAYROLL"
ach_nameStringOptional. ACH business name for the transaction. Defaults to "SILA INC"


Status CodeDescription
200Successfully created a transaction.
400The specified virtual account number does not exist.