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
EndpointsGET
/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
ProducesJSON
PaginationYes
Application permissions requiredGET
"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 scopesGET
BILLING_READ

POST, 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.

AttributeDescriptionExampleRequiredAccepted Values
nameThe fee nameFee nameYesString
descriptionA Description of the feeThis is a feeNoString
fee_typeA way to group similar feesFee typeNoString
asset_valuationSettings that determine how billable assets are calculatedYesJSON Object
asset_valuation.methodThe billable value used to compute the feeAVERAGE_DAILYYesON_BILL_DATE, AVERAGE_MONTHLY, AVERAGE_DAILY
asset_valuation.adjustment_typeChoose whether the fee will include adjusted values or estimated values in the billable valuesNONEYesNONE, ADJUSTED_VALUE, ESTIMATED_RETURNS, ADJUSTED_ESTIMATED_RETURNS
asset_valuation.accrual_typeSelect what, if any, types of accrued income and/or dividends are included in the billable valuesALLYesALL, CASH_AND_DIVIDENDS, CASH_AND_INTEREST, NONE
scaling_for_average_asset_valuationScaling 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_RATEWhen asset_valuation.method is AVERAGE_MONTHLY or AVERAGE_DAILY,AVERAGE_ACROSS_ENTIRE_PERIOD, SCALE_RATE, AVERAGE_ACROSS_HELD_PERIOD
fee_structureDetermines how a fee is computedAUMYesFLAT or AUM
scalingWhen defining fees, the rates and flat fees are both defined annually. These must then be scaled to the size of the billing periodEVENYesEVEN or DAYS_IN_PERIOD
margin_handling_methodChoose how to treat any margin positionsUSE_VALUEYesUSE_VALUE, NET_AS_ZERO, NET_ABSOLUTE, GROSS_ABSOLUTE, GROSS_AS_ZERO

The following fields are only valid when the fee_structure is FLAT.

AttributeDescriptionExampleRequired (When structure is FLAT)Accepted Values
flat_fee_amountThe total annual flat fee amount, will be divided and billed based on the billing interval100YesDouble
flat_fee_apply_toWhat level the fee is applied toDIRECT_OWNERYesBILLABLE_PORTFOLIO, DIRECT_OWNER, HOLDING_ACCOUNT

The following fields are only valid when the fee_structure is AUM.

