Billable Portfolios
Use the Billable Portfolios API to view, create, update, and archive portfolios associated with fee schedules. A billable portfolio can represent a household, client, legal entity, or group.
Overview
| Base route | /v1/billable_portfolios |
| Produces | JSON |
| Pagination | Yes |
| OAuth scopes | BILLING_WRITE |
Access requirementsRequires one of the following application permissions:
- "Run and manage bills, include fee adjustment and payment tracking"
- "Full access to Billing and billing data"
Resource attributes
| Attribute | Description |
|---|---|
id | string -- Unique identifier for the billable portfolio Example: "12345" |
entity_id | integer or null -- The ID of the entity that is a billable portfolio. Mutually exclusive with group_id. Example: 67890 |
group_id | integer or null -- The ID of the group that is a billable portfolio. Mutually exclusive with entity_id. Example: 54321 |
schedule_id | integer -- The ID of the associated fee schedule Example: 111 |
is_archived | boolean -- Whether the billable portfolio is archived. Only returned on GET requests. Example: false |
last_modified | string (ISO 8601) -- The time the portfolio was last modified. Only returned on GET requests. Example: "2026-05-10T14:30:00Z" |
Get a billable portfolio
Retrieve a single billable portfolio by its ID.
GET /v1/billable_portfolios/:id
AuthenticationAll requests require a base64-encoded API key pair:
Authorization: Basic {base64(key_id:key_secret)}See Access & Authentication for setup.
curl -X GET "https://{firm}.addepar.com/api/v1/billable_portfolios/12345" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json"{
"data": {
"type": "billable_portfolios",
"id": "12345",
"attributes": {
"entity_id": 67890,
"group_id": null,
"schedule_id": 111,
"is_archived": false,
"last_modified": "2026-05-10T14:30:00Z"
}
},
"links": {
"self": "/v1/billable_portfolios/12345"
}
}{
"errors": [
{
"status": "404",
"title": "Not Found",
"detail": "Billable portfolio with id 12345 does not exist."
}
]
}Response codes:
200 OK-- Success403 Forbidden-- Insufficient application permissions or appropriate scope not granted404 Not Found-- Billable portfolio does not exist
Get all billable portfolios
Retrieve all billable portfolio setups. Results are paginated.
GET /v1/billable_portfolios
curl -X GET "https://{firm}.addepar.com/api/v1/billable_portfolios" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json"{
"data": [
{
"type": "billable_portfolios",
"id": "12345",
"attributes": {
"entity_id": 67890,
"group_id": null,
"schedule_id": 111,
"is_archived": false,
"last_modified": "2026-03-15T10:30:00Z"
}
},
{
"type": "billable_portfolios",
"id": "12346",
"attributes": {
"entity_id": null,
"group_id": 54321,
"schedule_id": 222,
"is_archived": false,
"last_modified": "2026-04-20T16:45:00Z"
}
}
],
"meta": {
"page": {
"total_count": 2,
"next_cursor": null,
"limit": 500
}
},
"links": {
"self": "/v1/billable_portfolios"
}
}{
"errors": [
{
"status": "403",
"title": "Forbidden",
"detail": "Insufficient application permissions or appropriate scope not granted."
}
]
}Response codes:
200 OK-- Success403 Forbidden-- Insufficient application permissions or appropriate scope not granted404 Not Found-- Billable portfolio does not exist
Create a billable portfolio
Set up a group or entity for billing with a specified fee schedule. Supports single and bulk creation.
POST /v1/billable_portfolios
| Parameter | Description |
|---|---|
entity_id | The ID of the entity to bill. Mutually exclusive with group_id. Example: 1 |
group_id | The ID of the group to bill. Mutually exclusive with entity_id. Example: 1 |
schedule_id | The ID of the fee schedule to associate Example: 2 |
curl -X POST "https://{firm}.addepar.com/api/v1/billable_portfolios" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"type": "create_billable_portfolio",
"attributes": {
"group_id": 1,
"schedule_id": 2
}
}
}'{
"data": {
"type": "billable_portfolios",
"id": "1001",
"attributes": {
"group_id": 1,
"schedule_id": 2,
"is_archived": false,
"last_modified": "2026-03-15T10:00:00Z"
}
},
"links": {
"self": "/v1/billable_portfolios/1001"
}
}{
"errors": [
{
"status": "400",
"title": "Bad Request",
"detail": "Validation failed: entity_id and group_id cannot both be specified."
}
]
}To create multiple billable portfolios in a single request, pass an array in data:
curl -X POST "https://{firm}.addepar.com/api/v1/billable_portfolios" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": [
{
"type": "create_billable_portfolio",
"attributes": {
"entity_id": 1,
"schedule_id": 2
}
},
{
"type": "create_billable_portfolio",
"attributes": {
"group_id": 1,
"schedule_id": 2
}
}
]
}'{
"data": [
{
"type": "billable_portfolios",
"id": "1001",
"attributes": {
"entity_id": 1,
"schedule_id": 2,
"is_archived": false,
"last_modified": "2026-03-15T10:00:00Z"
}
},
{
"type": "billable_portfolios",
"id": "1002",
"attributes": {
"group_id": 1,
"schedule_id": 2,
"is_archived": false,
"last_modified": "2026-03-15T10:00:01Z"
}
}
],
"links": {
"self": "/v1/billable_portfolios"
}
}Response codes:
201 Created-- Success400 Bad Request-- Failed during validation403 Forbidden-- Insufficient application permissions or appropriate scope not granted404 Not Found-- Referenced entity, group, or fee schedule does not exist
Edit a billable portfolio fee schedule
Update a billable portfolio's fee schedule. You can also restore an archived billable portfolio by assigning a new fee schedule.
PATCH /v1/billable_portfolios/:id/relationships/fee_schedules
curl -X PATCH "https://{firm}.addepar.com/api/v1/billable_portfolios/2/relationships/fee_schedules" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": {
"id": 3,
"type": "fee_schedules"
}
}'{
"links": {
"self": "/v1/billable_portfolios/2/relationships/fee_schedules"
}
}{
"errors": [
{
"status": "404",
"title": "Not Found",
"detail": "Fee schedule with id 3 does not exist."
}
]
}Response codes:
200 OK-- Success400 Bad Request-- Failed during validation403 Forbidden-- Insufficient application permissions or appropriate scope not granted404 Not Found-- Billable portfolio or fee schedule does not exist
Edit fee schedules in bulk
Update multiple billable portfolios' fee schedules. You can also restore archived billable portfolios by assigning new fee schedules. Limited to 500 portfolios per request.
PATCH /v1/billable_portfolios/relationships/fee_schedules
curl -X PATCH "https://{firm}.addepar.com/api/v1/billable_portfolios/relationships/fee_schedules" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": [
{
"id": "2",
"type": "create_billable_portfolio",
"attributes": {
"schedule_id": 3
}
},
{
"id": "5",
"type": "create_billable_portfolio",
"attributes": {
"schedule_id": 7
}
}
]
}'{
"links": {
"self": "/v1/billable_portfolios/relationships/fee_schedules"
}
}{
"errors": [
{
"status": "400",
"title": "Bad Request",
"detail": "Request exceeds the 500 portfolio limit."
}
]
}Response codes:
200 OK-- Success400 Bad Request-- Failed during validation, or request exceeds the 500 portfolio limit403 Forbidden-- Insufficient application permissions, appropriate scope not granted, or feature flag not enabled404 Not Found-- One or more billable portfolios or fee schedules do not exist
Delete a billable portfolio
Archive a billable portfolio when you no longer want to bill on it. Previous bills remain unchanged.
DELETE /v1/billable_portfolios/:id/relationships/fee_schedules
WarningArchiving a billable portfolio removes it from active billing. This action can be reversed by assigning a new fee schedule via the PATCH endpoint.
curl -X DELETE "https://{firm}.addepar.com/api/v1/billable_portfolios/2/relationships/fee_schedules" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json"{
"links": {
"self": "/v1/billable_portfolios/2/relationships/fee_schedules"
}
}{
"errors": [
{
"status": "409",
"title": "Conflict",
"detail": "Billable portfolio with id 2 is already archived."
}
]
}Response codes:
200 OK-- Success403 Forbidden-- Insufficient application permissions or appropriate scope not granted404 Not Found-- Billable portfolio does not exist409 Conflict-- Billable portfolio is already archived
Delete billable portfolios in bulk
Archive multiple billable portfolios when you no longer want to bill on them. Previous bills remain unchanged. Limited to 500 portfolios per request.
DELETE /v1/billable_portfolios/relationships/fee_schedules
WarningArchiving billable portfolios removes them from active billing. This action can be reversed by assigning new fee schedules via the bulk PATCH endpoint.
curl -X DELETE "https://{firm}.addepar.com/api/v1/billable_portfolios/relationships/fee_schedules" \
-H "Authorization: Basic {base64(key_id:key_secret)}" \
-H "Accept: application/vnd.api+json" \
-H "Content-Type: application/vnd.api+json" \
-d '{
"data": [
{
"id": "2",
"type": "billable_portfolios"
},
{
"id": "5",
"type": "billable_portfolios"
}
]
}'{
"links": {
"self": "/v1/billable_portfolios/relationships/fee_schedules"
}
}{
"errors": [
{
"status": "409",
"title": "Conflict",
"detail": "Billable portfolio with id 5 is already archived."
}
]
}Response codes:
200 OK-- Success400 Bad Request-- Request exceeds the 500 portfolio limit403 Forbidden-- Insufficient application permissions, appropriate scope not granted, or feature flag not enabled404 Not Found-- One or more billable portfolios do not exist409 Conflict-- One or more billable portfolios are already archived, or type is notbillable_portfolios
Related resources
Updated 12 days ago