Skip to main content
This section covers:
  • What a subaccount is and how it works
  • Balance types and transaction types
  • Billing and fee configuration
  • Integration steps for subaccount creation

What is a subaccount?

A subaccount is an end-client account tied to one or more beneficial owners (e.g., institutional taxable account, joint account, Roth IRA). It represents one account on the ledger. Each wealth manager has their own ledger instance with two types of subaccounts: 1. End client funds — Track end-client positions and transactions. 2. Anchorage Digital operational funds — Ensure the ledger remains balanced. Include:
Operational subaccountPurpose
Network transaction fees for orgCovers on-chain fees. Does not impact end-client ledger balances.
FBO customer fees for orgAccrues funds for subaccount and custody fees. Only impacted during the billing cycle.
Payables and receivables for orgHolds funds for settling trades with liquidity providers.
Unassigned funds for orgHolds funds not yet assigned to a subaccount (e.g., in-kind deposits with missing attribution).
Each end client may have one or many subaccounts assigned to their customerId. Funds within a subaccount can be rebalanced across other subaccounts for the same end client, provided they are settled.

Balances

Each subaccount tracks three balance types:
BalanceDescription
availableForTradingBalance available to trade — may include unsettled funds.
availableForWithdrawalSettled funds available to withdraw, less any unsettled trades.
totalBalanceBalance after all settlements complete.

Subaccount transaction types

Transaction typeStatus values
DEPOSITPENDING — queued, funds on hold until POSTED or CANCELED.
WITHDRAWALPOSTED — completed and confirmed on blockchain.
TRADECANCELED — funds not transferred.
MANAGEMENT_FEE
ADVISORY_FEE
MODEL_FEE
CUSTODY_FEE

Billing and fee configuration

Plan your billing and fee strategy before onboarding clients.

Billing methods

MethodDescription
Automated billingFees configured at subaccount creation. Billed automatically each cycle.
Manual billingSubmitted by the wealth manager via the manual billing API endpoint before the 10th business day.

Fee model

ModelDescription
BundledSingle “management fee” line item on the PC statement. Anchorage Digital’s custody fee is deducted from the overall fee charged to the wealth manager.
Fully disclosed (unbundled)Each fee type (custody, management, advisory, model) appears as a separate line item on the PC statement.

Fee types

Fee typeDetails
CUSTODY_FEEConfigured by Anchorage Digital during wealth manager onboarding. Rate may change based on total AUC per agreed commercial terms. Not configurable via API. Calculated from end-of-day USD value averaged over the fee period.
MANAGEMENT_FEEFee charged by the wealth manager for managing client assets (typically 1–2% of AUM with minimums).
ADVISORY_FEEConfigured via API at subaccount creation. Used for third-party wealth manager fees; otherwise set to 0.
MODEL_FEEConfigured via API at subaccount creation. Used for model fees.

Fee visibility — isBillable

ValueBehavior
isBillable: trueFee accrues daily AND is billed to the end-client subaccount monthly. Shows as a separate line item on statements. Fees appear on the 1st of the month. Custody fee defaults to true for unbundled billing models.
isBillable: falseFee accrues daily but is NOT billed to the subaccount monthly. Does not appear on statements. Accrued balances are available via API. Useful for tracking internal fee distributions from a single management fee remittance.

Fee accruals