AttributeDescriptionExampleRequired (When structure is AUM)Accepted Values
rate_calculationDetermines 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
TOPYesTOP, MARGINAL, MARGINAL_WITH_RANKED_ENTITIES
rate_tiersArray of rate tier objectsYesArray of JSON Objects
rate_tiers.rateThe annual rate as a percentage0.1YesDouble, between -1.0 ands 1.0
rate_tiers.lower_boundAmount for the tiers lower bound. At least one tier must have a lower bound of 00YesDouble
rate_tiers.idA read only generated idNo (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.

AttributeDescriptionExampleRequiredAccepted Values
rate_asset_valuationDefines what the fee is to be charged againstNo (Defaults to ASSETS_BILLED_ON, can only be updated with an edit)BILLABLE_ASSETS,
ASSETS_BILLED_ON, RATE_FILTERED_ASSETS
advance_adjustmentAn advance adjustment object used when billing in advance, to adjust for differences between the previous and current billsNo (Mutually Exclusive with proration)JSON Object
advance_adjustment.rate_typeOptions are the same as rate calculation above.TOPYesTOP or MARGINAL
advance_adjustment.accounts_to_evaluateWhich accounts to pickup in the calculationALL_ACCOUNTSYesALL_ACCOUNTS, ONLY_NEW_AND_CLOSED_ACCOUNTS, ONLY_NEW_AND_CLOSED_PORTFOLIOS
prorationProration 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_accountsUsed to configure how the fee is prorated across new and closed accountsNo (One of the proration types must be set if proration is set however)JSON Object
proration.new_and_closed_accounts.methodGROSS excludes fees, NET includes fees as flowsNETYesGROSS, NET, USING_VALUE_ON_START_OR_END_DATE, USING_VALUE_ON_BILL_DATE
proration.new_and_closed_accounts.thresholdProration will only apply if the net cash flow is greater than either of the following. Both will default to 0 if not setNo (defaults both monetary_value and percentage to 0)JSON Object
proration.new_and_closed_accounts.threshold.monetary_valueThe monetary value threshold100.0No (defaults to 0)Double
proration.new_and_closed_accounts.threshold.percentageThe percentage of the total portfolio value threshold10.0No (defaults to 0)Double
proration.new_and_closed_accounts.rate_calculationSame as the rate calculation aboveTOPYesTOP or MARGINAL
proration.new_and_closed_accounts.threshold.percentageThe percentage of the total portfolio value threshold10.0No (defaults to 0)Double
proration.new_and_closed_accounts.rate_calculationSame as the rate calculation aboveTOPYesTOP or MARGINAL
proration.existing_accountsUsed to configure how the fee is prorated across existing accounts based on the flowNo (One of the proration types must be set if proration is set however)JSON Object
proration.existing_accounts.methodGROSS excludes fees, NET includes fees as flowsNETYesGROSS or NET
proration.existing_accounts.thresholdProration will only apply if the net cash flow is greater than either of the following. Both will default to 0 if not setNo (defaults both monetary_value and percentage to 0)JSON Object
proration.existing_accounts.threshold.monetary_valueThe monetary value threshold100.0No (defaults to 0)Double
proration.existing_accounts.threshold.percentageThe percentage of the total portfolio value threshold10.0No (defaults to 0)Double
proration.existing_accounts.rate_calculationSame as the rate calculation aboveTOPYesTOP or MARGINAL

Relationships

RelationshipDescription
fee_schedulesThe 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 includes links.next for the next page and meta.page.total for 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 OK
  • 401 Unauthorized: Missing or invalid authentication
  • 403 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 OK
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 404 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 OK
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 404 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 OK
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 404 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 Created
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 400 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 Errors section

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 OK
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 404 Not Found: The requested fee_schedules was not found
  • 400 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 Errors section

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 OK
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 400 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 Errors section

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 Content
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 404 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 Content
  • 400 Bad Request
    • Indicates an invalid request body, with a reason specified in the error message
  • 401 Unauthorized: Missing or invalid authentication
  • 403 Forbidden: User lacks sufficient application permissions
  • 404 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

RuleCauseError MessageStatus
Bulk create limitPOST with greater than 500 feesRequest payload size cannot exceed 500 items for fees400
Bulk update limitPUT with greater than 500 feesRequest payload size cannot exceed 500 items for fees400
ID mismatchPUT {id} where path ID != body IDThe id field must match the id provided in the url409
Wrong type on bulk deleteBulk DELETE with type != feestype must be fees409

Character Limits

RuleCauseError MessageStatus
name too longname greater than 128 charactersThe following attributes contain too many characters: [name]400
description too longdescription greater than 255 charactersThe following attributes contain too many characters: [description]400
fee_type too longfee_type greater than 200 charactersThe following attributes contain too many characters: [fee_type]400

Required Fields

RuleCauseError MessageStatus
Missing shared fieldsAny of name, fee_structure, scaling, margin_handling_method is nullThe following parameters are missing: [<fields>]400
Missing asset_valuationasset_valuation is nullThe following parameters are missing: [asset_valuation]400
Missing valuation subfieldsasset_valuation.accrual_type, .method, or .adjustment_type is nullThe following parameters are missing: [asset_valuation.<field>]400
Missing scaling_for_averageasset_valuation.method is AVERAGE_MONTHLY or AVERAGE_DAILY and scaling_for_average_asset_valuation is nullThe following parameters are missing: [scaling_for_average_asset_valuation]400
Scaling inapplicableasset_valuation.method is ON_BILL_DATE and scaling_for_average_asset_valuation is setscaling_for_average_asset_valuation is not applicable when asset_valuation.method is ON_BILL_DATE400

Note: Missing shared fields, asset_valuation, valuation subfields, and scaling_for_average_asset_valuation are 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

RuleCauseError MessageStatus
rate_asset_valuation on createrate_asset_valuation provided on POSTThe following attribute(s) cannot be included in a POST: [rate_asset_valuation]400

Relationships

RuleCauseError MessageStatus
Fee schedule on feefee_schedules relationship data is setFee schedule relationships cannot be set on fees. Use the fee schedule relationship endpoints to manage fee assignments.400

Delete

RuleCauseError MessageStatus
Not foundFee ID doesn't existThe requested fee was not found for <id>404
Cannot deleteFee is in useCan't delete <id>. <details>400

Bulk Error Wrapping

RuleCauseError MessageStatus
Validation failure in bulkAny validation fails in a multi-fee requestFailed 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

RuleCauseError MessageStatus
Missing flat fee fieldsflat_fee_amount or flat_fee_apply_to is nullThe 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

RuleCauseError MessageStatus
AUM fields on FLATAny of rate_calculation, rate_tiers, proration, advance_adjustment, rate_asset_valuation is setThe following fields are not applicable for FLAT fee structure: [<fields>]400

AUM Fees (all rate calculations)

Required Fields

RuleCauseError MessageStatus
Missing AUM fieldsrate_calculation or rate_tiers is nullThe 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

RuleCauseError MessageStatus
FLAT fields on AUMflat_fee_amount or flat_fee_apply_to is setThe 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

RuleCauseError MessageStatus
Empty listrate_tiers is []rate_tiers must contain at least one rate tier400
Null tierA tier entry is nullrate_tiers[<i>] must not be null400
Missing tier fieldsTier missing rate or lower_boundThe following parameters are missing: [rate_tiers[<i>].rate, rate_tiers[<i>].lower_bound]400
Rate out of rangerate less than -1.0 or greater than 1.0rate_tiers[<i>]: Rates must be between -1.0 and 1.0!400
Duplicate lower boundsTwo tiers share the same lower_bound valuerate_tiers[<i>]: Invalid bounds: $<x> - $<x>400
Single tier lower != 0Sole tier has lower_bound != 0rate_tiers: Lower Bound of sole tier must be 0400
First tier lower != 0First tier (of multiple) has lower_bound != 0rate_tiers: First tier must have a lower bound of 0400

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

RuleCauseError MessageStatus
Restricted fieldsAny of flat_fee_amount, flat_fee_apply_to, advance_adjustment, proration, rate_asset_valuation is setThe 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

RuleCauseError MessageStatus
Missing advance adjustment fieldsadvance_adjustment present but accounts_to_evaluate or rate_type is nullThe 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

RuleCauseError MessageStatus
No sub-objectsproration present but both new_and_closed_accounts and existing_accounts are nullThe following parameters are missing: [proration.new_and_closed_accounts, proration.existing_accounts]400
Missing new/closed fieldsnew_and_closed_accounts present but method or rate_calculation is nullThe following parameters are missing: [proration.new_and_closed_accounts.method, proration.new_and_closed_accounts.rate_calculation]400
Missing existing fieldsexisting_accounts present but method or rate_calculation is nullThe following parameters are missing: [proration.existing_accounts.method, proration.existing_accounts.rate_calculation]400

Note: Missing fields from both new_and_closed_accounts and existing_accounts are collected into a single error message.

Proration Thresholds

RuleCauseError MessageStatus
Negative monetary_value (new/closed)new_and_closed_accounts.threshold.monetary_value less than 0Minimum threshold for new and closed account proration must be non-negative400
Negative monetary_value (existing)existing_accounts.threshold.monetary_value less that 0Minimum threshold for flow proration must be non-negative400
Negative percentage (new/closed)new_and_closed_accounts.threshold.percentage less than 0Minimum percentage threshold for new and closed account proration must be non-negative400
Percentage > 100% (new/closed)new_and_closed_accounts.threshold.percentage greater than 100Minimum 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 0Minimum percentage threshold for flow proration must be non-negative400
Percentage > 100% (existing)existing_accounts.threshold.percentage greater than 100Minimum percentage threshold for flow proration must be less than or equal to 100%400

Mutual Exclusivity & Compatibility

RuleCauseError MessageStatus
Advance adjustment + prorationBoth advance_adjustment is present and proration has an active methodAdvance adjustment and proration cannot be used together400
Proration + valuation methodActive proration with asset_valuation.method set to AVERAGE_MONTHLY or AVERAGE_DAILYproration is not supported when asset_valuation.method is <METHOD>. Only ON_BILL_DATE supports proration40