Fees
A fee is a reusable set of rules that define how a portfolio is charged. This API does not yet support filters.

| Base route | /v1/fees |
| Endpoints | GET /v1/fees /v1/fees/:id /v1/fees/:id/relationships/fee_schedules /v1/fees/:id/fee_schedules POST /v1/fees PUT /v1/fees /v1/fees/:id DELETE /v1/fees /v1/fees/:id |
| Produces | JSON |
| Pagination | Yes |
| Application permissions required | GET "View-only access to Billing" POST, PATCH, and DELETE "Run and manage bills, include fee adjustment and payment tracking" or "Full access to Billing and billing data" |
| OAuth scopes | GETBILLING_READPOST, PATCH, and DELETE BILLING_WRITE |
Resource overview
There are three slight variations of fee types.
The following fields are consistent across the different fee types.
| Attribute | Description | Example | Required | Accepted Values |
|---|---|---|---|---|
name | The fee name | Fee name | Yes | String |
description | A Description of the fee | This is a fee | No | String |
fee_type | A way to group similar fees | Fee type | No | String |
asset_valuation | Settings that determine how billable assets are calculated | Yes | JSON Object | |
asset_valuation.method | The billable value used to compute the fee | AVERAGE_DAILY | Yes | ON_BILL_DATE, AVERAGE_MONTHLY, AVERAGE_DAILY |
asset_valuation.adjustment_type | Choose whether the fee will include adjusted values or estimated values in the billable values | NONE | Yes | NONE, ADJUSTED_VALUE, ESTIMATED_RETURNS, ADJUSTED_ESTIMATED_RETURNS |
asset_valuation.accrual_type | Select what, if any, types of accrued income and/or dividends are included in the billable values | ALL | Yes | ALL, CASH_AND_DIVIDENDS, CASH_AND_INTEREST, NONE |
scaling_for_average_asset_valuation | Scaling method used for partial periods when valuation is set to average balance. New and Closed Billable Portfolios in Addepar fee settings. AVERAGE_ACROSS_ENTIRE_PERIOD - applies the scaling to the valuation process SCALE_RATE - applies the scaling to the rate being charged AVERAGE_ACROSS_HELD_PERIOD - doesn't scale | SCALE_RATE | When asset_valuation.method is AVERAGE_MONTHLY or AVERAGE_DAILY, | AVERAGE_ACROSS_ENTIRE_PERIOD, SCALE_RATE, AVERAGE_ACROSS_HELD_PERIOD |
fee_structure | Determines how a fee is computed | AUM | Yes | FLAT or AUM |
scaling | When defining fees, the rates and flat fees are both defined annually. These must then be scaled to the size of the billing period | EVEN | Yes | EVEN or DAYS_IN_PERIOD |
margin_handling_method | Choose how to treat any margin positions | USE_VALUE | Yes | USE_VALUE, NET_AS_ZERO, NET_ABSOLUTE, GROSS_ABSOLUTE, GROSS_AS_ZERO |
The following fields are only valid when the fee_structure is FLAT.
| Attribute | Description | Example | Required (When structure is FLAT) | Accepted Values |
|---|---|---|---|---|
flat_fee_amount | The total annual flat fee amount, will be divided and billed based on the billing interval | 100 | Yes | Double |
flat_fee_apply_to | What level the fee is applied to | DIRECT_OWNER | Yes | BILLABLE_PORTFOLIO, DIRECT_OWNER, HOLDING_ACCOUNT |
The following fields are only valid when the fee_structure is AUM.
| Attribute | Description | Example | Required (When structure is AUM) | Accepted Values |
|---|---|---|---|---|
rate_calculation | Determines the methodology used to calculate the rate in multi-tier fees. TOP - The assets are evaluated against the tiers, and then the rate from the highest tier hit by the assets is applied to all the billable assets MARGINAL - The rate for each tier is applied to the value of the billable assets in that tier MARGINAL_WITH_RANKED_ENTITIES - In this calculation option, direct owners are ranked and then passed through rate tiers in ranking order, where rank one passes through first, starting at the highest rate | TOP | Yes | TOP, MARGINAL, MARGINAL_WITH_RANKED_ENTITIES |
rate_tiers | Array of rate tier objects | Yes | Array of JSON Objects | |
rate_tiers.rate | The annual rate as a percentage | 0.1 | Yes | Double, between -1.0 ands 1.0 |
rate_tiers.lower_bound | Amount for the tiers lower bound. At least one tier must have a lower bound of 0 | 0 | Yes | Double |
rate_tiers.id | A read only generated id | No (Read Only) | Integer |
The following fields are only valid when the fee_structure is AUM and the rate_calculation is either TOP or MARGINAL. advance_adjustment and proration are mutually exclusive.
| Attribute | Description | Example | Required | Accepted Values |
|---|---|---|---|---|
rate_asset_valuation | Defines what the fee is to be charged against | No (Defaults to ASSETS_BILLED_ON, can only be updated with an edit) | BILLABLE_ASSETS, ASSETS_BILLED_ON, RATE_FILTERED_ASSETS | |
advance_adjustment | An advance adjustment object used when billing in advance, to adjust for differences between the previous and current bills | No (Mutually Exclusive with proration) | JSON Object | |
advance_adjustment.rate_type | Options are the same as rate calculation above. | TOP | Yes | TOP or MARGINAL |
advance_adjustment.accounts_to_evaluate | Which accounts to pickup in the calculation | ALL_ACCOUNTS | Yes | ALL_ACCOUNTS, ONLY_NEW_AND_CLOSED_ACCOUNTS, ONLY_NEW_AND_CLOSED_PORTFOLIOS |
proration | Proration allows you to bill for only the time when a client's assets were officially billable. At least one of the two types must be in use to have this field present. | No (Mutually Exclusive with advance_adjustment) | JSON Object | |
proration.new_and_closed_accounts | Used to configure how the fee is prorated across new and closed accounts | No (One of the proration types must be set if proration is set however) | JSON Object | |
proration.new_and_closed_accounts.method | GROSS excludes fees, NET includes fees as flows | NET | Yes | GROSS, NET, USING_VALUE_ON_START_OR_END_DATE, USING_VALUE_ON_BILL_DATE |
proration.new_and_closed_accounts.threshold | Proration will only apply if the net cash flow is greater than either of the following. Both will default to 0 if not set | No (defaults both monetary_value and percentage to 0) | JSON Object | |
proration.new_and_closed_accounts.threshold.monetary_value | The monetary value threshold | 100.0 | No (defaults to 0) | Double |
proration.new_and_closed_accounts.threshold.percentage | The percentage of the total portfolio value threshold | 10.0 | No (defaults to 0) | Double |
proration.new_and_closed_accounts.rate_calculation | Same as the rate calculation above | TOP | Yes | TOP or MARGINAL |
proration.new_and_closed_accounts.threshold.percentage | The percentage of the total portfolio value threshold | 10.0 | No (defaults to 0) | Double |
proration.new_and_closed_accounts.rate_calculation | Same as the rate calculation above | TOP | Yes | TOP or MARGINAL |
proration.existing_accounts | Used to configure how the fee is prorated across existing accounts based on the flow | No (One of the proration types must be set if proration is set however) | JSON Object | |
proration.existing_accounts.method | GROSS excludes fees, NET includes fees as flows | NET | Yes | GROSS or NET |
proration.existing_accounts.threshold | Proration will only apply if the net cash flow is greater than either of the following. Both will default to 0 if not set | No (defaults both monetary_value and percentage to 0) | JSON Object | |
proration.existing_accounts.threshold.monetary_value | The monetary value threshold | 100.0 | No (defaults to 0) | Double |
proration.existing_accounts.threshold.percentage | The percentage of the total portfolio value threshold | 10.0 | No (defaults to 0) | Double |
proration.existing_accounts.rate_calculation | Same as the rate calculation above | TOP | Yes | TOP or MARGINAL |
Relationships
| Relationship | Description |
|---|---|
fee_schedules | The fee_schedules that the fee is associated with. Read Only. |
Get all fees
Retrieves all fees.
This API provides pagination. The following query parameters are available:
page[limit](max: 500) to set the page size- and
page[cursor]query parameters for pagination. The response includeslinks.nextfor the next page andmeta.page.totalfor the total count.
Append ?include=fee_schedules to include associated fee schedules in the response.
GET /v1/fees
Example:
GET https://examplefirm.addepar.com/api/v1/fees?page[limit]=3
HTTP/1.1 200
{
"meta": {
"page": {
"total": 404,
"offset": 0,
"limit": 3,
"cursor": null
}
},
"data": [
{
"id": "1",
"type": "fees",
"attributes": {
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE",
"flat_fee_amount": 2500.0,
"name": "Annual Management Fee",
"description": "Fixed annual management fee applied per household",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "NONE"
},
"fee_structure": "FLAT",
"fee_type": "Management Fee",
"flat_fee_apply_to": "DIRECT_OWNER"
},
"relationships": {
"fee_schedules": {
"links": {
"self": "/public/billing/fees/1/relationships/fee_schedules",
"related": "/public/billing/fees/1/fee_schedules"
},
"data": []
}
},
"links": {
"self": "/public/billing/fees/1"
}
},
{
"id": "2",
"type": "fees",
"attributes": {
"scaling": "DAYS_IN_PERIOD",
"rate_tiers": [
{
"id": 32679,
"rate": 1.0,
"lower_bound": 0.0
},
{
"id": 32680,
"rate": 0.75,
"lower_bound": 500000.0
},
{
"id": 32681,
"rate": 0.5,
"lower_bound": 1000000.0
}
],
"margin_handling_method": "NET_AS_ZERO",
"rate_calculation": "TOP",
"name": "Standard AUM Fee",
"description": "Top-tier AUM-based advisory fee with advance adjustment",
"asset_valuation": {
"method": "AVERAGE_DAILY",
"adjustment_type": "ADJUSTED_VALUE",
"accrual_type": "ALL"
},
"fee_structure": "AUM",
"fee_type": "Advisory Fee",
"scaling_for_average_asset_valuation": "SCALE_RATE",
"advance_adjustment": {
"rate_type": "TOP",
"accounts_to_evaluate": "ONLY_NEW_AND_CLOSED_ACCOUNTS"
},
"rate_asset_valuation": "ASSETS_BILLED_ON"
},
"relationships": {
"fee_schedules": {
"links": {
"self": "/public/billing/fees/2/relationships/fee_schedules",
"related": "/public/billing/fees/2/fee_schedules"
},
"data": []
}
},
"links": {
"self": "/public/billing/fees/2"
}
},
{
"id": "3",
"type": "fees",
"attributes": {
"scaling": "EVEN",
"rate_tiers": [
{
"id": 32682,
"rate": 1.0,
"lower_bound": 0.0
},
{
"id": 32683,
"rate": 0.8,
"lower_bound": 250000.0
},
{
"id": 32684,
"rate": 0.5,
"lower_bound": 1000000.0
},
{
"id": 32685,
"rate": 0.25,
"lower_bound": 5000000.0
}
],
"margin_handling_method": "GROSS_ABSOLUTE",
"rate_calculation": "MARGINAL_WITH_RANKED_ENTITIES",
"name": "Marginal With Ranked Entities Tiered Fee",
"description": "Marginal rate with ranked entities across household accounts",
"asset_valuation": {
"method": "AVERAGE_MONTHLY",
"adjustment_type": "ESTIMATED_RETURNS",
"accrual_type": "CASH_AND_DIVIDENDS"
},
"fee_structure": "AUM",
"fee_type": "Household Advisory Fee",
"scaling_for_average_asset_valuation": "AVERAGE_ACROSS_ENTIRE_PERIOD"
},
"relationships": {
"fee_schedules": {
"links": {
"self": "/public/billing/fees/3/relationships/fee_schedules",
"related": "/public/billing/fees/3/fee_schedules"
},
"data": [
{
"type": "fee_schedules",
"id": "2"
}
]
}
},
"links": {
"self": "/public/billing/fees/3"
}
}
],
"included": [],
"links": {
"prev": null,
"next": "/public/billing/fees?page[limit]=3&page[after]=3"
}
}
Responses
200 OK401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions
Get fee by ID
Retrieves a fee by its ID.
Append ?include=fee_schedules to include associated fee schedules in the response.
GET /v1/fees/:fee_id
Example:
GET https://examplefirm.addepar.com/api/v1/fees/1
HTTP/1.1 200
{
"data": {
"id": "1",
"type": "fees",
"attributes": {
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE",
"flat_fee_amount": 2500.0,
"name": "Annual Management Fee",
"description": "Fixed annual management fee applied per household",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "NONE"
},
"fee_structure": "FLAT",
"fee_type": "Management Fee",
"flat_fee_apply_to": "DIRECT_OWNER"
},
"relationships": {
"fee_schedules": {
"links": {
"self": "/public/billing/fees/1/relationships/fee_schedules",
"related": "/public/billing/fees/28842/fee_schedules"
},
"data": []
}
},
"links": {
"self": "/public/billing/fees/1"
}
},
"included": []
}
Responses
200 OK401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions404 Not Found: The requested fee was not found
Get fee schedule relationships by fee ID
Retrieves the fee schedule relationships by fee ID.
GET /v1/fees/:fee_id/relationships/fee_schedules
Example:
GET https://examplefirm.addepar.com/api/v1/fees/3/relationships/fee_schedules
HTTP/1.1 200
{
"data": [
{
"id": "2",
"type": "fee_schedules"
}
]
}
Responses
200 OK401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions404 Not Found: The requested fee was not found
Get fee schedules by fee ID
Retrieves fee schedules that have the fee with the ID.
GET /v1/fees/:fee_id/fee_schedules
Example:
GET https://examplefirm.addepar.com/api/v1/fees/3/fee_schedules
HTTP/1.1 200
{
"data": [
{
"id": "2",
"type": "fee_schedules",
"attributes": {
"billing_period_cycle_start_month": 1,
"timing": "IN_ARREARS",
"name": "Name 10",
"minimum_fee": 1000.0,
"description": "Description 10",
"maximum_fee": 50000.0,
"rounding": "HALF_EVEN",
"currency": "GBP",
"interval": "ANNUALLY",
"last_modified": "2026-04-06T12:35:30Z"
},
"relationships": {
"fees": {
"data": [
{
"type": "fees",
"id": "3"
}
]
}
},
"links": {
"self": "/v1/fee_schedules/2"
}
}
],
"included": [],
"links": {
"prev": null,
"next": null
}
}
Responses
200 OK401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions404 Not Found: The requested fee was not found
Create fees
Creates all fees passed in the request body as a list. In case of error, none of the fees are created.
POST /v1/fees
Example:
POST https://examplefirm.addepar.com/api/v1/fees
{
"data": [
{
"type": "fees",
"attributes": {
"name": "Annual Management Fee",
"fee_type": "Management Fee",
"description": "Fixed annual management fee applied per household",
"fee_structure": "FLAT",
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "NONE"
},
"flat_fee_amount": 2500.0,
"flat_fee_apply_to": "DIRECT_OWNER"
}
},
{
"type": "fees",
"attributes": {
"name": "Standard AUM Fee",
"fee_type": "Advisory Fee",
"description": "Top-tier AUM-based advisory fee with advance adjustment",
"fee_structure": "AUM",
"scaling": "DAYS_IN_PERIOD",
"margin_handling_method": "NET_AS_ZERO",
"asset_valuation": {
"method": "AVERAGE_DAILY",
"adjustment_type": "ADJUSTED_VALUE",
"accrual_type": "ALL"
},
"scaling_for_average_asset_valuation": "SCALE_RATE",
"rate_calculation": "TOP",
"rate_tiers": [
{
"rate": 1.0,
"lower_bound": 0.0
},
{
"rate": 0.75,
"lower_bound": 500000.0
},
{
"rate": 0.5,
"lower_bound": 1000000.0
}
],
"advance_adjustment": {
"rate_type": "TOP",
"accounts_to_evaluate": "ONLY_NEW_AND_CLOSED_ACCOUNTS"
}
}
},
{
"type": "fees",
"attributes": {
"name": "Marginal With Ranked Entities Tiered Fee",
"fee_type": "Household Advisory Fee",
"description": "Marginal rate with ranked entities across household accounts",
"fee_structure": "AUM",
"scaling": "EVEN",
"margin_handling_method": "GROSS_ABSOLUTE",
"asset_valuation": {
"method": "AVERAGE_MONTHLY",
"adjustment_type": "ESTIMATED_RETURNS",
"accrual_type": "CASH_AND_DIVIDENDS"
},
"scaling_for_average_asset_valuation": "AVERAGE_ACROSS_ENTIRE_PERIOD",
"rate_calculation": "MARGINAL_WITH_RANKED_ENTITIES",
"rate_tiers": [
{
"rate": 1.0,
"lower_bound": 0.0
},
{
"rate": 0.8,
"lower_bound": 250000.0
},
{
"rate": 0.5,
"lower_bound": 1000000.0
},
{
"rate": 0.25,
"lower_bound": 5000000.0
}
]
}
}
]
}
HTTP/1.1 201
{
"data": [
{
"id": "10",
"type": "fees",
"links": {
"self": "/v1/fees/10"
}
},
{
"id": "11",
"type": "fees",
"links": {
"self": "/v1/fees/11"
}
},
{
"id": "12",
"type": "fees",
"links": {
"self": "/v1/fees/12"
}
}
]
}
Responses
201 Created401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions400 Bad Request- Indicates an invalid request body, with a reason specified in the error message
- All the validation errors causing a 400 Bad Request are listed in the
Validation Errorssection
Edit fee
Edits a fee. The fee in the request body will fully replace the current version, including fee schedule relationships.
PUT /v1/fees/:fee_id
Example:
PUT https://examplefirm.addepar.com/api/v1/fees/1
{
"data": {
"id": 1,
"type": "fees",
"attributes": {
"name": "Updated Annual Management Fee",
"fee_type": "Management Fee",
"description": "Fixed annual management fee applied per household",
"fee_structure": "FLAT",
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "NONE"
},
"flat_fee_amount": 3000.0,
"flat_fee_apply_to": "DIRECT_OWNER"
}
}
}
HTTP/1.1 200
{
"data": [
{
"id": "1",
"type": "fees",
"links": {
"self": "/v1/fees/1"
}
}
]
}
Responses
200 OK401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions404 Not Found: The requested fee_schedules was not found400 Bad Request- Indicates an invalid request body, with a reason specified in the error message
- All the validation errors causing a 400 Bad Request are listed in the
Validation Errorssection
Edit fees
Edits a list of fees. In case of errors, none of the fees in the list are updated.
The fees in the request body will fully replace the current versions, including fee schedule relationships.
PUT /v1/fees
Example:
PUT https://examplefirm.addepar.com/api/v1/fees
{
"data": [
{
"id": 1,
"type": "fees",
"attributes": {
"name": "Updated Annual Management Fee",
"fee_type": "Management Fee",
"description": "Fixed annual management fee applied per household",
"fee_structure": "FLAT",
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "NONE"
},
"flat_fee_amount": 3000.0,
"flat_fee_apply_to": "DIRECT_OWNER"
}
},
{
"id": "2",
"type": "fees",
"attributes": {
"name": "Standard AUM Fee",
"fee_type": "Advisory Fee",
"description": "Top-tier AUM-based advisory fee with proration",
"fee_structure": "AUM",
"scaling": "DAYS_IN_PERIOD",
"margin_handling_method": "NET_AS_ZERO",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "ADJUSTED_VALUE",
"accrual_type": "ALL"
},
"rate_calculation": "TOP",
"rate_tiers": [
{
"rate": 1.0,
"lower_bound": 0.0
},
{
"rate": 0.75,
"lower_bound": 500000.0
},
{
"rate": 0.5,
"lower_bound": 1000000.0
}
],
"proration": {
"new_and_closed_accounts": {
"method": "NET",
"rate_calculation": "TOP",
"threshold": {
"monetary_value": 10000.0,
"percentage": 5.0
}
},
"existing_accounts": {
"method": "NET",
"rate_calculation": "TOP",
"threshold": {
"monetary_value": 25000.0,
"percentage": 10.0
}
}
}
}
}
]
}
HTTP/1.1 200
{
"data": [
{
"id": "1",
"type": "fees",
"links": {
"self": "/v1/fees/1"
}
},
{
"id": "2",
"type": "fees",
"links": {
"self": "/v1/fees/2"
}
}
]
}
Responses
200 OK401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions400 Bad Request- Indicates an invalid request body, with a reason specified in the error message
- All the validation errors causing a 400 Bad Request are listed in the
Validation Errorssection
Delete fee
Deletes a fee.
DELETE /v1/fees/:fee_id
Example:
DELETE https://examplefirm.addepar.com/api/v1/fees/1
HTTP/1.1 204
Responses
204 No Content401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions404 Not Found: The requested fee was not found
Delete fees
Deletes a list of fees. In case of error, none of the fees are deleted.
DELETE /v1/fees
Example:
DELETE https://examplefirm.addepar.com/api/v1/fees
{
"data": [
{
"type": "fees",
"id": "2"
},
{
"type": "fees",
"id": "3"
}
]
}
HTTP/1.1 204
Responses
204 No Content400 Bad Request- Indicates an invalid request body, with a reason specified in the error message
401 Unauthorized: Missing or invalid authentication403 Forbidden: User lacks sufficient application permissions404 Not Found: One of the fees was not found
Request body types
Example JSON payloads to create single fees
{
"data": {
"type": "fees",
"attributes": {
"name": "Simple Flat Fee",
"fee_type": "ACCOUNT_FEE",
"description": "Basic flat fee with minimal configuration",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "NONE"
},
"fee_structure": "FLAT",
"flat_fee_amount": 500.0,
"flat_fee_apply_to": "BILLABLE_PORTFOLIO",
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE"
}
}
}
{
"data": {
"type": "fees",
"attributes": {
"name": "AUM Fee with TOP Rate Calculation",
"fee_type": "MANAGEMENT",
"description": "AUM fee using TOP rate with multiple tiers",
"asset_valuation": {
"method": "AVERAGE_DAILY",
"adjustment_type": "ADJUSTED_VALUE",
"accrual_type": "ALL"
},
"scaling_for_average_asset_valuation": "AVERAGE_ACROSS_ENTIRE_PERIOD",
"fee_structure": "AUM",
"rate_calculation": "TOP",
"rate_tiers": [
{
"rate": 0.01,
"lower_bound": 0.0
},
{
"rate": 0.0075,
"lower_bound": 500000.0
}
],
"scaling": "EVEN",
"margin_handling_method": "NET_AS_ZERO"
}
}
}
{
"data": {
"type": "fees",
"attributes": {
"name": "AUM Fee with Advance Adjustment",
"fee_type": "PERFORMANCE",
"description": "AUM fee with advance adjustment configuration",
"asset_valuation": {
"method": "AVERAGE_DAILY",
"adjustment_type": "ADJUSTED_ESTIMATED_RETURNS",
"accrual_type": "CASH_AND_INTEREST"
},
"scaling_for_average_asset_valuation": "AVERAGE_ACROSS_HELD_PERIOD",
"fee_structure": "AUM",
"rate_calculation": "TOP",
"rate_tiers": [
{
"rate": 0.02,
"lower_bound": 0.0
}
],
"advance_adjustment": {
"rate_type": "MARGINAL",
"accounts_to_evaluate": "ONLY_NEW_AND_CLOSED_ACCOUNTS"
},
"scaling": "EVEN",
"margin_handling_method": "NET_ABSOLUTE"
}
}
}
{
"data": {
"type": "fees",
"attributes": {
"name": "AUM Fee with Proration Settings",
"fee_type": "MANAGEMENT",
"description": "AUM fee with comprehensive proration for new/closed and existing accounts",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "ALL"
},
"fee_structure": "AUM",
"rate_calculation": "MARGINAL",
"rate_tiers": [
{
"rate": 0.0125,
"lower_bound": 0.0
},
{
"rate": 0.0085,
"lower_bound": 2000000.0
}
],
"proration": {
"new_and_closed_accounts": {
"method": "NET",
"threshold": {
"monetary_value": 10000.0,
"percentage": 0.5
},
"rate_calculation": "TOP"
},
"existing_accounts": {
"method": "GROSS",
"threshold": {
"monetary_value": 5000.0,
"percentage": 0.25
},
"rate_calculation": "MARGINAL"
}
},
"scaling": "DAYS_IN_PERIOD",
"margin_handling_method": "GROSS_AS_ZERO"
}
}
}
{
"data": {
"type": "fees",
"attributes": {
"name": "AUM Fee with Proration Settings",
"fee_type": "MANAGEMENT",
"description": "AUM fee with comprehensive proration for new/closed and existing accounts",
"asset_valuation": {
"method": "ON_BILL_DATE",
"adjustment_type": "NONE",
"accrual_type": "ALL"
},
"fee_structure": "AUM",
"rate_calculation": "MARGINAL",
"rate_tiers": [
{
"rate": 0.0125,
"lower_bound": 0.0
},
{
"rate": 0.0085,
"lower_bound": 2000000.0
}
],
"proration": {
"existing_accounts": {
"method": "GROSS",
"threshold": {
"monetary_value": 5000.0,
"percentage": 0.25
},
"rate_calculation": "MARGINAL"
}
},
"scaling": "DAYS_IN_PERIOD",
"margin_handling_method": "GROSS_AS_ZERO"
}
}
}
{
"data": {
"type": "fees",
"attributes": {
"name": "MARGINAL_WITH_RANKED_ENTITIES AUM Fee",
"fee_type": "MANAGEMENT",
"description": "Marginal fee with ranked entities",
"asset_valuation": {
"method": "AVERAGE_DAILY",
"adjustment_type": "ADJUSTED_VALUE",
"accrual_type": "NONE"
},
"scaling_for_average_asset_valuation": "AVERAGE_ACROSS_ENTIRE_PERIOD",
"fee_structure": "AUM",
"rate_calculation": "MARGINAL_WITH_RANKED_ENTITIES",
"rate_tiers": [
{
"rate": 0.01,
"lower_bound": 0.0
},
{
"rate": 0.0075,
"lower_bound": 1000000.0
},
{
"rate": 0.005,
"lower_bound": 3000000.0
}
],
"scaling": "EVEN",
"margin_handling_method": "USE_VALUE"
}
}
}
Validation errors
Common (all fee structures)
Request Shape
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Bulk create limit | POST with greater than 500 fees | Request payload size cannot exceed 500 items for fees | 400 |
| Bulk update limit | PUT with greater than 500 fees | Request payload size cannot exceed 500 items for fees | 400 |
| ID mismatch | PUT {id} where path ID != body ID | The id field must match the id provided in the url | 409 |
| Wrong type on bulk delete | Bulk DELETE with type != fees | type must be fees | 409 |
Character Limits
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| name too long | name greater than 128 characters | The following attributes contain too many characters: [name] | 400 |
| description too long | description greater than 255 characters | The following attributes contain too many characters: [description] | 400 |
| fee_type too long | fee_type greater than 200 characters | The following attributes contain too many characters: [fee_type] | 400 |
Required Fields
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Missing shared fields | Any of name, fee_structure, scaling, margin_handling_method is null | The following parameters are missing: [<fields>] | 400 |
| Missing asset_valuation | asset_valuation is null | The following parameters are missing: [asset_valuation] | 400 |
| Missing valuation subfields | asset_valuation.accrual_type, .method, or .adjustment_type is null | The following parameters are missing: [asset_valuation.<field>] | 400 |
| Missing scaling_for_average | asset_valuation.method is AVERAGE_MONTHLY or AVERAGE_DAILY and scaling_for_average_asset_valuation is null | The following parameters are missing: [scaling_for_average_asset_valuation] | 400 |
| Scaling inapplicable | asset_valuation.method is ON_BILL_DATE and scaling_for_average_asset_valuation is set | scaling_for_average_asset_valuation is not applicable when asset_valuation.method is ON_BILL_DATE | 400 |
Note: Missing shared fields,
asset_valuation, valuation subfields, andscaling_for_average_asset_valuationare collected into a single list. If multiple are missing, they appear together in one error:The following parameters are missing: [name, fee_structure, asset_valuation, ...].
Create Restrictions
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| rate_asset_valuation on create | rate_asset_valuation provided on POST | The following attribute(s) cannot be included in a POST: [rate_asset_valuation] | 400 |
Relationships
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Fee schedule on fee | fee_schedules relationship data is set | Fee schedule relationships cannot be set on fees. Use the fee schedule relationship endpoints to manage fee assignments. | 400 |
Delete
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Not found | Fee ID doesn't exist | The requested fee was not found for <id> | 404 |
| Cannot delete | Fee is in use | Can't delete <id>. <details> | 400 |
Bulk Error Wrapping
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Validation failure in bulk | Any validation fails in a multi-fee request | Failed to validate fee '<name>': <error> or Failed to validate fee at index <i>: <error> | 400 or 404 |
Note: Bulk wrapping only applies when the request contains more than one fee. Single-fee requests return the underlying error directly.
FLAT Fees
Required Fields
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Missing flat fee fields | flat_fee_amount or flat_fee_apply_to is null | The following parameters are missing: [<fields>] | 400 |
Note: If both are missing, they appear in a single error:
The following parameters are missing: [flat_fee_amount, flat_fee_apply_to].
Inapplicable Fields
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| AUM fields on FLAT | Any of rate_calculation, rate_tiers, proration, advance_adjustment, rate_asset_valuation is set | The following fields are not applicable for FLAT fee structure: [<fields>] | 400 |
AUM Fees (all rate calculations)
Required Fields
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Missing AUM fields | rate_calculation or rate_tiers is null | The following parameters are missing: [<fields>] | 400 |
Note: If both are missing, they appear in a single error:
The following parameters are missing: [rate_calculation, rate_tiers].
Inapplicable Fields
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| FLAT fields on AUM | flat_fee_amount or flat_fee_apply_to is set | The following fields are not applicable for AUM fee structure: [<fields>] | 400 |
Note: All inapplicable fields present are collected into a single error message.
Rate Tiers
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Empty list | rate_tiers is [] | rate_tiers must contain at least one rate tier | 400 |
| Null tier | A tier entry is null | rate_tiers[<i>] must not be null | 400 |
| Missing tier fields | Tier missing rate or lower_bound | The following parameters are missing: [rate_tiers[<i>].rate, rate_tiers[<i>].lower_bound] | 400 |
| Rate out of range | rate less than -1.0 or greater than 1.0 | rate_tiers[<i>]: Rates must be between -1.0 and 1.0! | 400 |
| Duplicate lower bounds | Two tiers share the same lower_bound value | rate_tiers[<i>]: Invalid bounds: $<x> - $<x> | 400 |
| Single tier lower != 0 | Sole tier has lower_bound != 0 | rate_tiers: Lower Bound of sole tier must be 0 | 400 |
| First tier lower != 0 | First tier (of multiple) has lower_bound != 0 | rate_tiers: First tier must have a lower bound of 0 | 400 |
Note: Rate tiers do not have to be in order, they will be automatically sorted. The index will reference the offending rate tiers position in the array pre-sort.
AUM — MARGINAL_WITH_RANKED_ENTITIES
Inapplicable Fields
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Restricted fields | Any of flat_fee_amount, flat_fee_apply_to, advance_adjustment, proration, rate_asset_valuation is set | The following fields are not applicable for AUM fees with rate_calculation MARGINAL_WITH_RANKED_ENTITIES: [<fields>] | 400 |
Note: Both AUM-general inapplicable fields (
flat_fee_amount,flat_fee_apply_to) and MARGINAL_WITH_RANKED_ENTITIES-specific inapplicable fields (advance_adjustment,proration,rate_asset_valuation) are combined into a single error message.
AUM — TOP or MARGINAL
Advance Adjustment
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Missing advance adjustment fields | advance_adjustment present but accounts_to_evaluate or rate_type is null | The following parameters are missing: [<fields>] | 400 |
Note: If both are missing, they appear in a single error:
The following parameters are missing: [advance_adjustment.accounts_to_evaluate, advance_adjustment.rate_type].
Proration
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| No sub-objects | proration present but both new_and_closed_accounts and existing_accounts are null | The following parameters are missing: [proration.new_and_closed_accounts, proration.existing_accounts] | 400 |
| Missing new/closed fields | new_and_closed_accounts present but method or rate_calculation is null | The following parameters are missing: [proration.new_and_closed_accounts.method, proration.new_and_closed_accounts.rate_calculation] | 400 |
| Missing existing fields | existing_accounts present but method or rate_calculation is null | The following parameters are missing: [proration.existing_accounts.method, proration.existing_accounts.rate_calculation] | 400 |
Note: Missing fields from both
new_and_closed_accountsandexisting_accountsare collected into a single error message.
Proration Thresholds
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Negative monetary_value (new/closed) | new_and_closed_accounts.threshold.monetary_value less than 0 | Minimum threshold for new and closed account proration must be non-negative | 400 |
| Negative monetary_value (existing) | existing_accounts.threshold.monetary_value less that 0 | Minimum threshold for flow proration must be non-negative | 400 |
| Negative percentage (new/closed) | new_and_closed_accounts.threshold.percentage less than 0 | Minimum percentage threshold for new and closed account proration must be non-negative | 400 |
| Percentage > 100% (new/closed) | new_and_closed_accounts.threshold.percentage greater than 100 | Minimum percentage threshold for new and closed account proration must be less than or equal to 100% | 400 |
| Negative percentage (existing) | existing_accounts.threshold.percentage greater than 0 | Minimum percentage threshold for flow proration must be non-negative | 400 |
| Percentage > 100% (existing) | existing_accounts.threshold.percentage greater than 100 | Minimum percentage threshold for flow proration must be less than or equal to 100% | 400 |
Mutual Exclusivity & Compatibility
| Rule | Cause | Error Message | Status |
|---|---|---|---|
| Advance adjustment + proration | Both advance_adjustment is present and proration has an active method | Advance adjustment and proration cannot be used together | 400 |
| Proration + valuation method | Active proration with asset_valuation.method set to AVERAGE_MONTHLY or AVERAGE_DAILY | proration is not supported when asset_valuation.method is <METHOD>. Only ON_BILL_DATE supports proration | 40 |
Updated 6 days ago