Each subaccount includes an accruedFees section showing estimated fees based on average AUC — not actual point-in-time fees.
accruedValue represents the average fee accrued based on days elapsed and average AUC. It is not the actual fees charged based on prior day accruals, and should not be used to display mid-month “performance net of fees” estimates.
Key fields in accruedFees:
FieldDescription
startPeriodBilling month start date.
endPeriodBilling month end date.
accruedValueAccrued fee value to date for the billing period.
rateFee rate as a decimal (e.g., 0.01 = 1%).
typeFee type corresponding to the accruedFee object.
totalBalanceInUSDMost recent AUC balance in USD used to calculate accrued fees.
stateONGOING — still accruing. DONE — billing period closed.
Example subaccount with fee accruals
{
  "createdAt": "2025-02-01T19:11:06.390Z",
  "customerId": "9bcbbb3136356ff85670085f64cfb4f53419a94277261be0094c4d97de71a4yb",
  "externalSubaccountId": "1A-13579-Doe",
  "fees": [
    { "isBillable": true, "rate": 0, "startDate": "2024-08-02", "type": "ADVISORY" },
    { "isBillable": false, "rate": 0.0025, "startDate": "2024-11-20", "type": "CUSTODY" },
    { "isBillable": true, "rate": 0, "startDate": "2024-08-02", "type": "MANAGEMENT" },
    { "isBillable": true, "rate": 0, "startDate": "2024-08-02", "type": "MODEL" }
  ],
  "name": "1A-13579-Doe",
  "subaccountId": "99fc9d84-4843-4a2c-95cc-1d90385c7955",
  "accruedFees": [
    {
      "accruedValue": "2982.05",
      "endPeriod": "2025-01-31",
      "rate": 0.351,
      "startPeriod": "2025-01-01",
      "state": "DONE",
      "totalBalanceInUSD": "100032.1",
      "type": "CUSTODY"
    },
    {
      "accruedValue": "1731.5",
      "endPeriod": "2025-02-18",
      "rate": 0.351,
      "startPeriod": "2025-02-01",
      "state": "ONGOING",
      "totalBalanceInUSD": "100031.22",
      "type": "ADVISORY"
    }
  ],
  "balances": [
    { "assetType": "BTC", "availableForTrading": "0.00018915", "availableForWithdrawal": "0.00018915", "totalBalance": "0.00032102" },
    { "assetType": "ETH", "availableForTrading": "0.19400093", "availableForWithdrawal": "0", "totalBalance": "0" },
    { "assetType": "USD", "availableForTrading": "87676.46", "availableForWithdrawal": "87676.46", "totalBalance": "100000" }
  ]
}

Fee calculation

accruedValue = (AvgAUC × feeRate) × (numberOfDays / 365)Avg AUC is calculated from totalBalance. This is an estimate — do not use to calculate performance net of fees.

Billing lifecycle

  1. Month 1, day 1 — Billing period starts. accruedFee begins calculating end of day. state: ONGOING.
  2. Month 1, days 2–30accruedFee reflects daily accrual from day 2.
  3. Month 1, last day — Billing period closes. state: DONE.
  4. Month 2, day 1 — Fee transaction appears on the ledger at 8:00 AM ET as PENDING.
  5. Month 2, days 2–9th business day — Billing dispute period. Contact your account point of contact with any questions.
  6. Month 2, 10th business day — Billing finalized. Subaccount transaction updates to POSTED. Fees withdrawn; wealth manager remittance begins. Updates at 8:00 AM ET.
Pro-rated fees apply to subaccounts with mid-month start dates.

Additional billing considerations

  1. Manual billing must be submitted via API before the 10th business day.
  2. Cash management — Keep 3 months of USD in the subaccount to avoid liquidation events that trigger taxable events.
  3. 0-rate fees — No accrual or transaction posted if rate is 0.
  4. Negative USD balances — If USD balance goes negative mid-month, it must be offset before the 10th business day.
  5. Rate changes — Anchorage Digital emails end clients when fees with isBillable: true are created or changed.
  6. Fee rate format — Configure as a decimal: 1% = 0.01.

Integration steps: Subaccount creation

Supported account types

Account typeSubtypeEnd client(s)Client type
IRA1Individual
IRAROLLOVER1Individual
IRACONVERSION1Individual
ROTH1Individual
ROTHROLLOVER1Individual
ROTHCONVERSION1Individual
JOINT2Individual
CUSTODIAL2Individual
INDIVIDUAL_TAXABLE1Individual
INSTITUTIONAL_TAXABLE1Institution
Each subaccount requires a signer who can represent the client. The signer can be the end client themselves or another authorized individual.

