Supported methods

The cost-basis method values Taxbit accepts, which objects accept each one, and the fields a SPECID sale needs.

Part of Choose a disposition method, which explains how the cost-basis method (disposition_method) changes reported gains and how to change it.

Accepted values by object

ValueFiler (POST /v1/filers)Account (POST /v1/accounts)Method history (POST /v1/accounts/{id}/disposition-methods/history)Transaction (POST /v1/transactions/external-id)
HIFOYesYesYesYes
FIFOYesYesYesYes
LIFOYesYesYesYes
LOFOYesYesYesYes
AUSTRIAYesYesNoNo
SPECIDNoNoNoYes

PATCH /v1/accounts/{id} does not accept disposition_method, and PATCH /v1/filers/{id} accepts neither disposition_method nor is_default. Change an account's method through its method history.

Methods

ValueNameLots a sale draws from
HIFOHighest in, first outThe highest-cost lots first.
FIFOFirst in, first outThe oldest lots first.
LIFOLast in, first outThe newest lots first.
LOFOLowest in, first outThe lowest-cost lots first.
SPECIDSpecific lot identificationThe lots the transaction names in inventory_lots.
AUSTRIAAustrian withholdingAustria's inventory, gains, and withholding rules. See Austria Tax Withholding.

SPECID transactions

A transaction with disposition_method set to SPECID names the lots it disposes of in inventory_lots.

  • inventory_lots is an object keyed by Taxbit lot ID, each mapped to a quantity. Lot IDs come from GET /v1/inventory; see Retrieve inventory.
  • Required on every crypto line item when disposition_method is SPECID.
  • Allowed only on items in sent and fees, never received. Not permitted on deposit transactions.
  • From 1 to 25 lots per line item.
  • The lot quantities must add up to the line item's asset_amount.

If a named lot can't be found, or holds less than the quantity named for it, Taxbit still accepts the transaction with 201. The calculation then records an INVENTORY_ERROR event for the account with the message Specific lots are missing or contain insufficient quantity, and disposes of the whole amount by the account's default cost-basis method instead of the named lots. A lot ID that isn't a valid UUID is rejected at POST with 400.

{
  "id": "trade_88215",
  "account_id": "acct_5f2e7d10",
  "type": "trade",
  "datetime": "2026-08-03T10:41:00Z",
  "disposition_method": "SPECID",
  "sent": [
    {
      "asset_amount": { "amount": "0.5", "asset": { "code": "ETH", "type": "Crypto" } },
      "rates": [{ "amount": "3100.00", "asset": { "code": "USD", "type": "Fiat" } }],
      "inventory_lots": {
        "b72696f9-0f10-5827-94c3-289b6366a599": { "quantity": "0.5" }
      }
    }
  ],
  "received": [
    {
      "asset_amount": { "amount": "1550.00", "asset": { "code": "USD", "type": "Fiat" } },
      "rates": [{ "amount": "1.00", "asset": { "code": "USD", "type": "Fiat" } }]
    }
  ]
}

Method history entries

FieldTypeRequiredDescription
disposition_methodstringRequiredHIFO, FIFO, LIFO, or LOFO.
effective_datetimestringRequiredISO 8601 timestamp from which the method applies.

The request body is {"data": [...]} with one or more entries; no other fields are accepted. The response returns each entry with a numeric id, used by PATCH and DELETE on /v1/accounts/{id}/disposition-methods/history/{history_id}.

Related