Core API – Sites & Product Catalog, SaaS subscriptions, and query-contract alignment
Summary
This release expands the Core API with two new read-only resources — Sites and Product Catalog — and enriches several existing resources with new response fields and query capabilities, most notably SaaS subscription detail on SaaS Assets and SaaS Users. Cursor pagination, record-lineage filtering, and richer sorting are now available more consistently across the API.
The API major version remains v1, and the release is overwhelmingly additive and backward compatible. There are, however, a small number of contract changes to review two removals (the SaaS Asset pool.active response field and a Vendors filter) and a narrower response content type. See Changed below.
Changes
New endpoints
Sites
-
GET
/core/v1/sites- N/A → Available
- Type: addition
- Notes: Returns a cursor-paginated list of client sites (physical/logical locations materialized from location and site data across connected integrations). Supports
page_size(1–200) andcursor, andeq/infiltering onid,client.id, and therecord_lineage.*fields.
-
GET
/core/v1/sites/{id}- N/A → Available
- Type: addition
- Notes: Retrieves a single site by its id. A site exposes
name, a nestedclient(id,name), anaddress(street lines, city,state_prov_*,country_code/country_name, andpostal_code), andrecord_lineage.
Product Catalog
-
GET
/core/v1/product-catalog- N/A → Available
- Type: addition
- Notes: Returns a cursor-paginated list of product catalog records exported from PSA integrations. Supports
page_size(1–200),cursor,sort, and 18 optionalfilter[...]parameters (includingrecord_lineage.*).
-
GET
/core/v1/product-catalog/{id}- N/A → Available
- Type: addition
- Notes: Retrieves a single product catalog record by its id. A record exposes source identifiers (
source_system,source_product_id,source_product_identifier), classification (name,description,category,subcategory,product_type,product_class,manufacturer_name), pricing (unit_cost,unit_price),is_active, timestamps, andrecord_lineage.
Added
New response fields
-
descriptionon Contract- N/A → Returned
- Type: addition
- Notes: New optional, nullable string on the Contract response, returned by
GET/core/v1/service/contractsandGET/core/v1/service/contracts/{id}.
-
emailonreports_to_member(Member)- N/A → Returned
- Type: addition
- Notes: The
reports_to_memberobject on the Member response gains an optional, nullableemail, returned byGET/core/v1/membersandGET/core/v1/members/{id}.
-
source,is_child_ticket,is_long_ticketon Ticket- N/A → Returned
- Type: addition
- Notes: Ticket responses now include
source(the channel used to create the ticket in the source PSA, e.g. "Email Connector"),is_child_ticket(whether the ticket is a child of another), andis_long_ticket(whether a resolved ticket exceeded the account/category baseline resolution time by more than one standard deviation).is_child_ticketandis_long_ticketare also newly filterable and sortable.
-
tenant_domainandsubscriptionson SaaS Asset- N/A → Returned
- Type: addition
- Notes: SaaS Asset responses gain a nullable
tenant_domain(also filterable and sortable) and a nullablesubscriptionsarray. Each subscription exposesid,commerce_subscription_id,status,type,license_count,billing_cycle_name,friendly_name, aterm(starts_at,ends_at,is_auto_renewed),provider_name,partner_tier, andcsp_tier.
-
subscriptionon SaaS User- N/A → Returned
- Type: addition
- Notes: SaaS User responses gain a nullable
subscriptionobject carrying the selected Microsoft subscription details for the user's SKU row, returned byGET/core/v1/assets/saas-usersandGET/core/v1/assets/saas-users/{id}.
New query capabilities
-
filter[record_lineage.*]on the list endpoints- N/A → Available
- Type: addition
- Notes: New optional
eq/infilters overrecord_lineage.source_record_id,record_lineage.integration_configuration.id,record_lineage.integration_configuration.vendor.id, andrecord_lineage.integration_configuration.vendor.brand_nameon Clients, Contacts, Contracts, Hardware Assets, Members, Opportunities, SaaS Assets, SaaS Users, and Tickets. Existing calls are unaffected.
-
New SaaS and Contract filters
- N/A → Available
- Type: addition
- Notes:
GET/core/v1/assets/saasadds 13filter[subscriptions.*]parameters;GET/core/v1/assets/saas-usersaddsfilter[subscription.*]parameters;GET/core/v1/service/contractsadds 8 filters over pricing and record-lineage fields (e.g.filter[contract_pricings.pricing_type],filter[contract_pricings.items.product.name]); andGET/core/v1/membersadds a request-bodyreports_to_member.emailfilter.
Changed
-
pool.activeremoved from SaaS Asset- Returned → Removed
- Type: breaking change
- Notes: The
pool.activefield (active license count) has been removed from the SaaS Asset response, and is no longer accepted asfilter[pool.active]or as asortfield. Consumers reading, filtering, or sorting on it must update. Remainingpoolfields:type,capacity,utilized,suspended,grace_period_warning.
-
filter[data_types_supported]removed from Vendors- Available → Removed
- Type: breaking change
- Notes:
GET/core/v1/integrations/vendorsno longer acceptsfilter[data_types_supported]; vendors can no longer be narrowed by supported data type server-side. Thedata_types_supportedfield itself is still returned in the response body. Remaining filters:filter[name],filter[vendor_id],filter[category].
-
Response content type narrowed to
application/jsonapplication/json,text/json,text/plain→application/json- Type: change
- Notes: All endpoints now advertise only
application/jsonon success and error responses; the redundanttext/jsonandtext/plainrepresentations (identical JSON) were removed. Consumers usingapplication/jsonare unaffected; a client explicitly negotiatingtext/jsonortext/plainviaAcceptcould now receive406.
-
New enum values on Contract
- Added values
- Type: change
- Notes:
term.billing_periodmay now returnOTHER, andcontract_pricings[].recurrent_charge_frequencymay now returnWEEKLYandOTHER. Consumers with a closed-enum mapping should handle these values.
-
Contract amount semantics clarified
- Documentation
- Type: change
- Notes: For ConnectWise,
total_priceis now the Bill Amount plus any Additions (previously Bill Amount only), so returned amounts may increase.contract_pricingsis now documented to list only active pricing line items (inactive/expired excluded), andpricing_item_total_pricenow sums active/billable items.
-
List responses and error bodies document guaranteed fields
- Optional → Always present
- Type: improvement
- Notes: The cursor-pagination envelope now declares
data,total_count, andnext_cursoras always present (next_cursorremains nullable — present, butnullon the last page), and the error bodies now declare theircode/errorsfields as always present. Strict response validators can rely on these keys being returned.
Dates
- Effective: [2026-07-21]
