Added

Lifecycle Manager API – Hardware Assets, Budget Forecasting, Contacts, PSA Linking, Roadmap Exports & Strategic Planning Expansion


Summary

This release substantially expands the Lifecycle Manager API, adding 52 new endpoints and 139 new schemas across several new areas: Hardware Assets (listing, dashboard, overview, replacement settings), Budget forecasting (summary, contracts, initiatives, IT debt, availabilities, and CSV/PDF exports), Contacts, Clients listing and lookups, PSA linking for initiatives (opportunities and tickets), Roadmap exports (CSV/PDF/spreadsheet), Insights, Warranty pricing, and user/session utilities. Many existing endpoints also gained richer filtering, cursor pagination, response examples, and documented 402 Payment Required (subscription-required) responses.

The API major version remains v1. Most changes are additive and backward compatible — but this release also includes a set of backward-incompatible changes you should review before upgrading. Twelve relationship attach/detach/unassign endpoints changed HTTP method or path, a few request/response contracts were tightened, and two areas were deprecated. See Changed and Deprecated below.


Changes

New endpoints

Clients

  • GET /lifecycle-manager/v1/clients

    • N/A → Available
    • Type: addition
    • Notes: Returns a paginated, searchable list of client summaries.
  • GET /lifecycle-manager/v1/clients/lookup

    • N/A → Available
    • Type: addition
    • Notes: Search clients by name for picker UIs, returning id/label pairs scoped to the caller's client-group access (or recently visited clients when no search term is provided).
  • GET /lifecycle-manager/v1/clients/{client_id}/contacts/lookup

    • N/A → Available
    • Type: addition
    • Notes: Search a client's PSA contacts by name for opportunity picker fields (minimum two characters), returning id/name/email tuples.
  • GET /lifecycle-manager/v1/clients/{client_id}/members/lookup

    • N/A → Available
    • Type: addition
    • Notes: Search a client's PSA members by name for opportunity picker fields (minimum two characters), returning id/name/email tuples.

Contacts

  • GET /lifecycle-manager/v1/contacts

    • N/A → Available
    • Type: addition
    • Notes: List Lifecycle Manager contacts across accessible clients, with optional client and hidden-status filters, cursor pagination, Core record lineage, and license/MFA posture details.
  • GET /lifecycle-manager/v1/contacts/{contact_id}

    • N/A → Available
    • Type: addition
    • Notes: Retrieve a single contact by Core API or temporary Lifecycle Manager contact ID, including hidden contacts.
  • PUT /lifecycle-manager/v1/contacts/{contact_id}/hidden-status

    • N/A → Available
    • Type: addition
    • Notes: Update whether a contact is hidden from standard contact views.

Contracts

  • PUT /lifecycle-manager/v1/contracts/{contract_id}/assets

    • N/A → Available
    • Type: addition
    • Notes: Attach one or more hardware assets to a contract by hardware identifier.
  • POST /lifecycle-manager/v1/contracts/{contract_id}/assets/delete

    • N/A → Available
    • Type: addition
    • Notes: Detach one or more hardware assets from a contract without deleting either entity.

Hardware Assets

  • GET /lifecycle-manager/v1/assets/hardware

    • N/A → Available
    • Type: addition
    • Notes: List hardware assets with client ownership and basic device fields, with query filters, free-text search, pagination, and sorting.
  • GET /lifecycle-manager/v1/assets/hardware-replacement/settings

    • N/A → Available
    • Type: addition
    • Notes: Retrieve hardware-replacement budget defaults by report asset type for a client, or account-wide defaults.
  • POST /lifecycle-manager/v1/assets/hardware/attached-agreements/lookup

    • N/A → Available
    • Type: addition
    • Notes: Look up the agreements attached to a hardware asset identified by its unique key.
  • GET /lifecycle-manager/v1/assets/hardware/dashboard

    • N/A → Available
    • Type: addition
    • Notes: Retrieve account- or client-scoped hardware dashboard totals, including replacement-due/soon and warranty expired/soon counts.
  • POST /lifecycle-manager/v1/assets/hardware/overview

    • N/A → Available
    • Type: addition
    • Notes: Fetch a hardware asset overview by unique identifier, including summary, warranty context, integrations, and navigation hints.
  • GET /lifecycle-manager/v1/warranty/pricing

    • N/A → Available
    • Type: addition
    • Notes: List renewable warranty assets and their available monthly pricing options (Server device types return estimates).

