# Sandbox and Testing

Our API sandbox is built to look and feel like the real thing. Every route is sandboxed and data persists exactly like in production. Our goal is to allow you to simulate everything that you'll experience in production in our sandbox. Your data and transactions hold state and go through the same settlement flows as they would in our production environment. Because of this data isolation, your data is not transferable between sandbox and production.

> **Note**
>
> We want the sandbox to be as feature complete as possible. Let us know if you hit snags or wish it had a certain
> feature - we want to hear it all!

To access the sandbox, you'll use api.column.com as the domain, just like in production - the only differentiator is your sandbox api key. It's prefixed with `test_`, whereas your production key is prefixed with `live_`. You add `entities`, `accounts`, and `transfers` just like you would in your production environment. However, you can also initiate specific behaviors through a couple extra APIs and magic values.

### Entities

Entities created in the sandbox environment are auto-approved through our KYC or KYB flow by default, resulting in a "verification\_status" of "verified". To simulate a different verification\_status, you can set the "last\_name" or "business\_name" on the entity to the following.

| last\_name or business\_name | verification\_status |
| ---------------------------- | -------------------- |
| DEFAULT                      | verified             |
| "Review"                     | manual\_review       |
| "Denied"                     | denied               |

### Bank Accounts and Account Numbers

Bank accounts and account numbers work exactly the same in the sandbox as in production. You can send and receive transfers with the same API using the sandbox key.

> **Note**
>
> #### Initial Balance
>
> All accounts start with a $0 balance. While you're exploring, we recommend simulating a wire transfer into the account. Our sandbox respects the operating hours of the Federal Reserve, just like in production. If you're sending this wire during the weekends or at night, you can make a request to /simulate/transfers/wire/settle or click the instant settle button in the dashboard. Once funds land, you can test book transfers and outgoing transfers. You can do this in the dashboard or over the API.

### Incoming transfers

To simulate an incoming transfer, or just to set an initial balance on your account, you can use the `/simulate/receive-wire` endpoint. To simulate incoming ACHs, we have a `/simulate/receive-ach-credit` and a `/simulate/receive-ach-debit` endpoint.

Currently, there's a max of 1 minute delay before the transfer created by `/simulate/receive-*` endpoints will be created to simulate the delay that'll happen in the live environment when interacting with FED.

### Outgoing transfers

By default, all outgoing transfers will succeed. This means that wire messages will be submitted without a failure.

By default, all outgoing transfers will settle exactly as they would in production. This means that ACH and wires will respect the hours of the Federal Reserve even in our sandbox environment.

In order to bypass the actual schedule of the Federal Reserve, we offer these endpoints: `/simulate/transfers/wire/settle` and `​/simulate​/transfers​/ach​/settle`. Calling them will settle any outgoing transfer immediately, move funds, and set the transfer to the terminal success state.

> **Note**
>
> #### ACH Return Codes
>
> We're working to expand this to every ACH return code.

### ACH Returns

We offer the ability to simulate a return on an outgoing ACH. In order to do this, you can set the "receiver\_name" field on an outgoing ACH to the following:

| receiver\_name            | ACH Return Code | Description                                             |
| ------------------------- | --------------- | ------------------------------------------------------- |
| DEFAULT                   | -               | NONE                                                    |
| "RETURN\_NSF"             | R01             | Insufficient funds in recipient account                 |
| "RETURN\_ACCOUNT\_CLOSED" | R02             | Recipient account has been closed                       |
| "RETURN\_STOP\_PAYMENT"   | R08             | Recipient has requested a stop payment on this transfer |
| "RETURN\_UNAUTH"          | R29             | Recipient has reported the transaction as unauthorized  |
