Fee Schedules
A fee schedule defines billing timing, interval, and period for a set of fees. Every fee schedule must be associated with at least one fee. Use this API to create, retrieve, edit, and delete fee schedules, and manage their fee relationships.
Overview
| Base route | /v1/fee_schedules |
| Produces | JSON |
| Pagination | Yes |
| Bulk operations | Create, edit, delete (array body) |
| OAuth scopes | GET BILLING_READ; POST, PUT, DELETE BILLING_WRITE |
Access requirements
GET requires "View-only access to Billing" permission.
POST, PUT, and DELETE require "Run and manage bills, include fee adjustment and payment tracking" or "Full access to Billing and billing data" permission.
Resource attributes
| Attribute | Type | Description |
|---|---|---|
name | String | Required. The fee schedule name. Must be unique. |
description | String | Optional description. |
currency | String | Required. A valid currency code (e.g., "USD", "EUR", "GBP"). |
interval | String | Required. Billing frequency. Values: MONTHLY, QUARTERLY, SEMIANNUALLY, ANNUALLY. |
billing_period_cycle_start_month | Integer | Required. Cycle start month offset. Valid range depends on interval: MONTHLY allows 1; QUARTERLY allows 1-3; SEMIANNUALLY allows 1-6; ANNUALLY allows 1-12. |
timing | String | Required. When billing occurs. Values: IN_ARREARS, IN_ADVANCE. |
minimum_fee | Number | Optional. Must be positive and less than maximum_fee. Max: 1000000000000000. |
maximum_fee | Number | Optional. Must be positive. Max: 1000000000000000. |
rounding | String | Required. Rounding strategy. Values: NONE, USE_FIRM_DEFAULT, HALF_EVEN (Banker's rounding). |
min_max_fee_proration_enabled | String | Optional boolean value indicating if minimum and maximum fee should be prorated for closing and opening portfolios. Defaulted to False. It requires at least once of minimum_feeand maximum_feeto be set. |
last_modified | String | Read-only. ISO 8601 timestamp. |
Relationships
| Relationship | Description |
|---|---|
fees | Required. At least one fee must be associated with a fee schedule. |
Get all fee schedules
Returns all fee schedules. Results are paginated with page[limit] (max 500) and page[cursor].
Append ?include=fees to include associated fee objects in the response.
GET /v1/fee_schedules
curl -X GET "https://{firm}.addepar.com/api/v1/fee_schedules" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Accept: application/vnd.api+json"
{
"meta": {
"page": {
"total": 10,
"offset": 0,
"limit": 500,
"cursor": null
}
},
"data": [
{
"id": "6",
"type": "fee_schedules",
"attributes": {
"billing_period_cycle_start_month": 1,
"timing": "IN_ARREARS",
"name": "Monthly AUM Schedule",
"minimum_fee": 100.0,
"maximum_fee": 100.0,
"rounding": "USE_FIRM_DEFAULT",
"currency": "USD",
"interval": "MONTHLY",
"min_max_fee_proration_enabled": "false",
"last_modified": "2023-12-28T22:42:00Z"
},
"relationships": {
"fees": {
"data": [
{ "type": "fees", "id": "3" }
]
}
},
"links": { "self": "/v1/fee_schedules/6" }
}
],
"included": [],
"links": {
"prev": null,
"next": null
}
}
Response codes:
200 OK-- Success401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions
Get a fee schedule
Returns a single fee schedule by ID. Append ?include=fees to include fee objects.
GET /v1/fee_schedules/:id
curl -X GET "https://{firm}.addepar.com/api/v1/fee_schedules/1" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Accept: application/vnd.api+json"
{
"data": {
"id": "1",
"type": "fee_schedules",
"attributes": {
"billing_period_cycle_start_month": 1,
"timing": "IN_ADVANCE",
"name": "Quarterly Advisory",
"minimum_fee": 500.0,
"description": "Standard quarterly schedule",
"maximum_fee": 10000.0,
"rounding": "NONE",
"currency": "USD",
"interval": "QUARTERLY",
"min_max_fee_proration_enabled": "false",
"last_modified": "2026-04-06T12:37:40Z"
},
"relationships": {
"fees": {
"data": [
{ "type": "fees", "id": "2" },
{ "type": "fees", "id": "3" }
]
}
},
"links": { "self": "/v1/fee_schedules/1" }
},
"included": []
}
Response codes:
200 OK-- Success401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule not found
Get fee relationships
Returns the fee IDs associated with a fee schedule.
GET /v1/fee_schedules/:id/relationships/fees
curl -X GET "https://{firm}.addepar.com/api/v1/fee_schedules/1/relationships/fees" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Accept: application/vnd.api+json"
{
"data": [
{ "id": "2", "type": "fees" },
{ "id": "3", "type": "fees" }
]
}
Response codes:
200 OK-- Success401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule not found
Get fees by fee schedule
Returns full fee objects associated with a fee schedule.
GET /v1/fee_schedules/:id/fees
curl -X GET "https://{firm}.addepar.com/api/v1/fee_schedules/1/fees" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Accept: application/vnd.api+json"
HTTP/1.1 200
{
"data": [
{
"id": "1",
"type": "fees",
"attributes": {
"scaling": "DAYS_IN_PERIOD",
"rate_tiers": [
{
"id": 1,
"rate": 0.015,
"lower_bound": 0
}
],
"margin_handling_method": "USE_VALUE",
"rate_calculation": "MARGINAL",
"name": "Fee name",
"description": "Fee description",
"asset_valuation": {
"method": "AVERAGE_DAILY",
"adjustment_type": "ADJUSTED_VALUE",
"accrual_type": "NONE"
},
"fee_structure": "AUM",
"scaling_for_average_asset_valuation": "AVERAGE_ACROSS_ENTIRE_PERIOD",
"advance_adjustment": {
"rate_type": "TOP",
"accounts_to_evaluate": "ALL_ACCOUNTS"
},
"proration": {
"new_and_closed_accounts": {
"method": "NET",
"threshold": {
"monetary_value": 0,
"percentage": 0
},
"rate_calculation": "TOP_WITH_MARGINAL_ON_OPEN_CLOSE"
},
"existing_accounts": {
"method": "NET",
"threshold": {
"monetary_value": 0,
"percentage": 0
},
"rate_calculation": "TOP"
}
},
"rate_asset_valuation": "ASSETS_BILLED_ON"
},
"relationships": {
"fee_schedules": {
"links": {
"self": "/v1/fees/1/relationships/fee_schedules",
"related": "/v1/fees/1/fee_schedules"
},
"data": [
{
"type": "fee_schedules",
"id": "1"
},
{
"type": "fee_schedules",
"id": "5"
},
{
"type": "fee_schedules",
"id": "8"
},
{
"type": "fee_schedules",
"id": "9"
},
{
"type": "fee_schedules",
"id": "10"
}
]
}
},
"links": {
"self": "/v1/fees/1"
}
}
],
"included": [],
"links": {
"prev": null,
"next": null
}
}
Response codes:
200 OK-- Success401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule not found
Create fee schedules
Creates one or more fee schedules. Pass a single object or an array for bulk creation. If any validation fails, none are created.
All required attributes must be provided: name, currency, interval, billing_period_cycle_start_month, timing, rounding, and at least one fee relationship.
POST /v1/fee_schedules
curl -X POST "https://{firm}.addepar.com/api/v1/fee_schedules" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Content-Type: application/vnd.api+json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": [
{
"type": "fee_schedules",
"attributes": {
"name": "Quarterly Fee Schedule",
"description": "Standard quarterly billing",
"currency": "USD",
"interval": "QUARTERLY",
"billing_period_cycle_start_month": 1,
"timing": "IN_ADVANCE",
"minimum_fee": 500.00,
"maximum_fee": 10000.00,
"rounding": "NONE"
},
"relationships": {
"fees": {
"data": [
{ "type": "fees", "id": "1" }
]
}
}
}
]
}'
{
"data": [
{
"id": "10",
"type": "fee_schedules",
"links": { "self": "/v1/fee_schedules/10" }
}
]
}
Response codes:
201 Created-- Success400 Bad Request-- Missing required fields, invalid values, or validation error401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions409 Conflict-- Duplicate name or type mismatch
Add fee associations
Appends fees to a fee schedule's existing fee list.
POST /v1/fee_schedules/:id/relationships/fees
curl -X POST "https://{firm}.addepar.com/api/v1/fee_schedules/1/relationships/fees" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Content-Type: application/vnd.api+json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": [
{ "type": "fees", "id": "2" },
{ "type": "fees", "id": "3" }
]
}'
{
"data": [
{ "id": "1", "type": "fees" },
{ "id": "2", "type": "fees" },
{ "id": "3", "type": "fees" }
]
}
Response codes:
201 Created-- Success400 Bad Request-- Invalid payload401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule or fee not found
Edit fee schedules
Replaces a fee schedule entirely. The request body must include all required attributes and fee relationships. This API uses PUT (full replacement), not PATCH.
PUT /v1/fee_schedules/:id (single) or PUT /v1/fee_schedules (bulk, array body)
For bulk edits, if any validation fails, none are updated.
curl -X PUT "https://{firm}.addepar.com/api/v1/fee_schedules/1" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Content-Type: application/vnd.api+json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": {
"type": "fee_schedules",
"id": "1",
"attributes": {
"name": "Updated Fee Schedule",
"description": "Updated description",
"currency": "USD",
"interval": "MONTHLY",
"billing_period_cycle_start_month": 1,
"timing": "IN_ARREARS",
"minimum_fee": 1000.00,
"maximum_fee": 20000.00,
"min_max_fee_proration_enabled": "true",
"rounding": "HALF_EVEN"
},
"relationships": {
"fees": {
"data": [
{ "type": "fees", "id": "1" }
]
}
}
}
}'
{
"data": [
{
"id": "1",
"type": "fee_schedules",
"links": { "self": "/v1/fee_schedules/1" }
}
]
}
Response codes:
200 OK-- Success400 Bad Request-- Missing required fields, invalid values, or validation error401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule not found409 Conflict-- ID mismatch between URL and body, or duplicate name
Replace fee associations
Replaces all fees associated with a fee schedule.
PUT /v1/fee_schedules/:id/relationships/fees
curl -X PUT "https://{firm}.addepar.com/api/v1/fee_schedules/1/relationships/fees" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Content-Type: application/vnd.api+json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": [
{ "type": "fees", "id": "2" },
{ "type": "fees", "id": "3" }
]
}'
{
"data": [
{ "id": "2", "type": "fees" },
{ "id": "3", "type": "fees" }
]
}
Response codes:
200 OK-- Success400 Bad Request-- Invalid payload401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule or fee not found
Delete fee schedules
Deletes one or more fee schedules. For bulk deletion, pass an array body. If any deletion fails, none are deleted.
DELETE /v1/fee_schedules/:id (single) or DELETE /v1/fee_schedules (bulk)
curl -X DELETE "https://{firm}.addepar.com/api/v1/fee_schedules/1" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Accept: application/vnd.api+json"
curl -X DELETE "https://{firm}.addepar.com/api/v1/fee_schedules" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Content-Type: application/vnd.api+json" \
-H "Accept: application/vnd.api+json" \
-d '{
"data": [
{ "type": "fee_schedules", "id": "11" },
{ "type": "fee_schedules", "id": "12" }
]
}'
Response: 204 No Content on success.
Response codes:
204 No Content-- Success400 Bad Request-- Invalid payload401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule not found
Remove fee associations
Removes all fee associations from a fee schedule.
DELETE /v1/fee_schedules/:id/relationships/fees
curl -X DELETE "https://{firm}.addepar.com/api/v1/fee_schedules/1/relationships/fees" \
-H "Authorization: Basic {credentials}" \
-H "Addepar-Firm: 1" \
-H "Accept: application/vnd.api+json"
Response: 204 No Content on success.
Response codes:
204 No Content-- Success401 Unauthorized-- Missing or invalid authentication403 Forbidden-- Insufficient permissions404 Not Found-- Fee schedule or fee not found
Validation errors
409 Conflict
| Error | Cause |
|---|---|
IDs do not match. | The fee schedule ID in the URL and request body are different (PUT only). |
Schedule name already exists: {name} | A fee schedule with this name already exists. |
All types in a given relationship should be identical | Mixed types in an array body. |
type must be fees | Wrong type used in a fee relationship endpoint. |
type must be fee_schedules | Wrong type used in a fee schedule endpoint. |
400 Bad Request
| Error | Cause |
|---|---|
POST requires the following attribute(s): [...] | Missing required field(s). Also applies to PUT. |
The following keys do not link to valid attribute(s): [...] | Unknown attributes in the request body. |
Missing data field | Request body has no data field. |
The following attribute(s) contain invalid values: [...] | Invalid value type or format. |
Minimum fee cannot exceed maximum fee | minimum_fee is greater than maximum_fee. |
Minimum fee must be greater than 0 | minimum_fee is zero or negative. |
Maximum fee must be greater than 0 | maximum_fee is zero or negative. |
Maximum fee must be less than 1000000000000000 | Fee exceeds the max limit. Also applies to minimum_fee. |
Cycle Start Month is invalid for this interval: {value} | billing_period_cycle_start_month is out of range for the interval. |
Related
- Fees -- The fees associated with fee schedules
- Billable Portfolios -- Portfolios that fee schedules are applied to
- Pagination -- Paginate through fee schedule lists
- Access & Authentication -- API key setup
Updated about 14 hours ago