Budget

  • GET /lifecycle-manager/v1/budget/{client_id}/availabilities

    • N/A → Available
    • Type: addition
    • Notes: Retrieve the option lists used to construct Budget API queries for a single client.
  • GET /lifecycle-manager/v1/budget/{client_id}/contracts

    • N/A → Available
    • Type: addition
    • Notes: List a client's contracts with per-period forecast amounts, sorted and paginated.
  • GET /lifecycle-manager/v1/budget/{client_id}/initiatives

    • N/A → Available
    • Type: addition
    • Notes: List a client's initiatives with per-period forecast amounts, sorted and paginated.
  • GET /lifecycle-manager/v1/budget/{client_id}/it-debt

    • N/A → Available
    • Type: addition
    • Notes: List a client's IT Debt assets with per-period forecast amounts, sorted and paginated.
  • GET /lifecycle-manager/v1/budget/{client_id}/summary

    • N/A → Available
    • Type: addition
    • Notes: Retrieve aggregate per-type totals for a client's budget forecast across the requested period window.
  • GET /lifecycle-manager/v1/budget/{client_id}/forecast/csv

    • N/A → Available
    • Type: addition
    • Notes: Generate a CSV export of a client's budget forecast.
  • GET /lifecycle-manager/v1/budget/{client_id}/forecast/pdf

    • N/A → Available
    • Type: addition
    • Notes: Generate an overview PDF of a client's budget forecast.
  • GET /lifecycle-manager/v1/budget/{client_id}/forecast/detail/pdf

    • N/A → Available
    • Type: addition
    • Notes: Generate a detailed PDF of a client's budget forecast.