Expected program signers by account type

Account typeExpected program signers
IRALinked end client who owns the subaccount
ROTHLinked end client who owns the subaccount
JOINTBoth linked end clients who own the subaccount
CUSTODIALParent end client, not the child
INDIVIDUAL_TAXABLELinked end client who owns the subaccount
INSTITUTIONAL_TAXABLEInitial set of named program signers

Step 1: Create a subaccount application

POST /v2/onboarding/subaccounts Key fields:
FieldDescriptionRequiredTypeRestrictions
legalEntityNameLegal entity nameYesString
accountTypeAccount typeYesEnumIRA, ROTH, JOINT, CUSTODIAL, INDIVIDUAL_TAXABLE, INSTITUTIONAL_TAXABLE
accountSubtypeAccount subtypeOnly for IRA or ROTHEnumROLLOVER or CONVERSION
programSignerGroupList of program signersYesArray
programSignerGroup/programSignerFirstNameFirst nameYesString
programSignerGroup/programSignerLastNameLast nameYesString
programSignerGroup/programSignerEmailEmailYesStringValid email
documentPreferenceAddressDefaultEmailStatement delivery email(s)YesStringComma-separated valid emails
termsAgreementIDTerms agreement IDIf T&Cs enabledStringID from /v2/onboarding/agreements/terms
beneficiaryGroupBeneficiariesNoArray
beneficiaryGroup/beneficiaryTypeTypeYesEnumSPOUSE, FAMILY_OR_FRIEND, CHARITY, TRUST, ESTATE
beneficiaryGroup/beneficiaryNameNameYesString
beneficiaryGroup/beneficiaryAllocationAllocation %Yes, must sum to 100Number1–100
contingencyBeneficiaryGroupContingency beneficiariesNoArraySame structure as beneficiaryGroup
feesFee configurationNoArray
fees/feeTypeFee typeYesEnumADVISORY, MODEL, MANAGEMENT
fees/feeRateFee rateNoNumberDecimal 0–1
fees/feeIsBillableIs fee billable?NoBoolean
programCustomersLinked end clientsYesArray
programCustomers/programCustomerIdEnd client IDYesStringcustomerId
programCustomers/programCustomerRoleRoleYesEnumPRIMARY or SECONDARY
submitSubmit immediatelyNo, defaults to falseBoolean
Example request
{
  "name": "{{name}}",
  "externalId": "{{externalId}}",
  "submit": true,
  "entries": [
    { "key": "legalEntityName", "value": "SubAccount IRA ROLLOVER" },
    { "key": "accountType", "value": "IRA" },
    { "key": "accountSubtype", "value": "ROLLOVER" },
    { "key": "documentPreferenceAddressDefaultEmail", "value": "kevin.flynn_4@test.com" },
    { "key": "programSignerGroup", "value": [
        { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_5", "programSignerEmail": "kevin.flynn_5@test.com" },
        { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_6", "programSignerEmail": "kevin.flynn_6@test.com" }
      ]
    },
    { "key": "programCustomers", "value": [
        { "programCustomerId": "{{customerId1}}", "programCustomerRole": "PRIMARY" }
      ]
    },
    { "key": "beneficiaryGroup", "value": [
        { "beneficiaryType": "SPOUSE", "beneficiaryName": "Test beneficiary", "beneficiaryAllocation": "50" },
        { "beneficiaryType": "CHARITY", "beneficiaryName": "Test beneficiary 2", "beneficiaryAllocation": "50" }
      ]
    },
    { "key": "contingencyBeneficiaryGroup", "value": [
        { "beneficiaryType": "FAMILY_OR_FRIEND", "beneficiaryName": "Test beneficiary 3", "beneficiaryAllocation": "25" },
        { "beneficiaryType": "TRUST", "beneficiaryName": "Test beneficiary 4", "beneficiaryAllocation": "75" }
      ]
    },
    { "key": "fees", "value": [
        { "feeType": "ADVISORY", "feeRate": "0.1" },
        { "feeType": "MANAGEMENT", "feeRate": "0.25", "feeIsBillable": true }
      ]
    }
  ]
}
A unique subaccountId is returned for all future references to this subaccount.

Step 2: Check subaccount application status

GET /v2/onboarding/subaccounts/{subaccountId} Errors and missing documents are listed in the errors array of the response.
Example response
{
  "data": {
    "entries": [
      { "key": "programSignerGroup", "value": [
          { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_5", "programSignerEmail": "kevin.flynn_5@test.com" },
          { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_6", "programSignerEmail": "kevin.flynn_6@test.com" }
        ]
      },
      { "key": "documentPreferenceAddressDefaultEmail", "value": "kevin.flynn_4@test.com" },
      { "key": "accountType", "value": "IRA" },
      { "key": "accountSubtype", "value": "ROLLOVER" },
      { "key": "programCustomers", "value": [
          { "programCustomerId": "43a37de2dcc326579fe9ab3a187c48b786007bd759802dfa04ef1aa35383a273", "programCustomerRole": "PRIMARY" }
        ]
      }
    ],
    "errors": [],
    "externalId": "37c4abc1-b94b-48d7-a41b-c4e4becc865a",
    "name": "SubAccount IRA ROLLOVER 20250407-2",
    "status": "IN_PROGRESS",
    "subaccountId": "4305271f-7c1c-4b72-bb80-82b2e144d19d"
  }
}

Step 3: Submit the application (if submit: false)

POST /v2/onboarding/subaccounts/{subaccountId}/submit

Step 4: Check subaccount approval status

GET /v2/subaccounts/customers/accounts?subaccountIds={subaccountId} Status values: PENDING (received, awaiting approval) → OPEN (approved and active). Alternatively, subscribe to the subaccount.opened webhook event for async notification.
Example response (approved)
{
  "data": {
    "applicationId": "6ba46417-66dc-424e-8e68-4fbd2597d993",
    "entries": [
      { "key": "programSignerGroup", "value": [
          { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_5", "programSignerEmail": "kevin.flynn_5@test.com" },
          { "programSignerFirstName": "Kevin", "programSignerLastName": "Flynn_6", "programSignerEmail": "kevin.flynn_6@test.com" }
        ]
      },
      { "key": "programCustomers", "value": [
          { "programCustomerId": "43a37de2dcc326579fe9ab3a187c48b786007bd759802dfa04ef1aa35383a273", "programCustomerRole": "PRIMARY" }
        ]
      },
      { "key": "accountSubtype", "value": "ROLLOVER" },
      { "key": "accountType", "value": "IRA" },
      { "key": "beneficiaryGroup", "value": [
          { "beneficiaryAllocation": "50", "beneficiaryName": "Test beneficiary", "beneficiaryRelation": "Primary", "beneficiaryType": "Spouse" },
          { "beneficiaryAllocation": "50", "beneficiaryName": "Test beneficiary 2", "beneficiaryRelation": "Contingency", "beneficiaryType": "Charity" }
        ]
      },
      { "key": "fees", "value": [
          { "feeRate": "0.1", "feeType": "Advisory" },
          { "feeIsBillable": "Yes", "feeRate": "0.25", "feeType": "Management" }
        ]
      },
      { "key": "documentPreferenceAddressDefaultEmail", "value": "gareth.test_3@test.com" },
      { "key": "legalEntityName", "value": "SubAccount IRA ROLLOVER" }
    ],
    "errors": [],
    "status": "COMPLETE"
  }
}

Changelog

DateChange
June 10, 2025Updates for new onboarding API payloads and flows
May 1, 2025Initial version