Fixed

Lifecycle Manager API - Contract Alignment, Migration Corrections, and New Endpoints


Summary

This release aligns the public reference with behavior already deployed by Lifecycle Manager and adds 27 new endpoints for PSA ticket links, goal outcomes, goal and initiative archiving, saved views, hardware asset metadata and custom-field values, license unassignment, and assessment access. It does not introduce new runtime behavior, but consumers relying on the previous reference should apply the migrations below.

It also carries the August 19 reference corrections whose release notes were not previously published: the initiative update contract (including the removal of the deprecated plain-text executive_summary field) and worked examples for updating Budget and Custom Rich Text deliverable components.

Goal and initiative routes now use {goal_id} and {initiative_id} as path parameter names; this is a documentation rename only and the URLs you call are unchanged.


Changes

New endpoints

PSA ticket links

  • GET /lifecycle-manager/v1/action-items/{action_item_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Get the linked PSA ticket state for an action item.
  • POST /lifecycle-manager/v1/action-items/{action_item_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Create a PSA ticket and link it to an action item.
  • PUT /lifecycle-manager/v1/action-items/{action_item_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Attach an existing PSA ticket to an action item.
  • DELETE /lifecycle-manager/v1/action-items/{action_item_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Unlink the PSA ticket from an action item.
  • GET /lifecycle-manager/v1/meetings/{meeting_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Get the linked PSA ticket state for a meeting.
  • POST /lifecycle-manager/v1/meetings/{meeting_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Create a PSA ticket and link it to a meeting.
  • DELETE /lifecycle-manager/v1/meetings/{meeting_id}/ticket

    • N/A → Available
    • Type: addition
    • Notes: Detach the PSA ticket linked to a meeting.
  • GET /lifecycle-manager/v1/tickets

    • N/A → Available
    • Type: addition
    • Notes: List PSA tickets that can be linked to action items and meetings.

Goal outcomes and archiving

  • GET /lifecycle-manager/v1/goals/outcomes

    • N/A → Available
    • Type: addition
    • Notes: List the Outcomes visible to your account.
  • POST /lifecycle-manager/v1/goals/outcomes

    • N/A → Available
    • Type: addition
    • Notes: Create an account Outcome, reusing an archived match when one exists.
  • PATCH /lifecycle-manager/v1/goals/outcomes/{outcome_id}

    • N/A → Available
    • Type: addition
    • Notes: Update an account Outcome's label, description, group, or archived state.
  • POST /lifecycle-manager/v1/goals/{goal_id}/archive

    • N/A → Available
    • Type: addition
    • Notes: Archive a goal.
  • POST /lifecycle-manager/v1/goals/{goal_id}/restore

    • N/A → Available
    • Type: addition
    • Notes: Restore an archived goal.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/archive

    • N/A → Available
    • Type: addition
    • Notes: Archive an initiative.
  • POST /lifecycle-manager/v1/initiatives/{initiative_id}/restore

    • N/A → Available
    • Type: addition
    • Notes: Restore an archived initiative.

Saved views

  • GET /lifecycle-manager/v1/saved-views

    • N/A → Available
    • Type: addition
    • Notes: List saved views.
  • POST /lifecycle-manager/v1/saved-views

    • N/A → Available
    • Type: addition
    • Notes: Create a saved view.
  • PATCH /lifecycle-manager/v1/saved-views/{saved_view_id}

    • N/A → Available
    • Type: addition
    • Notes: Update a saved view.
  • DELETE /lifecycle-manager/v1/saved-views/{saved_view_id}

    • N/A → Available
    • Type: addition
    • Notes: Delete a saved view.
  • PUT /lifecycle-manager/v1/saved-view-defaults/{key}

    • N/A → Available
    • Type: addition
    • Notes: Set the default saved view for a list.

Hardware assets and configuration

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

    • N/A → Available
    • Type: addition
    • Notes: Get the filters, columns, custom fields, and report availability for the hardware asset list.
  • GET /lifecycle-manager/v1/assets/hardware/report-asset-type-settings

    • N/A → Available
    • Type: addition
    • Notes: List hardware types for lifecycle report settings.
  • POST /lifecycle-manager/v1/assets/hardware/sources

    • N/A → Available
    • Type: addition
    • Notes: Resolve a hardware asset and its contributing source rows.
  • POST /lifecycle-manager/v1/assets/hardware/custom-fields/{hardware_custom_field_id}/values/assign

    • N/A → Available
    • Type: addition
    • Notes: Assign a custom-field value to hardware assets.
  • POST /lifecycle-manager/v1/assets/hardware/custom-fields/{hardware_custom_field_id}/values/unassign

    • N/A → Available
    • Type: addition
    • Notes: Unassign a custom-field value from hardware assets.

Client access and licensing

  • GET /lifecycle-manager/v1/clients/{client_id}/assessments/access

    • N/A → Available
    • Type: addition
    • Notes: Get a client's assessment access settings.
  • PUT /lifecycle-manager/v1/licenses/unassign

    • N/A → Available
    • Type: addition
    • Notes: Unassign licenses from contacts.

Changed

Client and contact updates

  • POST /lifecycle-manager/v1/clients/account-team

    • POST → PUT
    • Type: breaking change
    • Notes: Use PUT to assign account team members.
  • DELETE /lifecycle-manager/v1/clients/account-team

    • DELETE /clients/account-team → PUT /clients/account-team/unassign
    • Type: breaking change
    • Notes: Use the unassign operation to remove account team members.
  • POST /lifecycle-manager/v1/clients/bulk

    • POST /clients/bulk → PATCH /clients
    • Type: breaking change
    • Notes: Use the collection PATCH operation for bulk client updates.
  • PUT /lifecycle-manager/v1/clients/{client_id}

    • PUT → PATCH
    • Type: breaking change
    • Notes: Use PATCH to update an individual client.
  • POST /lifecycle-manager/v1/contacts/bulk

    • POST /contacts/bulk → PATCH /contacts
    • Type: breaking change
    • Notes: Use the collection PATCH operation to update contact visibility in bulk.
  • DELETE /lifecycle-manager/v1/clients/{client_id}/key-contacts/{client_key_contact_id}

    • DELETE with a path identifier → PUT /clients/{client_id}/key-contacts/unassign with a request body
    • Type: breaking change
    • Notes: Send the key-contact identifiers to unassign in the replacement request body.

Goal and goal-template updates

  • PUT /lifecycle-manager/v1/goals/{goal_id}

    • PUT → PATCH
    • Type: breaking change
    • Notes: Use PATCH to update an existing goal.
  • PUT /lifecycle-manager/v1/initiatives/{initiative_id}

    • PUT → PATCH
    • Type: breaking change
    • Notes: Use PATCH to update an existing initiative.
  • GET /lifecycle-manager/v1/goal-templates

    • categories → outcomes
    • Type: breaking change
    • Notes: Goal-template responses now expose outcomes instead of categories.
  • POST /lifecycle-manager/v1/goal-templates

    • categories → outcome_ids
    • Type: breaking change
    • Notes: Goal-template create payloads take outcome_ids instead of category objects.
  • PUT /lifecycle-manager/v1/goal-templates/{goal_template_id}

    • categories → outcome_ids
    • Type: breaking change
    • Notes: Goal-template update payloads take outcome_ids instead of category objects.

Action-item contracts

  • POST /lifecycle-manager/v1/action-items

    • title optional and nullable → required and non-nullable
    • Type: breaking change
    • Notes: The runtime rejects missing, empty, or whitespace-only action-item titles.
  • PUT /lifecycle-manager/v1/action-items/{id}

    • update_payload.title optional and nullable → required and non-nullable
    • Type: breaking change
    • Notes: The runtime rejects missing, empty, or whitespace-only action-item titles.
  • GET /lifecycle-manager/v1/action-items

    • description required → optional
    • Type: change
    • Notes: The legacy description alias is no longer guaranteed in action-item responses. Use title and description_json.

Hardware custom-field updates

  • PUT /lifecycle-manager/v1/assets/hardware/custom-fields/{hardware_custom_field_id}
    • Untyped request → typed Text, Date, or Select request
    • Type: breaking change
    • Notes: Every request must include the existing field's immutable type. Select requests may include options; omitting it remains valid and represents an empty option set.

Initiative update contract

  • PATCH /lifecycle-manager/v1/initiatives/{initiative_id}

    • executive_summary → executive_summary_json
    • Type: breaking change
    • Notes: The deprecated plain-text executive_summary field has been removed. Send the summary as executive_summary_json, a JSON-encoded ProseMirror document string. The payload rejects unrecognised fields, so a request still carrying executive_summary is rejected with 400 Bad Request. The editable fields are name, executive_summary_json, is_internal, assigned_contact_id, estimated_hours, and actual_hours.
  • PATCH /lifecycle-manager/v1/initiatives/{initiative_id}

    • 204 No Content → 200 OK
    • Type: change
    • Notes: A successful initiative update returns 200 OK with an empty body. If your client asserts on an exact status code, accept 200; clients that treat any 2xx as success need no change.
  • PATCH /lifecycle-manager/v1/initiatives/{initiative_id}

    • Omitted → cleared, clarified
    • Type: improvement
    • Notes: executive_summary_json and assigned_contact_id now document their null handling explicitly. Send null to clear the value, or omit the field entirely to preserve it. Behaviour is unchanged; the reference previously left this ambiguous.

New examples and documentation

  • PATCH /lifecycle-manager/v1/deliverables/{deliverable-id}

    • N/A → Documented
    • Type: addition
    • Notes: Two worked request examples are now available: updating a Budget component and updating a Custom Rich Text component. For Custom Rich Text, set configuration.data.content.type to RichText and configuration.data.content.content_json to a JSON-encoded ProseMirror document string.
  • PATCH /lifecycle-manager/v1/deliverables/{deliverable-id}

    • N/A → Documented
    • Type: improvement
    • Notes: A component's configuration.data object must match that component's configuration.default_values.schema, which you can read from the List Catalog Components endpoint. Deliverable update behaviour is unchanged.

Fixed

Request and response documentation

  • GET /lifecycle-manager/v1/assessments/{id}

    • Optional include=children → children always included
    • Type: improvement
    • Notes: Child assessments are always present in the response; the unsupported include parameter was removed from the reference.
  • GET /lifecycle-manager/v1/assessments/{assessment_id}/reports/comparison

    • compare_to_assessment_id optional → required
    • Type: improvement
    • Notes: The reference now reflects the runtime validator, which already requires the comparison assessment identifier.
  • GET /lifecycle-manager/v1/initiatives/{initiative_id}/assets

    • data → hardware_keys
    • Type: improvement
    • Notes: The response property now matches the deployed runtime contract.
  • GET /lifecycle-manager/v1/meetings/{meeting_id}/deliverables

    • data → deliverable_ids
    • Type: improvement
    • Notes: The response property now matches the deployed runtime contract.
  • PUT /lifecycle-manager/v1/analytics/display-settings

    • 204 No Content → 200 OK with the saved settings
    • Type: improvement
    • Notes: The documented success response now matches the payload returned by the runtime.
  • PUT /lifecycle-manager/v1/plan/dashboard/layout

    • 204 No Content → 200 OK with the saved layout
    • Type: improvement
    • Notes: The documented success response now matches the payload returned by the runtime.
  • POST /lifecycle-manager/v1/client-groups/{client_group_id}/assignments

    • 204 No Content → 201 Created
    • Type: improvement
    • Notes: The documented success status now matches the code returned by the runtime.

Filter documentation

  • GET /lifecycle-manager/v1/clients

    • Unsupported null:true vertical filter documented → removed
    • Type: improvement
    • Notes: filter[vertical_id] accepts repeated eq: values; the runtime does not support null:true.
  • GET /lifecycle-manager/v2/initiatives/summary

    • Prefixed boolean only → prefixed or bare boolean documented
    • Type: improvement
    • Notes: filter[needs_attention]=true and filter[needs_attention]=eq:true are both accepted, matching the initiatives list endpoint.

Unreleased reference cleanup

  • GET, PUT /lifecycle-manager/v1/user-ui-states/{state_key}
    • Accidentally documented → removed from the reference
    • Type: improvement
    • Notes: This unreleased persistence surface was removed from Lifecycle Manager; browser storage owns the state and there is no public API migration.