Company Wallet Setup

Onboarding your business and operating bank account with Sila

To set up a company wallet

Sila will need to assist you. Here are the steps to help guide you through the process:

  1. Register a user (with real KYC data). Any individual from your team can volunteer to have their data registered.
  2. Be sure to give the user handle a descriptive name like “businessname_admin_wallet”.
  3. Request KYC on that user.
  4. Once the user passes, report the following Company Wallet Info to Sila's Support team:
  • Company Legal Name
  • PRODUCTION APP:
    • app_handle
    • user_handle
  1. We will then change the entity type to "business" so you can proceed to the last steps. We’ll let you know when the entity type has been updated.
  2. With the entity change, you can now link your business bank account with Plaid or with direct account linking.
  3. The final step is to make sure the business name we add manually matches the name on your business bank account. For example: If your business account is titled for “Business Name, Inc.”, then we’ll go in and change the name of the user to “Business Name, Inc.”. This is to ensure the bank doesn't reject any of your transactions.

🚧

SANDBOX "Company Wallet"

These instructions are intended for production. In the sandbox, create and use any wallet that you want as your company wallet.

Linking your account

For most business accounts you can use Plaid and our /link_account endpoint to link your bank account to your company wallet.

For those with accounts at Evolve you may use the following for this purpose and this purpose only

🚧

Important Notice

Direct account linking is only available to customers who have a direct relationship with an account linking provider, customer who have been approved for a receive-only entity use-case, or for the purpose of linking the company's account to their company wallet.

End users must never be able to enter in their account and routing numbers without verifying account ownership.

Direct Account Linking

POST /0.2/link_account HTTP/1.1
Host: sandbox.silamoney.com
authsignature: [GENERATED AUTHSIGNATURE HEX STRING HERE]
usersignature: [GENERATED USERSIGNATURE HEX STRING HERE]
Content-Type: application/json

{
  "header": {
    "created": 1234567890, 
    "app_handle": "handle.silamoney.eth", 
    "user_handle":"user.silamoney.eth", 
    "version": "0.2", 
    "crypto": "ETH", 
    "reference": "ref"
  }, 
  "account_number": "123456789012",
  "routing_number": "123456789",
  "account_type": "CHECKING",
  "account_name": "Custom Account Name",
}

***

HTTP/1.1 200 OK

{
  "success": true,
  "status": "SUCCESS",
  "reference": "ref",
  "message": "Bank account successfully linked.",
  "account_name": "Custom Account Name",
  "match_score": null,
  "account_owner_name": "Sally Smith",
  "entity_name": "Sally Smith",
}
// Direct account-linking flow for receive-only entities only 
// Restricted by use-case, contact Sila for approval
const res = await Sila.linkAccountDirect(
  userHandle,
  walletPrivateKey,
  accountNumber,
  routingNumber,
  accountName,
  accountType,
); // Account Type and Account Name parameters are not required

//The only permitted account type is "CHECKING"

// Success Response Object
console.log(res.statusCode); // 200
console.log(res.data.reference); // Random reference number
console.log(res.data.status); // SUCCESS
console.log(res.data.success);
console.log(res.data.message); // Bank account successfully linked
console.log(res.data.account_name);
console.log(res.data.match_score);
console.log(res.data.account_owner_name);
console.log(res.data.entity_name);
### Direct account-linking flow for receive-only entities only 
### Restricted by use-case, contact Sila for approval
payload={
            "user_handle": "user.silamoney.eth",    # Required
            "account_number": "123456789012",       # Required
            "routing_number": "123456789",          # Required
            "account_type": "CHECKING",             # Optional (default value is CHECKING)
            "account_name": "Custom Account Name"   # Optional (default value is "default"),
        }

User.linkAccount(silaApp,payload,user_private_key)

### Success Response Object
{
    status: 'SUCCESS',
    success: True,
    message: 'Bank account successfully manually linked.',
    reference: 'f9f23fc2-26e7-4358-99c8-75cb8aec76fb',
    account_name: 'default',
    status_code: 200,
    match_score: 0.825,
    account_owner_name: 'Sally Smith',
    entity_name: 'Sally Smith'
}

### Failure Response Object
{
    status: 'FAILURE'
}
//NOTE - as of Java SDK v0.2.21, we have refactored requests to make them more flexible 
//for future modifications.  Below are examples of the new method and the original method.  
//The original method will be deprecated at some point in future SDK versions, but is 
//still valid for backwards compatibility purposes.  Please use the new method moving 
//forward as you upgrade your SDK


