Gifts

Send a gift of an asset so the recipient's lots carry a cost basis, whether the gifter is on your platform or not.

Part of Handle transfers. A gift arrives in the recipient's account as a deposit with subtype gift. How it gets a cost basis depends on where the gifter is: on your platform, Taxbit can take the gifter's own lots; elsewhere, the recipient tells you what the gifter paid.

By the end of this page you have sent a gift either way, and the recipient's lots carry a cost basis.

Before you begin

When the gifter is on your platform

Send the gifter's side as a withdraw with subtype gift, then the recipient's side as a deposit with subtype gift and the withdrawal's id in counterparty_transaction_id.

curl -X POST $BASE_URL/v1/transactions/external-id \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "wd_61880",
    "account_id": "acct_5f2e7d10",
    "type": "withdraw",
    "subtype": "gift",
    "datetime": "2026-09-14T17:30:00Z",
    "sent": [{
      "asset_amount": { "amount": "0.2", "asset": { "code": "ETH", "type": "Crypto" } },
      "rates": [{ "amount": "3200.00", "asset": { "code": "USD", "type": "Fiat" } }]
    }]
  }'
curl -X POST $BASE_URL/v1/transactions/external-id \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "dep_61881",
    "account_id": "acct_2b7e90c4",
    "type": "deposit",
    "subtype": "gift",
    "counterparty_transaction_id": "wd_61880",
    "datetime": "2026-09-14T17:30:00Z",
    "received": [{
      "asset_amount": { "amount": "0.2", "asset": { "code": "ETH", "type": "Crypto" } },
      "rates": [{ "amount": "3200.00", "asset": { "code": "USD", "type": "Fiat" } }]
    }]
  }'

The recipient's new lots take the gifter's cost and original acquisition dates. Check them with Retrieve inventory on the recipient's account.

How the basis is chosen at sale

Taxbit applies the IRS dual-basis rule when the recipient sells. If the asset's fair market value on the day of the gift was at or above what the gifter paid, the gifter's cost and acquisition date carry through, for a gain or a loss. If it was below: a sale for more than the gifter's cost uses the gifter's cost and reports a gain; a sale for less than the gift-day value uses that value and reports a loss; a sale in between reports no gain or loss. The gift-day value comes from rates on the deposit, so include it: a gift deposit without rates is rejected.

When the gifter is elsewhere

Send the recipient's side alone, as a deposit with subtype gift and no counterparty_transaction_id. Its lot starts as missing cost basis. When the recipient tells you the gifter's acquisition dates and costs, attach them as transfer lots, exactly as User-provided cost basis shows.

If the request fails

  • 400. A field failed validation. The body carries a message, or a messages array when there are several problems.
  • 401. The bearer token is missing, invalid, or expired. Request a new one and retry.
  • 429. Too many requests. Slow down and retry.

The Errors page has every error shape, the rate limits, and which calls are safe to retry.

Parameters

Only the fields that make a transfer a gift. The full schema is in the Transactions reference.

FieldTypeDescription
typestringwithdraw on the gifter's side, deposit on the recipient's side.
subtypestringgift on both sides.
counterparty_transaction_idstringOn the recipient's deposit, when the gifter is on your platform: your id for the gifter's withdrawal.

Where to go next

Back to Handle transfers, or Internal personal transfers for a transfer between two accounts of the same account owner.