Added

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) and cursor, and eq/in filtering on id, client.id, and the record_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 nested client (id, name), an address (street lines, city, state_prov_*, country_code/country_name, and postal_code), and record_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 optional filter[...] parameters (including record_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, and record_lineage.

Added

New response fields

  • description on Contract

    • N/A → Returned
    • Type: addition
    • Notes: New optional, nullable string on the Contract response, returned by GET /core/v1/service/contracts and GET /core/v1/service/contracts/{id}.
  • email on reports_to_member (Member)

    • N/A → Returned
    • Type: addition
    • Notes: The reports_to_member object on the Member response gains an optional, nullable email, returned by GET /core/v1/members and GET /core/v1/members/{id}.
  • source, is_child_ticket, is_long_ticket on 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), and is_long_ticket (whether a resolved ticket exceeded the account/category baseline resolution time by more than one standard deviation). is_child_ticket and is_long_ticket are also newly filterable and sortable.
  • tenant_domain and subscriptions on SaaS Asset

    • N/A → Returned
    • Type: addition
    • Notes: SaaS Asset responses gain a nullable tenant_domain (also filterable and sortable) and a nullable subscriptions array. Each subscription exposes id, commerce_subscription_id, status, type, license_count, billing_cycle_name, friendly_name, a term (starts_at, ends_at, is_auto_renewed), provider_name, partner_tier, and csp_tier.
  • subscription on SaaS User

    • N/A → Returned
    • Type: addition
    • Notes: SaaS User responses gain a nullable subscription object carrying the selected Microsoft subscription details for the user's SKU row, returned by GET /core/v1/assets/saas-users and GET /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/in filters over record_lineage.source_record_id, record_lineage.integration_configuration.id, record_lineage.integration_configuration.vendor.id, and record_lineage.integration_configuration.vendor.brand_name on 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/saas adds 13 filter[subscriptions.*] parameters; GET /core/v1/assets/saas-users adds filter[subscription.*] parameters; GET /core/v1/service/contracts adds 8 filters over pricing and record-lineage fields (e.g. filter[contract_pricings.pricing_type], filter[contract_pricings.items.product.name]); and GET /core/v1/members adds a request-body reports_to_member.email filter.

Changed

  • pool.active removed from SaaS Asset

    • Returned → Removed
    • Type: breaking change
    • Notes: The pool.active field (active license count) has been removed from the SaaS Asset response, and is no longer accepted as filter[pool.active] or as a sort field. Consumers reading, filtering, or sorting on it must update. Remaining pool fields: type, capacity, utilized, suspended, grace_period_warning.
  • filter[data_types_supported] removed from Vendors

    • Available → Removed
    • Type: breaking change
    • Notes: GET /core/v1/integrations/vendors no longer accepts filter[data_types_supported]; vendors can no longer be narrowed by supported data type server-side. The data_types_supported field itself is still returned in the response body. Remaining filters: filter[name], filter[vendor_id], filter[category].
  • Response content type narrowed to application/json

    • application/json, text/json, text/plainapplication/json
    • Type: change
    • Notes: All endpoints now advertise only application/json on success and error responses; the redundant text/json and text/plain representations (identical JSON) were removed. Consumers using application/json are unaffected; a client explicitly negotiating text/json or text/plain via Accept could now receive 406.
  • New enum values on Contract

    • Added values
    • Type: change
    • Notes: term.billing_period may now return OTHER, and contract_pricings[].recurrent_charge_frequency may now return WEEKLY and OTHER. Consumers with a closed-enum mapping should handle these values.
  • Contract amount semantics clarified

    • Documentation
    • Type: change
    • Notes: For ConnectWise, total_price is now the Bill Amount plus any Additions (previously Bill Amount only), so returned amounts may increase. contract_pricings is now documented to list only active pricing line items (inactive/expired excluded), and pricing_item_total_price now 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, and next_cursor as always present (next_cursor remains nullable — present, but null on the last page), and the error bodies now declare their code/errors fields as always present. Strict response validators can rely on these keys being returned.

Dates

  • Effective: [2026-07-21]