// Direct account-linking flow for receive-only entities only 
// Restricted by use-case, contact Sila for approval
LinkAccountRequest request = LinkAccountRequest.builder()
    .accountName("default")
    .accountNumber("123456789012")
    .routingNumber("123456789")
    .accountType("CHECKING")
    .userHandle("user handle")
    .userPrivateKey("user private key")
    .build();

LinkAccountResponse response = LinkAccount.send(request);

response.getStatus();
response.getAccountName();
response.getMessage();
response.getReference();

//--------------------------------------------

//This is the original method (still valid but will soon be deprecated)

// Direct account-linking flow for receive-only entities only 
// Restricted by use-case, contact Sila for approval
String userHandle = 'user.silamoney.eth';
String accountName = 'direct'; // Your desired account name
String accountNumber = '123456789012';
String routingNumber = '123456789';
String accountType = 'CHECKING'; // Currently the only allowed value
String userPrivateKey = 'some private key';

ApiResponse response = api.linkAccount(userHandle, userPrivateKey, accountName, accountNumber, routingNumber, accountType);

// Success Response
System.out.println(response.getStatusCode()); // 200
LinkAccountResponse parsedResponse = (LinkAccountResponse) response.getData();
System.out.println(parsedResponse.getStatus()); // SUCCESS
System.out.println(parsedResponse.isSuccess()); // true
System.out.println(parsedResponse.getReference()); // Reference number
System.out.println(parsedResponse.getMessage()); // Successfully linked
System.out.println(parsedResponse.getAccountName()); // Your desired account name
System.out.println(parsedResponse.getMatchScore()); // Match score
// Direct account-linking flow for receive-only entities only 
// Restricted by use-case, contact Sila for approval
$userHandle = 'user.silamoney.eth';
$accountName = 'Custom Account Name'; // Defaults to 'default' if not provided. (not required)
$routingNumber = '123456789'; // The routing number. 
$accountNumber = '123456789012'; // The bank account number
$userPrivateKey = 'some private key'; // The private key used to register the specified user
$accountType = 'CHECKING'; // The account type (not required). Only available value is CHECKING

// Call the api
$response = $client->linkAccountDirect($userHandle, $userPrivateKey, $accountNumber, $routingNumber, $accountName, $accountType);

// Success 200
echo $response->getStatusCode(); // 200
echo $response->getData()->getStatus(); // SUCCESS
echo $response->getData()->getReference();
echo $response->getData()->getMessage();
echo $response->getData()->getAccountName();
echo $response->getData()->getAccountOwnerName();
//NOTE - as of C# SDK v0.2.21, we have refactored requests to make them more flexible 
//for future modifications.  Below are examples of the new method and the original method.  
//The original method will be deprecated at some point in future SDK versions, but is 
//still valid for backwards compatibility purposes.  Please use the new method moving 
//forward as you upgrade your SDK


// Direct account-linking flow for receive-only entities only 
// Restricted by use-case, contact Sila for approval
LinkAccountRequest request = new LinkAccountRequest{
    UserHandle = "user handle",
    UserPrivateKey = "user private key",
    AccountName = "account name",
    AccountNumber = "account number",
    RoutingNumber = "routing number",
    AccountType = "account type"
};

LinkAccountResponse response = LinkAccount.Send(request);

response.Success;
response.Account;
response.AccountOwnerName;
response.Message;
response.Reference;
response.Status;
response.MatchScore; Account Type and Account Name parameters are not required 

//--------------------------------------
//This is the original method (still valid but will soon be deprecated)

// Direct account-linking flow for receive-only entities only 
// Restricted by use-case, contact Sila for approval
ApiResponse<object> response = api.LinkAccountDirect(userHandle, walletPrivateKey, accountNumber, routingNumber, accountType, accountName); // Account Type and Account Name parameters are not required 

// Success Response Object

Console.WriteLine(response.StatusCode); // 200
Console.WriteLine(((LinkAccountResponse)response.Data).Reference); // Random reference number
Console.WriteLine(((LinkAccountResponse)response.Data).Status); // SUCCESS
Console.WriteLine(((LinkAccountResponse)response.Data).Message); // Bank account successfully linked.
Console.WriteLine(((LinkAccountResponse)response.Data).AccountName); // Account Name.
Console.WriteLine(((LinkAccountResponse)response.Data).MatchScore);

Did this page help you?