Initiatives

  • GET /lifecycle-manager/v2/initiatives

    • N/A → Available
    • Type: addition
    • Notes: List strategic initiatives with filtering and cursor-pagination options.
  • POST /lifecycle-manager/v1/initiative-templates/{initiative_template_id}/duplicate

    • N/A → Available
    • Type: addition
    • Notes: Duplicate an initiative template into a new editable account-scoped copy.
  • PUT /lifecycle-manager/v1/initiatives/{initiative_id}/assigned-user

    • N/A → Available
    • Type: addition
    • Notes: Update the user assigned to an initiative.
  • GET /lifecycle-manager/v1/initiatives/{initiative_id}/pdf

    • N/A → Available
    • Type: addition
    • Notes: Download a formatted PDF of an initiative, including its executive summary, budget, recurring costs, and action items.
  • GET /lifecycle-manager/v1/initiatives/{initiative_id}/quotes

    • N/A → Available
    • Type: addition
    • Notes: List all quotes linked to an initiative, with status display metadata and whether the account has Quoter enabled.
  • GET /lifecycle-manager/v1/initiatives/{initiative_id}/opportunity

    • N/A → Available
    • Type: addition
    • Notes: Get the PSA opportunity linked to an initiative, including a Pending state while asynchronous creation is in progress.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/opportunity

    • N/A → Available
    • Type: addition
    • Notes: Create a PSA opportunity for an initiative and link it; returns 202 Accepted while creation is queued in the external PSA.
  • DELETE /lifecycle-manager/v1/initiatives/{initiative_id}/opportunity

    • N/A → Available
    • Type: addition
    • Notes: Detach the PSA opportunity linked to an initiative; the opportunity itself is not deleted.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/opportunities/{opportunity_id}

    • N/A → Available
    • Type: addition
    • Notes: Attach an existing PSA opportunity to an initiative so the roadmap item is connected to revenue work already tracked in the PSA.
  • GET /lifecycle-manager/v1/initiatives/{initiative_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Get the current state of the PSA ticket linked to an initiative (Pending, Created, or Error).
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Create a PSA ticket and link it to an initiative; returns 202 Accepted while creation is queued in the external PSA.
  • DELETE /lifecycle-manager/v1/initiatives/{initiative_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Detach the PSA ticket linked to an initiative without deleting it from the external PSA.

Opportunities

  • GET /lifecycle-manager/v1/opportunities

    • N/A → Available
    • Type: addition
    • Notes: List PSA opportunities for a client so an existing opportunity can be linked to an initiative.
  • GET /lifecycle-manager/v1/opportunities/create-fields

    • N/A → Available
    • Type: addition
    • Notes: Retrieve PSA opportunity create-field metadata for a client, including integration availability and validation rules.

Goals & Action Items

  • PUT /lifecycle-manager/v1/action-items/{id}/pin

    • N/A → Available
    • Type: addition
    • Notes: Pin or unpin an action item so it appears above other open action items in task lists.
  • POST /lifecycle-manager/v1/action-items/{id}/reposition

    • N/A → Available
    • Type: addition
    • Notes: Reposition an action item within the account's manual sort order by placing it relative to neighboring items (before_id / after_id).
  • GET /lifecycle-manager/v1/goals/{goal_id}/action-items

    • N/A → Available
    • Type: addition
    • Notes: List all action items linked to a goal.
  • POST /lifecycle-manager/v1/goals/{goal_id}/action-items/{action_item_id}

    • N/A → Available
    • Type: addition
    • Notes: Attach an existing action item to a goal to track tasks that contribute toward the goal's progress.
  • DELETE /lifecycle-manager/v1/goals/{goal_id}/action-items/{action_item_id}

    • N/A → Available
    • Type: addition
    • Notes: Detach an action item from a goal without deleting either entity.

Deliverables

  • GET /lifecycle-manager/v1/deliverables
    • N/A → Available
    • Type: addition
    • Notes: List deliverables across your account with optional client-scoped filtering, sorting, and cursor pagination. (Replaces the now-deprecated client-scoped list — see Deprecated.)

Roadmaps & Exports

  • POST /lifecycle-manager/v1/roadmap/csv

    • N/A → Available
    • Type: addition
    • Notes: Generate a CSV export of a client roadmap from the selected filters.
  • POST /lifecycle-manager/v1/roadmap/pdf

    • N/A → Available
    • Type: addition
    • Notes: Generate a PDF export of a client roadmap from the selected sections.
  • POST /lifecycle-manager/v1/roadmap/spreadsheet

    • N/A → Available
    • Type: addition
    • Notes: Generate a spreadsheet export of a client roadmap from the selected filters.

Insights, Tickets & Platform

  • GET /lifecycle-manager/v1/insights

    • N/A → Available
    • Type: addition
    • Notes: Return all insights for the caller's account, including affected-asset counts, risk level, category metadata, asset scope, and 30-day trend where available.
  • GET /lifecycle-manager/v1/tickets/create-fields

    • N/A → Available
    • Type: addition
    • Notes: Return PSA ticket-create field definitions, valid values, validation rules, and dependent fields to drive a create-ticket form.
  • GET /lifecycle-manager/v1/active-users

    • N/A → Available
    • Type: addition
    • Notes: List the active users that belong to the authenticated account.
  • GET /lifecycle-manager/v1/user/identity

    • N/A → Available
    • Type: addition
    • Notes: Return the authenticated user together with feature-access and permission flags.
  • GET /lifecycle-manager/v1/user-ui-states/{state_key}

    • N/A → Available
    • Type: addition
    • Notes: Retrieve persisted UI preferences for the authenticated user in the current account.
  • PUT /lifecycle-manager/v1/user-ui-states/{state_key}

    • N/A → Available
    • Type: addition
    • Notes: Save UI preferences for the authenticated user, replacing any prior payload for the same key.

Changed

Relationship endpoints moved to a new method or path (action required)

These attach / detach / unassign operations changed their HTTP method or path. The previous forms are no longer available — update integrations to call the new form.

  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/action-items/{action_item_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching an action item to an initiative moved from PUT to POST.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/goals/{goal_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching a goal to an initiative moved from PUT to POST.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/template/{initiative_template_id}/apply

    • PUTPOST
    • Type: breaking change
    • Notes: Applying an initiative template moved from PUT to POST.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/assets/detach

    • replaces DELETE /lifecycle-manager/v1/initiatives/{initiative_id}/assets
    • Type: breaking change
    • Notes: Detaching assets from an initiative moved from DELETE on the collection to POST on …/assets/detach with a request body.
  • POST /lifecycle-manager/v1/goals/{goal_id}/initiatives/{initiative_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching an initiative to a goal moved from PUT to POST.
  • POST /lifecycle-manager/v1/goals/{goal_id}/meetings/{meeting_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching a meeting to a goal moved from PUT to POST.
  • POST /lifecycle-manager/v1/meetings/{meeting_id}/action-items/{action_item_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching an action item to a meeting moved from PUT to POST.
  • POST /lifecycle-manager/v1/meetings/{meeting_id}/goals/{goal_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching a goal to a meeting moved from PUT to POST.
  • POST /lifecycle-manager/v1/meetings/{meeting_id}/initiatives/{initiative_id}

    • PUTPOST
    • Type: breaking change
    • Notes: Attaching an initiative to a meeting moved from PUT to POST.
  • POST /lifecycle-manager/v1/meetings/{id}/attendees/contacts/delete

    • replaces DELETE /lifecycle-manager/v1/meetings/{id}/attendees/contacts
    • Type: breaking change
    • Notes: Removing contact attendees moved from DELETE to POST on …/attendees/contacts/delete.
  • POST /lifecycle-manager/v1/meetings/{id}/attendees/users/delete

    • replaces DELETE /lifecycle-manager/v1/meetings/{id}/attendees/users
    • Type: breaking change
    • Notes: Removing user attendees moved from DELETE to POST on …/attendees/users/delete.
  • POST /lifecycle-manager/v1/client-groups/{client_group_id}/assignments/unassign

    • replaces DELETE /lifecycle-manager/v1/client-groups/{client_group_id}/assignments
    • Type: breaking change
    • Notes: Unassigning clients/users from a client group moved from DELETE on the collection to POST on …/assignments/unassign.

Other contract changes

  • GET /lifecycle-manager/v1/initiative-templates

    • Type: breaking change
    • Notes: The 200 response shape changed. It previously returned a bespoke object with separate templates_account and templates_application arrays; it now returns the standard cursor-paginated envelope (data, next_cursor, total_count). Update response parsing accordingly.
  • POST /lifecycle-manager/v1/client-groups/{client_group_id}/assignments

    • Type: breaking change
    • Notes: The documented success response is now 204 No Content only — the prior 201 Created response with a JSON body was removed — and the request body is now required.
  • Filter operator prefix required on GET /lifecycle-manager/v1/meetings, GET /lifecycle-manager/v1/contracts, and GET /lifecycle-manager/v1/assets/hardware/lifecycles

    • Type: change
    • Notes: Filter query values are now documented to require an explicit operator prefix (for example filter[client.id]=eq:<id> and filter[expiry_status]=eq:<status>). Update any callers passing bare filter values.
  • Request body now required on several write endpoints

    • Type: change
    • Notes: POST/PUT /lifecycle-manager/v1/meetings, PUT /lifecycle-manager/v1/meetings/{id}, the meeting attendee-add and completion-status endpoints, POST/PUT /lifecycle-manager/v1/meeting-types, POST/PUT /lifecycle-manager/v2/meetings, and POST /lifecycle-manager/v1/assets/hardware/attached-initiatives/lookup now declare their request body as required where it was previously documented as optional.
  • next_cursor always present in list responses on GET /lifecycle-manager/v1/initiatives and GET /lifecycle-manager/v1/assets/hardware/lifecycles

    • Type: improvement
    • Notes: next_cursor is now a required response field (nullable on the final page). Strict response validators should expect it on every page.

Deprecated

  • GET /lifecycle-manager/v1/clients/{client-id}/deliverables

    • Available → Deprecated
    • Type: deprecation
    • Notes: Use GET /lifecycle-manager/v1/deliverables with filter[client.id] instead.
  • Plain-text description on PUT /lifecycle-manager/v1/goals/{id} and PUT /lifecycle-manager/v1/action-items/{id}

    • Available → Deprecated
    • Type: deprecation
    • Notes: The plain-text description field is deprecated in favor of rich-text description_json. Sending plain-text description on update overwrites any stored rich-text document with a plain-text projection and drops formatting — use description_json to preserve formatting.

Dates

  • Effective: [2026-06-15]