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
ProducesJSON
PaginationYes
OAuth scopesBILLING_WRITE
📘

Access requirements

Requires 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

AttributeDescription
idstring -- Unique identifier for the billable portfolio Example: "12345"
entity_idinteger or null -- The ID of the entity that is a billable portfolio. Mutually exclusive with group_id. Example: 67890
group_idinteger or null -- The ID of the group that is a billable portfolio. Mutually exclusive with entity_id. Example: 54321
schedule_idinteger -- The ID of the associated fee schedule Example: 111
is_archivedboolean -- Whether the billable portfolio is archived. Only returned on GET requests. Example: false
last_modifiedstring (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

📘

Authentication

All 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 -- Success
  • 403 Forbidden -- Insufficient application permissions or appropriate scope not granted
  • 404 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 -- Success
  • 403 Forbidden -- Insufficient application permissions or appropriate scope not granted
  • 404 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

ParameterDescription
entity_idThe ID of the entity to bill. Mutually exclusive with group_id. Example: 1
group_idThe ID of the group to bill. Mutually exclusive with entity_id. Example: 1
schedule_idThe 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 -- Success
  • 400 Bad Request -- Failed during validation
  • 403 Forbidden -- Insufficient application permissions or appropriate scope not granted
  • 404 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 -- Success
  • 400 Bad Request -- Failed during validation
  • 403 Forbidden -- Insufficient application permissions or appropriate scope not granted
  • 404 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 -- Success
  • 400 Bad Request -- Failed during validation, or request exceeds the 500 portfolio limit
  • 403 Forbidden -- Insufficient application permissions, appropriate scope not granted, or feature flag not enabled
  • 404 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

⚠️

Warning

Archiving 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 -- Success
  • 403 Forbidden -- Insufficient application permissions or appropriate scope not granted
  • 404 Not Found -- Billable portfolio does not exist
  • 409 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

⚠️

Warning

Archiving 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 -- Success
  • 400 Bad Request -- Request exceeds the 500 portfolio limit
  • 403 Forbidden -- Insufficient application permissions, appropriate scope not granted, or feature flag not enabled
  • 404 Not Found -- One or more billable portfolios do not exist
  • 409 Conflict -- One or more billable portfolios are already archived, or type is not billable_portfolios
📘

Related resources


Did this page help you?