Handle transfers
Send assets moving into and out of accounts, and give deposits a cost basis so their gains can be calculated.
A transfer moves an asset into or out of an account without a sale. When an asset arrives from outside your platform, Taxbit has no record of what it cost, so the lot it creates is missing cost basis, and a later sale from it cannot produce an accurate gain. This walkthrough sends a transfer, shows the gap, and points to the four ways to fill it.
By the end of this page you have sent a deposit, seen its lot marked as missing cost basis, and know which of the four child pages applies to your case.
Before you begin
- A bearer token. See Authenticate your tenant.
- An account with transactions. See Set up inventory and gains.
Send the transfer
A transfer in is a deposit, and a transfer out is a withdraw, both sent to POST /v1/transactions/external-id. The subtype says what kind of transfer it is:
| Type | Subtypes |
|---|---|
deposit | ach, blockchain, card-reward, gift, cost-basis-fmv, inheritance, internal-personal |
withdraw | ach, blockchain, gift, internal-personal |
This account receives 0.75 ETH from an outside wallet:
curl -X POST $BASE_URL/v1/transactions/external-id \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": "dep_40731",
"account_id": "acct_5f2e7d10",
"type": "deposit",
"subtype": "blockchain",
"datetime": "2026-09-02T09:15:00Z",
"received": [{
"asset_amount": { "amount": "0.75", "asset": { "code": "ETH", "type": "Crypto" } },
"rates": [{ "amount": "3100.00", "asset": { "code": "USD", "type": "Fiat" } }]
}]
}'You should see 201 with "status": "success".
See the missing cost basis
Read the account's ETH inventory, as in Retrieve inventory. The lot the deposit created carries missing_cost_basis: true and no cost, and the summary counts it in total_quantity_missing_cost_basis. By default, every lot created from a transfer starts this way.
Give the deposit a basis
Pick the page for how the asset reached the account:
| The asset came from | Do this | Page |
|---|---|---|
| Outside your platform, and the user can tell you what they paid | Attach user-entered lots to the deposit | User-provided cost basis |
| Another account of the same user on your platform | Link the withdrawal and the deposit | Internal personal transfers |
| Another person, as a gift | Link to the gifter's withdrawal, or attach lots | Gifts |
| An estate | Send the deposit with subtype inheritance and the value at the date of death | Inheritance |
Two more cases are not transfers between accounts. A deposit with subtype cost-basis-fmv records an asset acquired at its fair market value: the lot's cost is its value from rates, plus any fee, so it never starts as missing cost basis. A cost-basis-transfer with subtype wrapping or asset-name-change moves basis from one asset to another. It takes exactly one sent and one received entry, with different assets; the sent lots' total cost and acquisition dates carry to the received asset, with quantity and unit cost rescaled to the received amount; any received quantity the sent lots don't cover is missing cost basis; and a fee on it is a taxable disposition. Its fields are in the Transactions reference.
Where to go next
- User-provided cost basis, for a deposit from outside your platform.
- API reference: Create transfer lots, Create transaction.
Updated 10 days ago
