Purple HRBP API Documentation

Machine-readable OpenAPI 3.0 specification: https://marketplace.moveworks.com/api/purple-suite/hrbp/openapi.json

The consolidated all-apps document at https://marketplace.moveworks.com/api/purple-suite/openapi.json can be narrowed to this app with ?apps=hrbp, or combined with other apps comma-separated (e.g. ?apps=hrbp,itsm).

Overview

HR Business Partner (HRBP) source system — Talent Insights & Talent Review, and Employee Relations case management. Data layer for talent reviews, 9-box employee assessments, performance reviews, succession planning, metric snapshots, and ER cases/allegations/involved parties (SN sn_hr_er_* parity). ServiceNow-parity contract endpoints (resolve_filters, available_metrics, preview_review/commit_review, query) and the tp_* MCP tools are served alongside these collections. References employees in the Purple HRS (HRIS) app by employee_id. Choice fields use a readable canonical value; the originating ServiceNow code is noted in each field description. --- **Acting as a user (`X-PS-Impersonate-User`).** Every endpoint accepts an optional `X-PS-Impersonate-User` request header whose value is the email of the instance user to act as. The effective user resolves in this order: the header if present, else the instance's configured default MCP user, else none. User-scoped paths additionally accept the literal `me` in place of an email, and Graph-style apps also serve `/me/…` twins of their `/users/{email}/…` paths that resolve the same way. This header is honored by all operations but is intentionally omitted from each operation's parameter list so it is not surfaced as a per-tool argument by MCP clients; see the `ImpersonateUser` entry under `components.parameters`.

Endpoints

POST /api/purple-suite/hrbp/resolve_filters

Resolve & validate HRBP scope filters (tp_resolve_scope)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Resolve & validate HRBP scope filters (tp_resolve_scope)
400
Bad request

GET /api/purple-suite/hrbp/available_metrics

List predefined talent metrics (tp_list_metrics)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
List predefined talent metrics (tp_list_metrics)
400
Bad request

GET /api/purple-suite/hrbp/available_metric_categories

List metric categories

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
List metric categories
400
Bad request

POST /api/purple-suite/hrbp/execute_known_metric

Compute one predefined metric (tp_execute_metric)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Compute one predefined metric (tp_execute_metric)
400
Bad request

POST /api/purple-suite/hrbp/find_matching_reviews

Find talent reviews by filters (tp_find_reviews)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Find talent reviews by filters (tp_find_reviews)
400
Bad request

POST /api/purple-suite/hrbp/preview_review

Preview a talent review (computes metrics); mints idempotency_key (tp_preview_review)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Preview a talent review (computes metrics); mints idempotency_key (tp_preview_review)
400
Bad request

POST /api/purple-suite/hrbp/commit_review

Commit a previewed talent review (tp_commit_review)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Commit a previewed talent review (tp_commit_review)
400
Bad request

POST /api/purple-suite/hrbp/add_metric_to_review

Add a metric to an existing talent review (tp_add_metric)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Add a metric to an existing talent review (tp_add_metric)
400
Bad request

POST /api/purple-suite/hrbp/display_talent_review

Display a talent review + computed metrics (tp_display_review)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Display a talent review + computed metrics (tp_display_review)
400
Bad request

POST /api/purple-suite/hrbp/hrbp_data_analytics/query

HRBP data-analytics query — NL question → generated query, aggregates, inline insights, and async answer/follow-up logIds (SN hrbp_data_analytics/query). Returns 202 on submission; poll result.analysis.logId / result.followUps.logId via /hrbp_data_analytics/async_results.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
methodquerystringnofullPipeline needs {utterance, channelId}; insightsOnly needs {channelId} plus dataConfigurations or dataResponses; custom needs {featureFlags}; getAsyncResults needs {logId}.
seedquerystringnoPin the simulated model output so a run is reproducible. Omit for fresh phrasing on every call (the underlying numbers never change).
readyDelayMsqueryintegernoHow long the async answer/follow-up capabilities stay in `processing` before results land. 0 makes them readable immediately.

Responses

202
Accepted — async capabilities submitted
400
Validation error (missing required field)
404
getAsyncResults: unknown logId

GET /api/purple-suite/hrbp/hrbp_data_analytics/async_results

Batch-poll async analytics results by logId(s) (SN hrbp_data_analytics/async_results)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
logIdsquerystringnoComma-separated log ids.
logIdquerystringnoA single log id (combinable with logIds).

Responses

200
Batch-poll async analytics results by logId(s) (SN hrbp_data_analytics/async_results)
400
Bad request

POST /api/purple-suite/hrbp/hrbp_action_recommendations_rest_api/recommendations

Generate action recommendations from an analytics finding — accepts {goal, content} or {goal, queryGenResponse|fullpipeline_response} (SN hrbp_action_recommendations_rest_api/recommendations)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Generate action recommendations from an analytics finding — accepts {goal, content} or {goal, queryGenResponse|fullpipeline_response} (SN hrbp_action_recommendations_rest_api/recommendations)
400
Bad request

POST /api/purple-suite/hrbp/query

Alias of /hrbp_data_analytics/query (pre-existing Purple path)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Alias of /hrbp_data_analytics/query (pre-existing Purple path)
400
Bad request

GET /api/purple-suite/hrbp/async_results

Alias of /hrbp_data_analytics/async_results (pre-existing Purple path)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Alias of /hrbp_data_analytics/async_results (pre-existing Purple path)
400
Bad request

POST /api/purple-suite/hrbp/recommendations

Alias of /hrbp_action_recommendations_rest_api/recommendations (pre-existing Purple path)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Alias of /hrbp_action_recommendations_rest_api/recommendations (pre-existing Purple path)
400
Bad request

GET /api/purple-suite/hrbp/fuzzy_value_resolver

Resolve a raw value to catalog {value, sys_id} matches via exact->startswith->contains->fuzzy->text cascade (SN FuzzyValueResolver parity)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
tableNamequerystringyes
columnNamequerystringyes
rawValuequerystringyes

Responses

200
Resolve a raw value to catalog {value, sys_id} matches via exact->startswith->contains->fuzzy->text cascade (SN FuzzyValueResolver parity)
400
Bad request

GET /api/purple-suite/hrbp/available_templates

List talent-review templates

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
List talent-review templates
400
Bad request

POST /api/purple-suite/hrbp/create_review_from_template

Create a talent review from a template (direct write)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Create a talent review from a template (direct write)
400
Bad request

POST /api/purple-suite/hrbp/search_talent_reviews

Search talent reviews by filter names + scope; returns templates

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Search talent reviews by filter names + scope; returns templates
400
Bad request

POST /api/purple-suite/hrbp/execute_talent_review

Execute a talent review's stored metrics by id

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Execute a talent review's stored metrics by id
400
Bad request

POST /api/purple-suite/hrbp/query_metric

Resolve filters + compute one metric widget

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Resolve filters + compute one metric widget
400
Bad request

GET /api/purple-suite/hrbp/hr_program/summary

Get an HR program summary by name keyword (q)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Get an HR program summary by name keyword (q)
400
Bad request

POST /api/purple-suite/hrbp/hr_program/draft_notification

Raw program data + stakeholder contacts for an LLM to draft an HR program notification from (no server-built draft text)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Raw program data + stakeholder contacts for an LLM to draft an HR program notification from (no server-built draft text)
400
Bad request

POST /api/purple-suite/hrbp/hr_program/get_draft

Retrieve the caller's persisted notification draft HTML for a program

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Retrieve the caller's persisted notification draft HTML for a program
400
Bad request

POST /api/purple-suite/hrbp/hr_program/save_draft

Persist the caller's notification draft HTML for a program

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Persist the caller's notification draft HTML for a program
400
Bad request

GET /api/purple-suite/hrbp/hr_program/program_details/{sys_id_csv}

Full nested detail (fields, program type, milestones, resources, stakeholders, action plans) for one or more programs by comma-separated sys_id

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sys_id_csvpathstringyes

Responses

200
Full nested detail (fields, program type, milestones, resources, stakeholders, action plans) for one or more programs by comma-separated sys_id
400
Bad request

GET /api/purple-suite/hrbp/hr_program

List the caller's stakeholder/owner programs, grouped by state with upcoming milestones

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
List the caller's stakeholder/owner programs, grouped by state with upcoming milestones
400
Bad request

GET /api/purple-suite/hrbp/hr_profile/new_hire

New hires within the calling HRBP's scope for a hire-date window (start_date/end_date, yyyy-MM-dd; defaults to the last 30 days). Returns { start_date, end_date, count, employees:[{ name, hire_date, days_since_hire, position, department, manager }] }, wrapped in {result:...} (SN HRBPNewHireDetailsSNC parity).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
start_datequerystringno
end_datequerystringno

Responses

200
New hires within the calling HRBP's scope for a hire-date window (start_date/end_date, yyyy-MM-dd; defaults to the last 30 days). Returns { start_date, end_date, count, employees:[{ name, hire_date, days_since_hire, position, department, manager }] }, wrapped in {result:...} (SN HRBPNewHireDetailsSNC parity).
400
Bad request

GET /api/purple-suite/hrbp/employee/{sys_id}/work_history

An employee's job/position history (tenure duration + current-job status), most recent first, by employee sys_id. NOT self-scoped — any internal-role caller may look up any employee. Wraps both success AND error bodies in {result:...} (its SN op routes every 200/400/500 path through response.setBody(), same precedent as /hr_profile/new_hire).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sys_idpathstringyes

Responses

200
An employee's job/position history (tenure duration + current-job status), most recent first, by employee sys_id. NOT self-scoped — any internal-role caller may look up any employee. Wraps both success AND error bodies in {result:...} (its SN op routes every 200/400/500 path through response.setBody(), same precedent as /hr_profile/new_hire).
400
Bad request

GET /api/purple-suite/hrbp/hr_case

List the caller's HRBP cases (paginated, AI-enriched)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
List the caller's HRBP cases (paginated, AI-enriched)
400
Bad request

GET /api/purple-suite/hrbp/hr_case/{sys_id}

Get full HR case detail + AI enrichment + approvers (with raw_state) + collaborators + meeting_attendees + pending-approval flag

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sys_idpathstringyes

Responses

200
Get full HR case detail + AI enrichment + approvers (with raw_state) + collaborators + meeting_attendees + pending-approval flag
400
Bad request

POST /api/purple-suite/hrbp/hr_case/{sys_id}/approval

Approve or reject the caller's pending approval on an HR case

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sys_idpathstringyes

Responses

200
Approve or reject the caller's pending approval on an HR case
400
Bad request

GET /api/purple-suite/hrbp/api/now/table/sn_hr_core_case

ServiceNow Table API parity: look up a case by number (sysparm_query=number=<value>); wraps in {result: [...]}

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
ServiceNow Table API parity: look up a case by number (sysparm_query=number=<value>); wraps in {result: [...]}
400
Bad request

PATCH /api/purple-suite/hrbp/api/now/table/sn_hr_core_case/{sys_id}

ServiceNow Table API parity: update a case's state (+ optional work_notes) for defer(24)/resume(18)/cancel(7); wraps in {result: {...}}

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sys_idpathstringyes

Responses

200
ServiceNow Table API parity: update a case's state (+ optional work_notes) for defer(24)/resume(18)/cancel(7); wraps in {result: {...}}
400
Bad request

GET /api/purple-suite/hrbp/api/now/table/sys_user

ServiceNow Table API parity: sys_user lookup (sysparm_query=nameLIKE<term>) for the u_SysUser slot resolver; wraps in {result: [...]}

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sysparm_queryquerystringno
sysparm_fieldsquerystringno
sysparm_limitqueryintegerno
sysparm_offsetqueryintegerno

Responses

200
ServiceNow Table API parity: sys_user lookup (sysparm_query=nameLIKE<term>) for the u_SysUser slot resolver; wraps in {result: [...]}
400
Bad request

GET /api/purple-suite/hrbp/api/now/table/sn_hr_core_employee_certification_and_license

ServiceNow Table API parity: an employee's certification/license records (sysparm_query=employee=<sys_id>^active=true). Supports the dot-walked certification_or_license.governing_agency field via sysparm_fields; wraps in {result: [...]}. Always shaped as sysparm_display_value=true + sysparm_exclude_reference_link=true (the emulated action sends both as true; not a toggle here — see README).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
sysparm_queryquerystringno
sysparm_fieldsquerystringno
sysparm_limitqueryintegerno
sysparm_offsetqueryintegerno

Responses

200
ServiceNow Table API parity: an employee's certification/license records (sysparm_query=employee=<sys_id>^active=true). Supports the dot-walked certification_or_license.governing_agency field via sysparm_fields; wraps in {result: [...]}. Always shaped as sysparm_display_value=true + sysparm_exclude_reference_link=true (the emulated action sends both as true; not a toggle here — see README).
400
Bad request

GET /api/purple-suite/hrbp/api/now/table/sn_hr_core_profile

ServiceNow Table API parity: look up an employee's HR profile by name (sysparm_query=user.name=<value>); reference fields (user.department/user.manager/user.location) as {display_value, link}; wraps in {result: [...]}

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
ServiceNow Table API parity: look up an employee's HR profile by name (sysparm_query=user.name=<value>); reference fields (user.department/user.manager/user.location) as {display_value, link}; wraps in {result: [...]}
400
Bad request

GET /api/purple-suite/hrbp/api/now/table/sys_user_has_skill

ServiceNow Table API parity: list an employee's skills by sys_id (sysparm_query=user.sys_id=<value>); skill/skill_level as {display_value, link} (skill_level is "" when unset); wraps in {result: [...]}

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
ServiceNow Table API parity: list an employee's skills by sys_id (sysparm_query=user.sys_id=<value>); skill/skill_level as {display_value, link} (skill_level is "" when unset); wraps in {result: [...]}
400
Bad request

GET /api/purple-suite/hrbp/er_cases

Look up an ER case by number, or count ER cases by allegation type / department / location / leader / hr_service / date range (SN HRERCaseAPI parity)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Look up an ER case by number, or count ER cases by allegation type / department / location / leader / hr_service / date range (SN HRERCaseAPI parity)
400
Bad request

GET /api/purple-suite/hrbp/hrbp_batch_user_resolution/resolve

Batch resolve user names to emails for meeting scheduling (SN hrbp_batch_user_resolution parity)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Batch resolve user names to emails for meeting scheduling (SN hrbp_batch_user_resolution parity)
400
Bad request

GET /api/purple-suite/hrbp/hrbp_capabilities

Which optional HRBP Hub modules (e.g. Talent Pulse) are available on this instance (SN hrbp_capabilities parity)

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Responses

200
Which optional HRBP Hub modules (e.g. Talent Pulse) are available on this instance (SN hrbp_capabilities parity)
400
Bad request

GET /api/purple-suite/hrbp/hrbp_manager_span

Manager span of control. With manager_sys_id: that manager's direct + total (transitive) report counts — {manager_sys_id, num_direct_reports, num_total_reports}, 404 if no such user, zeroes if they are not an active manager. Without it: the CALLING HRBP's in-scope managers ranked by total reports, paginated 10 per page — {page_number, count, managers, average_total_reports} (count is this page's size); never accepts a caller-supplied hrbpSysId. Wraps success AND error bodies in {result:...} (every branch of the SN op routes through response.setBody()).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
manager_sys_idquerystringno
page_numberqueryintegerno

Responses

200
Manager span of control. With manager_sys_id: that manager's direct + total (transitive) report counts — {manager_sys_id, num_direct_reports, num_total_reports}, 404 if no such user, zeroes if they are not an active manager. Without it: the CALLING HRBP's in-scope managers ranked by total reports, paginated 10 per page — {page_number, count, managers, average_total_reports} (count is this page's size); never accepts a caller-supplied hrbpSysId. Wraps success AND error bodies in {result:...} (every branch of the SN op routes through response.setBody()).
400
Bad request

GET /api/purple-suite/hrbp/talent_reviews

List talent reviews

A talent review is the HRBP's saved analytics package: a named review over a scope (leaders / departments / locations) and period, carrying an ordered list of attached metrics (headcount, attrition_rate, 9-box distribution, ...). It is the record the tp_* ServiceNow-parity tools create and execute. Use this raw list to browse or audit review records; use tp_find_reviews / tp_search_reviews when resolving by leader or department NAME. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    TalentReview

    • id string
    • number string
    • name string required
    • state stringLifecycle (forward-only; SN label 'In Progress' → 'in_progress').
    • period_start string
    • period_end string
    • leaders arrayEmployee IDs leading this review (SN leaders→sys_user).
      Employee IDs leading this review (SN leaders→sys_user).

      array of:

      string

    • departments arrayDepartment names in scope.
      Department names in scope.

      array of:

      string

    • locations arrayLocations in scope.
      Locations in scope.

      array of:

      string

    • template_id string
    • objectives stringReview objective(s) (e.g. 'Identify retention risks in high-growth hubs').
    • metrics arrayMetrics attached to the review.
      Metrics attached to the review.

      array of:

      • metric_id string
      • group_by string
      • aggregation string
      • order integer
      • insights string
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/talent_reviews

Create a talent review record directly

Writes a talent review row with its scope, period and metric list, bypassing the guided flow. Prefer tp_preview_review + tp_commit_review (or tp_create_review_from_template), which validate the HRBP's scope access and de-duplicate via an idempotency key.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

TalentReview

  • id string
  • number string
  • name string required
  • state stringLifecycle (forward-only; SN label 'In Progress' → 'in_progress').
  • period_start string
  • period_end string
  • leaders arrayEmployee IDs leading this review (SN leaders→sys_user).
    Employee IDs leading this review (SN leaders→sys_user).

    array of:

    string

  • departments arrayDepartment names in scope.
    Department names in scope.

    array of:

    string

  • locations arrayLocations in scope.
    Locations in scope.

    array of:

    string

  • template_id string
  • objectives stringReview objective(s) (e.g. 'Identify retention risks in high-growth hubs').
  • metrics arrayMetrics attached to the review.
    Metrics attached to the review.

    array of:

    • metric_id string
    • group_by string
    • aggregation string
    • order integer
    • insights string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

TalentReview

  • id string
  • number string
  • name string required
  • state stringLifecycle (forward-only; SN label 'In Progress' → 'in_progress').
  • period_start string
  • period_end string
  • leaders arrayEmployee IDs leading this review (SN leaders→sys_user).
    Employee IDs leading this review (SN leaders→sys_user).

    array of:

    string

  • departments arrayDepartment names in scope.
    Department names in scope.

    array of:

    string

  • locations arrayLocations in scope.
    Locations in scope.

    array of:

    string

  • template_id string
  • objectives stringReview objective(s) (e.g. 'Identify retention risks in high-growth hubs').
  • metrics arrayMetrics attached to the review.
    Metrics attached to the review.

    array of:

    • metric_id string
    • group_by string
    • aggregation string
    • order integer
    • insights string
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/talent_reviews/{id}

Get a talent review by id

Returns one review's definition - scope, period and attached metrics - but NOT computed results. Use tp_display_review or tp_execute_review to get metric values.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

TalentReview

  • id string
  • number string
  • name string required
  • state stringLifecycle (forward-only; SN label 'In Progress' → 'in_progress').
  • period_start string
  • period_end string
  • leaders arrayEmployee IDs leading this review (SN leaders→sys_user).
    Employee IDs leading this review (SN leaders→sys_user).

    array of:

    string

  • departments arrayDepartment names in scope.
    Department names in scope.

    array of:

    string

  • locations arrayLocations in scope.
    Locations in scope.

    array of:

    string

  • template_id string
  • objectives stringReview objective(s) (e.g. 'Identify retention risks in high-growth hubs').
  • metrics arrayMetrics attached to the review.
    Metrics attached to the review.

    array of:

    • metric_id string
    • group_by string
    • aggregation string
    • order integer
    • insights string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/talent_reviews/{id}

Delete a talent review

DESTRUCTIVE and irreversible: removes the review and its attached metric configuration. Any snapshots already captured from it survive as separate records. Confirm with the user before calling.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/talent_reviews/{id}

Edit a talent review record

Partial update of a review's name, scope, period or attached metric list. To add a metric to an existing review prefer tp_add_metric, which is idempotent on (review, metric).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

TalentReview

  • id string
  • number string
  • name string required
  • state stringLifecycle (forward-only; SN label 'In Progress' → 'in_progress').
  • period_start string
  • period_end string
  • leaders arrayEmployee IDs leading this review (SN leaders→sys_user).
    Employee IDs leading this review (SN leaders→sys_user).

    array of:

    string

  • departments arrayDepartment names in scope.
    Department names in scope.

    array of:

    string

  • locations arrayLocations in scope.
    Locations in scope.

    array of:

    string

  • template_id string
  • objectives stringReview objective(s) (e.g. 'Identify retention risks in high-growth hubs').
  • metrics arrayMetrics attached to the review.
    Metrics attached to the review.

    array of:

    • metric_id string
    • group_by string
    • aggregation string
    • order integer
    • insights string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

TalentReview

  • id string
  • number string
  • name string required
  • state stringLifecycle (forward-only; SN label 'In Progress' → 'in_progress').
  • period_start string
  • period_end string
  • leaders arrayEmployee IDs leading this review (SN leaders→sys_user).
    Employee IDs leading this review (SN leaders→sys_user).

    array of:

    string

  • departments arrayDepartment names in scope.
    Department names in scope.

    array of:

    string

  • locations arrayLocations in scope.
    Locations in scope.

    array of:

    string

  • template_id string
  • objectives stringReview objective(s) (e.g. 'Identify retention risks in high-growth hubs').
  • metrics arrayMetrics attached to the review.
    Metrics attached to the review.

    array of:

    • metric_id string
    • group_by string
    • aggregation string
    • order integer
    • insights string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/employee_assessments

List 9-box employee assessments

An employee assessment is one employee's talent-review datapoint for a cycle: performance_rating (1-5) and derived performance_band, potential, flight_risk, replacement_readiness, achievable_level and the derived 9-box cell. This is HRBP calibration data, distinct from HRIS performance reviews (the formal review record) and from performance_reviews here (manager/employee rating pairs). Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    EmployeeAssessment

    • id string
    • employee_id string required
    • talent_review_id string
    • assessment_date string
    • cycle string
    • performance_rating integer1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).
    • performance_band stringDerived band (excellent/good/average/needs_improvement/poor).
    • potential stringSN 10/20/30 or High/Medium/Low.
    • achievable_level stringSN 10/20/30 or '1/2/3 Levels'.
    • flight_risk stringStored (not derived) per SN assessment.
    • replacement_readiness stringSN 0/3/6/12.
    • box integerDerived 9-box cell (potential × performance).
    • core_competencies string
    • development_needs string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/employee_assessments

Create an employee assessment (9-box datapoint)

Records one employee's calibration for a cycle, optionally tied to a talent_review_id. `box` is derived from potential x performance - do not set it.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

EmployeeAssessment

  • id string
  • employee_id string required
  • talent_review_id string
  • assessment_date string
  • cycle string
  • performance_rating integer1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).
  • performance_band stringDerived band (excellent/good/average/needs_improvement/poor).
  • potential stringSN 10/20/30 or High/Medium/Low.
  • achievable_level stringSN 10/20/30 or '1/2/3 Levels'.
  • flight_risk stringStored (not derived) per SN assessment.
  • replacement_readiness stringSN 0/3/6/12.
  • box integerDerived 9-box cell (potential × performance).
  • core_competencies string
  • development_needs string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

EmployeeAssessment

  • id string
  • employee_id string required
  • talent_review_id string
  • assessment_date string
  • cycle string
  • performance_rating integer1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).
  • performance_band stringDerived band (excellent/good/average/needs_improvement/poor).
  • potential stringSN 10/20/30 or High/Medium/Low.
  • achievable_level stringSN 10/20/30 or '1/2/3 Levels'.
  • flight_risk stringStored (not derived) per SN assessment.
  • replacement_readiness stringSN 0/3/6/12.
  • box integerDerived 9-box cell (potential × performance).
  • core_competencies string
  • development_needs string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/employee_assessments/{id}

Get an employee assessment by id

Returns one employee's assessment for a cycle, including the derived 9-box cell, core competencies and development needs.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

EmployeeAssessment

  • id string
  • employee_id string required
  • talent_review_id string
  • assessment_date string
  • cycle string
  • performance_rating integer1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).
  • performance_band stringDerived band (excellent/good/average/needs_improvement/poor).
  • potential stringSN 10/20/30 or High/Medium/Low.
  • achievable_level stringSN 10/20/30 or '1/2/3 Levels'.
  • flight_risk stringStored (not derived) per SN assessment.
  • replacement_readiness stringSN 0/3/6/12.
  • box integerDerived 9-box cell (potential × performance).
  • core_competencies string
  • development_needs string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/employee_assessments/{id}

Delete an employee assessment

DESTRUCTIVE and irreversible: removes the employee's calibration datapoint for that cycle, changing any 9-box or performance-distribution metric computed afterwards.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/employee_assessments/{id}

Edit an employee assessment

Partial update of a calibration datapoint (rating, potential, flight risk, readiness). The 9-box cell is recomputed by the server.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

EmployeeAssessment

  • id string
  • employee_id string required
  • talent_review_id string
  • assessment_date string
  • cycle string
  • performance_rating integer1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).
  • performance_band stringDerived band (excellent/good/average/needs_improvement/poor).
  • potential stringSN 10/20/30 or High/Medium/Low.
  • achievable_level stringSN 10/20/30 or '1/2/3 Levels'.
  • flight_risk stringStored (not derived) per SN assessment.
  • replacement_readiness stringSN 0/3/6/12.
  • box integerDerived 9-box cell (potential × performance).
  • core_competencies string
  • development_needs string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

EmployeeAssessment

  • id string
  • employee_id string required
  • talent_review_id string
  • assessment_date string
  • cycle string
  • performance_rating integer1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).
  • performance_band stringDerived band (excellent/good/average/needs_improvement/poor).
  • potential stringSN 10/20/30 or High/Medium/Low.
  • achievable_level stringSN 10/20/30 or '1/2/3 Levels'.
  • flight_risk stringStored (not derived) per SN assessment.
  • replacement_readiness stringSN 0/3/6/12.
  • box integerDerived 9-box cell (potential × performance).
  • core_competencies string
  • development_needs string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/performance_reviews

List performance review ratings

A performance review here is a lightweight rating pair for one employee over a review window: rating_manager and rating_employee (1-5) plus the assessment date. It feeds HRBP performance metrics. Narrower than an HRIS employee review (strengths/gaps narrative) and than an employee assessment (9-box potential and flight risk). Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    PerformanceReview

    • id string
    • employee_id string required
    • review_start_date string
    • review_end_date string
    • rating_manager number
    • rating_employee number
    • assessed_on string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/performance_reviews

Create a performance review rating

Records a manager and/or self rating for an employee over a review period. Use employee_assessments instead when you need potential, flight risk or 9-box placement.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

PerformanceReview

  • id string
  • employee_id string required
  • review_start_date string
  • review_end_date string
  • rating_manager number
  • rating_employee number
  • assessed_on string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

PerformanceReview

  • id string
  • employee_id string required
  • review_start_date string
  • review_end_date string
  • rating_manager number
  • rating_employee number
  • assessed_on string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/performance_reviews/{id}

Get a performance review rating by id

Returns one rating record: the employee, the review window and the manager/employee scores.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

PerformanceReview

  • id string
  • employee_id string required
  • review_start_date string
  • review_end_date string
  • rating_manager number
  • rating_employee number
  • assessed_on string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/performance_reviews/{id}

Delete a performance review rating

DESTRUCTIVE and irreversible: removes the rating record, which changes any performance metric recomputed afterwards.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/performance_reviews/{id}

Edit a performance review rating

Partial update of the review window or the manager/employee ratings.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

PerformanceReview

  • id string
  • employee_id string required
  • review_start_date string
  • review_end_date string
  • rating_manager number
  • rating_employee number
  • assessed_on string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

PerformanceReview

  • id string
  • employee_id string required
  • review_start_date string
  • review_end_date string
  • rating_manager number
  • rating_employee number
  • assessed_on string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/succession_plans

List succession plans for critical roles

A succession plan covers one critical ROLE (title, incumbent, department) with its criticality, loss_impact, retention_risk, success profile and a count of named successors. The candidates themselves are separate successor records linked by succession_plan_id. Use this to answer 'which roles have succession coverage'. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    SuccessionPlan

    • id string
    • number string
    • title string required
    • incumbent_employee_id string
    • job_title string
    • department string
    • planned_retirement_date string
    • criticality stringSN demo low/medium/high.
    • loss_impact stringSN High/Intermediate→medium/Low.
    • retention_risk string
    • success_profile objectRole mission/skills/qualifications (SN JSON).
    • successor_count integer
    • external_id string
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/succession_plans

Create a succession plan for a role

Opens a plan for a critical role and its incumbent. Add candidates afterwards as successor records; successor_count is maintained by the server.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

SuccessionPlan

  • id string
  • number string
  • title string required
  • incumbent_employee_id string
  • job_title string
  • department string
  • planned_retirement_date string
  • criticality stringSN demo low/medium/high.
  • loss_impact stringSN High/Intermediate→medium/Low.
  • retention_risk string
  • success_profile objectRole mission/skills/qualifications (SN JSON).
  • successor_count integer
  • external_id string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

SuccessionPlan

  • id string
  • number string
  • title string required
  • incumbent_employee_id string
  • job_title string
  • department string
  • planned_retirement_date string
  • criticality stringSN demo low/medium/high.
  • loss_impact stringSN High/Intermediate→medium/Low.
  • retention_risk string
  • success_profile objectRole mission/skills/qualifications (SN JSON).
  • successor_count integer
  • external_id string
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/succession_plans/{id}

Get a succession plan by id

Returns one role's plan - incumbent, criticality, loss impact, retention risk and success profile. Candidate details live in the successors collection filtered by succession_plan_id.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

SuccessionPlan

  • id string
  • number string
  • title string required
  • incumbent_employee_id string
  • job_title string
  • department string
  • planned_retirement_date string
  • criticality stringSN demo low/medium/high.
  • loss_impact stringSN High/Intermediate→medium/Low.
  • retention_risk string
  • success_profile objectRole mission/skills/qualifications (SN JSON).
  • successor_count integer
  • external_id string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/succession_plans/{id}

Delete a succession plan

DESTRUCTIVE and irreversible: removes the plan. Its successor records are orphaned rather than deleted. Prefer setting `active` to false to retire a plan.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/succession_plans/{id}

Edit a succession plan

Partial update of the plan's role metadata, risk ratings or success profile. Adding or ranking candidates is done on successor records, not here.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

SuccessionPlan

  • id string
  • number string
  • title string required
  • incumbent_employee_id string
  • job_title string
  • department string
  • planned_retirement_date string
  • criticality stringSN demo low/medium/high.
  • loss_impact stringSN High/Intermediate→medium/Low.
  • retention_risk string
  • success_profile objectRole mission/skills/qualifications (SN JSON).
  • successor_count integer
  • external_id string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

SuccessionPlan

  • id string
  • number string
  • title string required
  • incumbent_employee_id string
  • job_title string
  • department string
  • planned_retirement_date string
  • criticality stringSN demo low/medium/high.
  • loss_impact stringSN High/Intermediate→medium/Low.
  • retention_risk string
  • success_profile objectRole mission/skills/qualifications (SN JSON).
  • successor_count integer
  • external_id string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/successors

List succession candidates

A successor is one named candidate on a succession plan: candidate_employee_id, top_candidate flag, readiness (ready now / 3 / 6 / 12 months), potential, current rating, matching score and development areas. Filter by succession_plan_id to see a role's bench; filter by candidate_employee_id to see which roles a person is slated for. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    Successor

    • id string
    • succession_plan_id string required
    • candidate_employee_id string required
    • top_candidate boolean
    • readiness stringSN 0/3/6/12 or 'Ready in …' (9 months→6m).
    • potential string
    • achievable_level string
    • current_rating stringBanded (SN '4 - Exceeds Expectations').
    • education string
    • skills stringComma-separated.
    • job_history_companies string
    • promotion_readiness string
    • development_areas string
    • matching_score integer
    • candidate_profile objectPer-dimension match scores (SN JSON).
    • temporary_fill boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/successors

Add a candidate to a succession plan

Names an employee as a successor for the plan given by succession_plan_id, with their readiness and potential. The plan's successor_count is updated by the server.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Successor

  • id string
  • succession_plan_id string required
  • candidate_employee_id string required
  • top_candidate boolean
  • readiness stringSN 0/3/6/12 or 'Ready in …' (9 months→6m).
  • potential string
  • achievable_level string
  • current_rating stringBanded (SN '4 - Exceeds Expectations').
  • education string
  • skills stringComma-separated.
  • job_history_companies string
  • promotion_readiness string
  • development_areas string
  • matching_score integer
  • candidate_profile objectPer-dimension match scores (SN JSON).
  • temporary_fill boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Successor

  • id string
  • succession_plan_id string required
  • candidate_employee_id string required
  • top_candidate boolean
  • readiness stringSN 0/3/6/12 or 'Ready in …' (9 months→6m).
  • potential string
  • achievable_level string
  • current_rating stringBanded (SN '4 - Exceeds Expectations').
  • education string
  • skills stringComma-separated.
  • job_history_companies string
  • promotion_readiness string
  • development_areas string
  • matching_score integer
  • candidate_profile objectPer-dimension match scores (SN JSON).
  • temporary_fill boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/successors/{id}

Get a succession candidate by id

Returns one candidate's bench entry: readiness, potential, achievable level, match score and development areas.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Successor

  • id string
  • succession_plan_id string required
  • candidate_employee_id string required
  • top_candidate boolean
  • readiness stringSN 0/3/6/12 or 'Ready in …' (9 months→6m).
  • potential string
  • achievable_level string
  • current_rating stringBanded (SN '4 - Exceeds Expectations').
  • education string
  • skills stringComma-separated.
  • job_history_companies string
  • promotion_readiness string
  • development_areas string
  • matching_score integer
  • candidate_profile objectPer-dimension match scores (SN JSON).
  • temporary_fill boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/successors/{id}

Remove a candidate from a succession plan

DESTRUCTIVE and irreversible: deletes the bench entry and lowers the plan's coverage. The employee record itself is untouched.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/successors/{id}

Edit a succession candidate

Partial update of a candidate's readiness, potential, top_candidate flag or development areas - the usual way to re-rank a bench after calibration.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Successor

  • id string
  • succession_plan_id string required
  • candidate_employee_id string required
  • top_candidate boolean
  • readiness stringSN 0/3/6/12 or 'Ready in …' (9 months→6m).
  • potential string
  • achievable_level string
  • current_rating stringBanded (SN '4 - Exceeds Expectations').
  • education string
  • skills stringComma-separated.
  • job_history_companies string
  • promotion_readiness string
  • development_areas string
  • matching_score integer
  • candidate_profile objectPer-dimension match scores (SN JSON).
  • temporary_fill boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Successor

  • id string
  • succession_plan_id string required
  • candidate_employee_id string required
  • top_candidate boolean
  • readiness stringSN 0/3/6/12 or 'Ready in …' (9 months→6m).
  • potential string
  • achievable_level string
  • current_rating stringBanded (SN '4 - Exceeds Expectations').
  • education string
  • skills stringComma-separated.
  • job_history_companies string
  • promotion_readiness string
  • development_areas string
  • matching_score integer
  • candidate_profile objectPer-dimension match scores (SN JSON).
  • temporary_fill boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/snapshots

List captured metric snapshots

A snapshot is one metric value frozen at a point in time: metric_id, the computed value JSON (per group), a source and a timestamp, batched under a group_id. Snapshots are the history that makes trend questions answerable; to compute a metric live use tp_execute_metric or tp_query_metric instead. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    Snapshot

    • id string
    • metric_id string required
    • group_id stringBatch grouping key.
    • source string
    • value object requiredComputed metric value as JSON (per group).
    • timestamp string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/snapshots

Capture a metric snapshot

Stores a computed metric value against a metric_id and group_id. Normally written by the snapshot pipeline - creating one by hand inserts a datapoint into the trend history.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Snapshot

  • id string
  • metric_id string required
  • group_id stringBatch grouping key.
  • source string
  • value object requiredComputed metric value as JSON (per group).
  • timestamp string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Snapshot

  • id string
  • metric_id string required
  • group_id stringBatch grouping key.
  • source string
  • value object requiredComputed metric value as JSON (per group).
  • timestamp string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/snapshots/{id}

Get a metric snapshot by id

Returns one frozen metric value with its timestamp, source and per-group breakdown.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Snapshot

  • id string
  • metric_id string required
  • group_id stringBatch grouping key.
  • source string
  • value object requiredComputed metric value as JSON (per group).
  • timestamp string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/snapshots/{id}

Delete a metric snapshot

DESTRUCTIVE and irreversible: removes a datapoint from the trend history, which changes previously reported trends.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/snapshots/{id}

Edit a metric snapshot

Partial update of a stored datapoint. Editing history rewrites what trend queries will report - prefer capturing a new snapshot.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Snapshot

  • id string
  • metric_id string required
  • group_id stringBatch grouping key.
  • source string
  • value object requiredComputed metric value as JSON (per group).
  • timestamp string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Snapshot

  • id string
  • metric_id string required
  • group_id stringBatch grouping key.
  • source string
  • value object requiredComputed metric value as JSON (per group).
  • timestamp string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/metric_goals

List metric goals (targets and thresholds)

A metric goal is a target set on a metric for a period: metric_id, period_start/end, threshold_value and a comparison_type saying whether being above or below the threshold is good. Optionally scoped to a talent review. Read these to judge whether a computed metric is on or off target. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    MetricGoal

    • id string
    • name string
    • talent_review_id string
    • metric_id string required
    • period_start string
    • period_end string
    • threshold_value number
    • comparison_type string
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/metric_goals

Create a metric goal

Sets a target threshold for a metric over a period (e.g. attrition_rate below 3% for FY26), optionally tied to a talent review. Defines the bar; it does not compute anything.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

MetricGoal

  • id string
  • name string
  • talent_review_id string
  • metric_id string required
  • period_start string
  • period_end string
  • threshold_value number
  • comparison_type string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

MetricGoal

  • id string
  • name string
  • talent_review_id string
  • metric_id string required
  • period_start string
  • period_end string
  • threshold_value number
  • comparison_type string
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/metric_goals/{id}

Get a metric goal by id

Returns one target: its metric, period, threshold value and comparison direction.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

MetricGoal

  • id string
  • name string
  • talent_review_id string
  • metric_id string required
  • period_start string
  • period_end string
  • threshold_value number
  • comparison_type string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/metric_goals/{id}

Delete a metric goal

DESTRUCTIVE and irreversible: removes the target, after which the metric has no threshold to be judged against. Prefer setting `active` to false.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/metric_goals/{id}

Edit a metric goal

Partial update of a target's threshold, period or comparison direction - i.e. moving the bar.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

MetricGoal

  • id string
  • name string
  • talent_review_id string
  • metric_id string required
  • period_start string
  • period_end string
  • threshold_value number
  • comparison_type string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

MetricGoal

  • id string
  • name string
  • talent_review_id string
  • metric_id string required
  • period_start string
  • period_end string
  • threshold_value number
  • comparison_type string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/hrbp_scope_assignments

List HRBP scope assignments (who can see what)

A scope assignment grants ONE HRBP user access to one scope - by scope_type/scope_id, or all_access for an unrestricted HR leader. This is the access-control table that tp_resolve_scope checks before any metric or review runs, and it is why a query can come back access_denied. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    HrbpScopeAssignment

    • id string
    • user string requiredUser (email/employee id) this scope grants visibility to.
    • scope_type string
    • scope_id stringOptional link to an HrbpScope (normalized scope definition).
    • all_access booleanUnrestricted (admin-equivalent) scope — request passes through verbatim.
    • leaders arrayLeader employee IDs in scope.
      Leader employee IDs in scope.

      array of:

      string

    • departments arrayDepartments in scope.
      Departments in scope.

      array of:

      string

    • locations arrayHierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).
      Hierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).

      array of:

      string

    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/hrbp_scope_assignments

Grant an HRBP access to a scope

Assigns a user a scope (or all_access). SECURITY-SENSITIVE: this widens who can see employee talent data. Confirm with the user before calling.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

HrbpScopeAssignment

  • id string
  • user string requiredUser (email/employee id) this scope grants visibility to.
  • scope_type string
  • scope_id stringOptional link to an HrbpScope (normalized scope definition).
  • all_access booleanUnrestricted (admin-equivalent) scope — request passes through verbatim.
  • leaders arrayLeader employee IDs in scope.
    Leader employee IDs in scope.

    array of:

    string

  • departments arrayDepartments in scope.
    Departments in scope.

    array of:

    string

  • locations arrayHierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).
    Hierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).

    array of:

    string

  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

HrbpScopeAssignment

  • id string
  • user string requiredUser (email/employee id) this scope grants visibility to.
  • scope_type string
  • scope_id stringOptional link to an HrbpScope (normalized scope definition).
  • all_access booleanUnrestricted (admin-equivalent) scope — request passes through verbatim.
  • leaders arrayLeader employee IDs in scope.
    Leader employee IDs in scope.

    array of:

    string

  • departments arrayDepartments in scope.
    Departments in scope.

    array of:

    string

  • locations arrayHierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).
    Hierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).

    array of:

    string

  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/hrbp_scope_assignments/{id}

Get an HRBP scope assignment by id

Returns one grant: the user, the scope type/id it covers, whether it is all_access, and whether it is active.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

HrbpScopeAssignment

  • id string
  • user string requiredUser (email/employee id) this scope grants visibility to.
  • scope_type string
  • scope_id stringOptional link to an HrbpScope (normalized scope definition).
  • all_access booleanUnrestricted (admin-equivalent) scope — request passes through verbatim.
  • leaders arrayLeader employee IDs in scope.
    Leader employee IDs in scope.

    array of:

    string

  • departments arrayDepartments in scope.
    Departments in scope.

    array of:

    string

  • locations arrayHierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).
    Hierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).

    array of:

    string

  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/hrbp_scope_assignments/{id}

Revoke an HRBP scope assignment

DESTRUCTIVE and irreversible: removes the grant, so that HRBP loses access to the scope and their queries may start returning access_denied.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/hrbp_scope_assignments/{id}

Edit an HRBP scope assignment

Partial update of a grant (repoint the scope, toggle all_access or active). SECURITY-SENSITIVE - it changes what employee data that HRBP can see.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

HrbpScopeAssignment

  • id string
  • user string requiredUser (email/employee id) this scope grants visibility to.
  • scope_type string
  • scope_id stringOptional link to an HrbpScope (normalized scope definition).
  • all_access booleanUnrestricted (admin-equivalent) scope — request passes through verbatim.
  • leaders arrayLeader employee IDs in scope.
    Leader employee IDs in scope.

    array of:

    string

  • departments arrayDepartments in scope.
    Departments in scope.

    array of:

    string

  • locations arrayHierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).
    Hierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).

    array of:

    string

  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

HrbpScopeAssignment

  • id string
  • user string requiredUser (email/employee id) this scope grants visibility to.
  • scope_type string
  • scope_id stringOptional link to an HrbpScope (normalized scope definition).
  • all_access booleanUnrestricted (admin-equivalent) scope — request passes through verbatim.
  • leaders arrayLeader employee IDs in scope.
    Leader employee IDs in scope.

    array of:

    string

  • departments arrayDepartments in scope.
    Departments in scope.

    array of:

    string

  • locations arrayHierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).
    Hierarchical geo scope: region / country / city tokens (a region token covers all its countries & cities).

    array of:

    string

  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/hrbp_scopes

List HRBP scopes (named population definitions)

An HRBP scope is a NAMED population of employees (e.g. 'R&D - AMS') whose membership is defined by its hrbp_scope_rules. Scopes are what scope assignments hand out to HRBP users. Use this to see which populations exist before assigning one. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    HrbpScope

    Named HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.
    • id string
    • name string required
    • description string
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/hrbp_scopes

Create an HRBP scope

Defines a new named population. It matches nobody until you add hrbp_scope_rules to it.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

HrbpScope

Named HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

HrbpScope

Named HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/hrbp_scopes/{id}

Get an HRBP scope by id

Returns one scope's name, description and active flag. Its membership criteria are the hrbp_scope_rules with this scope_id.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

HrbpScope

Named HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/hrbp_scopes/{id}

Delete an HRBP scope

DESTRUCTIVE and irreversible: removes the population definition. Its rules and any assignments pointing at it are left dangling, so HRBPs may lose access. Confirm with the user before calling.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/hrbp_scopes/{id}

Edit an HRBP scope

Partial update of a scope's name, description or active flag. Membership is changed by editing its rules, not here.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

HrbpScope

Named HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

HrbpScope

Named HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/hrbp_scope_rules

List HRBP scope membership rules

A scope rule is one membership clause of an HRBP scope: a dimension (department, location, leader, ...) and the value that must match. Rules combine to define who the parent scope covers. Filter by scope_id to read one population's definition. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    HrbpScopeRule

    A single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).
    • id string
    • scope_id string requiredParent HrbpScope id.
    • dimension string requiredGeo dimensions (location/region/country/city) all feed the hierarchical location scope.
    • value stringThe in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/hrbp_scope_rules

Add a membership rule to an HRBP scope

Adds a dimension/value clause to the scope given by scope_id, widening or narrowing who that population covers. SECURITY-SENSITIVE: it changes what data the scope's HRBPs can reach.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

HrbpScopeRule

A single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).
  • id string
  • scope_id string requiredParent HrbpScope id.
  • dimension string requiredGeo dimensions (location/region/country/city) all feed the hierarchical location scope.
  • value stringThe in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

HrbpScopeRule

A single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).
  • id string
  • scope_id string requiredParent HrbpScope id.
  • dimension string requiredGeo dimensions (location/region/country/city) all feed the hierarchical location scope.
  • value stringThe in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/hrbp_scope_rules/{id}

Get an HRBP scope rule by id

Returns one membership clause: its parent scope, the dimension it matches on, and the value.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

HrbpScopeRule

A single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).
  • id string
  • scope_id string requiredParent HrbpScope id.
  • dimension string requiredGeo dimensions (location/region/country/city) all feed the hierarchical location scope.
  • value stringThe in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/hrbp_scope_rules/{id}

Delete an HRBP scope rule

DESTRUCTIVE and irreversible: removes a membership clause, shrinking (or, if it was the last exclusion, widening) the parent scope.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/hrbp_scope_rules/{id}

Edit an HRBP scope rule

Partial update of a clause's dimension, value or active flag. SECURITY-SENSITIVE - it silently changes the population an HRBP can see.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

HrbpScopeRule

A single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).
  • id string
  • scope_id string requiredParent HrbpScope id.
  • dimension string requiredGeo dimensions (location/region/country/city) all feed the hierarchical location scope.
  • value stringThe in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

HrbpScopeRule

A single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).
  • id string
  • scope_id string requiredParent HrbpScope id.
  • dimension string requiredGeo dimensions (location/region/country/city) all feed the hierarchical location scope.
  • value stringThe in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/snapshot_groups

List snapshot capture batches

A snapshot group is one capture run - a named, timestamped batch (e.g. 'March 2026 workforce snapshot') that the individual snapshot records hang off via group_id. Use this to find which capture runs exist, then read snapshots for the values. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    SnapshotGroup

    Groups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).
    • id string
    • name string required
    • captured_at string
    • source string
    • note string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/snapshot_groups

Create a snapshot capture batch

Opens a named, timestamped batch that snapshot records can be filed under. It captures no metrics by itself.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

SnapshotGroup

Groups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).
  • id string
  • name string required
  • captured_at string
  • source string
  • note string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

SnapshotGroup

Groups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).
  • id string
  • name string required
  • captured_at string
  • source string
  • note string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/snapshot_groups/{id}

Get a snapshot capture batch by id

Returns one batch's name, capture timestamp, source and note. The metric values are the snapshots carrying this group_id.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

SnapshotGroup

Groups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).
  • id string
  • name string required
  • captured_at string
  • source string
  • note string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/snapshot_groups/{id}

Delete a snapshot capture batch

DESTRUCTIVE and irreversible: removes the batch header. Its snapshots survive but lose their grouping.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/snapshot_groups/{id}

Edit a snapshot capture batch

Partial update of a batch's name, note or source. Does not change the snapshot values inside it.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

SnapshotGroup

Groups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).
  • id string
  • name string required
  • captured_at string
  • source string
  • note string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

SnapshotGroup

Groups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).
  • id string
  • name string required
  • captured_at string
  • source string
  • note string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/metric_sources

List metric data sources

A metric source is a registered system that talent metrics can be computed from (e.g. 'local' = Purple HRIS). Small reference table: it records where numbers come from, not the numbers themselves. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    MetricSource

    A system a metric value can originate from (SN sn_talent_pulse_metric_source).
    • id string
    • key string required
    • name string required
    • description string
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/metric_sources

Register a metric data source

Adds a source system that snapshots and metric computations can attribute to. Administrative configuration.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

MetricSource

A system a metric value can originate from (SN sn_talent_pulse_metric_source).
  • id string
  • key string required
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

MetricSource

A system a metric value can originate from (SN sn_talent_pulse_metric_source).
  • id string
  • key string required
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/metric_sources/{id}

Get a metric data source by id

Returns one registered source: its key, display name and active flag.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

MetricSource

A system a metric value can originate from (SN sn_talent_pulse_metric_source).
  • id string
  • key string required
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/metric_sources/{id}

Delete a metric data source

DESTRUCTIVE and irreversible: removes the source registration. Snapshots that referenced it keep the key but it no longer resolves.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/metric_sources/{id}

Edit a metric data source

Partial update of a source's name, description or active flag.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

MetricSource

A system a metric value can originate from (SN sn_talent_pulse_metric_source).
  • id string
  • key string required
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

MetricSource

A system a metric value can originate from (SN sn_talent_pulse_metric_source).
  • id string
  • key string required
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/employee_relations

List employee relations (ER) cases

An ER case is an HR investigation or performance-management record about one subject_person: short description, state, priority, the HR rep who opened it and the investigator assigned, due/closed dates, plus PIP fields (start/end, improvement areas, outcome). SENSITIVE HR data, and separate from the talent-review side of this app. Allegations and involved parties are child records keyed by employee_relation_id. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, ... because $ is not a legal tool-input key).

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    EmployeeRelation

    Employee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).
    • id string
    • number string
    • subject_person string requiredEmployee ID the case concerns.
    • short_description string required
    • description string
    • state string
    • priority stringSN 1-Critical/2-High/3-Moderate/4-Low.
    • opened_by stringEmployee ID of the HR rep who opened the case.
    • assigned_to stringEmployee ID of the assigned HR investigator.
    • hr_service string
    • opened_at string
    • due_date string
    • closed_at string
    • active boolean
    • incident_date stringDate of most recent incident.
    • external_opened_for booleanOpened for is not a User.
    • locked booleanRestricting access limits who can view/edit the case.
    • preferred_contact_method string
    • reported_date string
    • pip_start_date string
    • pip_end_date string
    • pip_improvement_areas string
    • pip_rationale string
    • pip_successful string
    • pip_extended string
    • pip_extension_date string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/employee_relations

Open an employee relations (ER) case

Creates an investigation / performance-management case about an employee. SENSITIVE: it starts a formal HR record about a named person - confirm with the user before calling.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

EmployeeRelation

Employee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).
  • id string
  • number string
  • subject_person string requiredEmployee ID the case concerns.
  • short_description string required
  • description string
  • state string
  • priority stringSN 1-Critical/2-High/3-Moderate/4-Low.
  • opened_by stringEmployee ID of the HR rep who opened the case.
  • assigned_to stringEmployee ID of the assigned HR investigator.
  • hr_service string
  • opened_at string
  • due_date string
  • closed_at string
  • active boolean
  • incident_date stringDate of most recent incident.
  • external_opened_for booleanOpened for is not a User.
  • locked booleanRestricting access limits who can view/edit the case.
  • preferred_contact_method string
  • reported_date string
  • pip_start_date string
  • pip_end_date string
  • pip_improvement_areas string
  • pip_rationale string
  • pip_successful string
  • pip_extended string
  • pip_extension_date string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

EmployeeRelation

Employee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).
  • id string
  • number string
  • subject_person string requiredEmployee ID the case concerns.
  • short_description string required
  • description string
  • state string
  • priority stringSN 1-Critical/2-High/3-Moderate/4-Low.
  • opened_by stringEmployee ID of the HR rep who opened the case.
  • assigned_to stringEmployee ID of the assigned HR investigator.
  • hr_service string
  • opened_at string
  • due_date string
  • closed_at string
  • active boolean
  • incident_date stringDate of most recent incident.
  • external_opened_for booleanOpened for is not a User.
  • locked booleanRestricting access limits who can view/edit the case.
  • preferred_contact_method string
  • reported_date string
  • pip_start_date string
  • pip_end_date string
  • pip_improvement_areas string
  • pip_rationale string
  • pip_successful string
  • pip_extended string
  • pip_extension_date string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/employee_relations/{id}

Get an employee relations (ER) case by id

Returns one case with its state, priority, assignment, dates and PIP details. SENSITIVE HR content; a locked case restricts who may read it.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

EmployeeRelation

Employee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).
  • id string
  • number string
  • subject_person string requiredEmployee ID the case concerns.
  • short_description string required
  • description string
  • state string
  • priority stringSN 1-Critical/2-High/3-Moderate/4-Low.
  • opened_by stringEmployee ID of the HR rep who opened the case.
  • assigned_to stringEmployee ID of the assigned HR investigator.
  • hr_service string
  • opened_at string
  • due_date string
  • closed_at string
  • active boolean
  • incident_date stringDate of most recent incident.
  • external_opened_for booleanOpened for is not a User.
  • locked booleanRestricting access limits who can view/edit the case.
  • preferred_contact_method string
  • reported_date string
  • pip_start_date string
  • pip_end_date string
  • pip_improvement_areas string
  • pip_rationale string
  • pip_successful string
  • pip_extended string
  • pip_extension_date string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/employee_relations/{id}

Delete an employee relations (ER) case

DESTRUCTIVE and irreversible: erases the investigation record and its audit trail, and orphans its allegations and involved parties. Prefer closing the case (state) over deleting it.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/employee_relations/{id}

Edit an employee relations (ER) case

Partial update of a case - reassign the investigator, change state or priority, close it, or record PIP progress and outcome. SENSITIVE HR record.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

EmployeeRelation

Employee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).
  • id string
  • number string
  • subject_person string requiredEmployee ID the case concerns.
  • short_description string required
  • description string
  • state string
  • priority stringSN 1-Critical/2-High/3-Moderate/4-Low.
  • opened_by stringEmployee ID of the HR rep who opened the case.
  • assigned_to stringEmployee ID of the assigned HR investigator.
  • hr_service string
  • opened_at string
  • due_date string
  • closed_at string
  • active boolean
  • incident_date stringDate of most recent incident.
  • external_opened_for booleanOpened for is not a User.
  • locked booleanRestricting access limits who can view/edit the case.
  • preferred_contact_method string
  • reported_date string
  • pip_start_date string
  • pip_end_date string
  • pip_improvement_areas string
  • pip_rationale string
  • pip_successful string
  • pip_extended string
  • pip_extension_date string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

EmployeeRelation

Employee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).
  • id string
  • number string
  • subject_person string requiredEmployee ID the case concerns.
  • short_description string required
  • description string
  • state string
  • priority stringSN 1-Critical/2-High/3-Moderate/4-Low.
  • opened_by stringEmployee ID of the HR rep who opened the case.
  • assigned_to stringEmployee ID of the assigned HR investigator.
  • hr_service string
  • opened_at string
  • due_date string
  • closed_at string
  • active boolean
  • incident_date stringDate of most recent incident.
  • external_opened_for booleanOpened for is not a User.
  • locked booleanRestricting access limits who can view/edit the case.
  • preferred_contact_method string
  • reported_date string
  • pip_start_date string
  • pip_end_date string
  • pip_improvement_areas string
  • pip_rationale string
  • pip_successful string
  • pip_extended string
  • pip_extension_date string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/allegation_types

List allegation types

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    AllegationType

    Allegation type reference catalog (SN sn_hr_er_allegation_type).
    • id string
    • name string required
    • description string
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/allegation_types

Create allegation type

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

AllegationType

Allegation type reference catalog (SN sn_hr_er_allegation_type).
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

AllegationType

Allegation type reference catalog (SN sn_hr_er_allegation_type).
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/allegation_types/{id}

Get allegation type

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

AllegationType

Allegation type reference catalog (SN sn_hr_er_allegation_type).
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/allegation_types/{id}

Delete allegation type

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/allegation_types/{id}

Update allegation type

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

AllegationType

Allegation type reference catalog (SN sn_hr_er_allegation_type).
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

AllegationType

Allegation type reference catalog (SN sn_hr_er_allegation_type).
  • id string
  • name string required
  • description string
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/allegation_subtypes

List allegation subtypes

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    AllegationSubtype

    Allegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).
    • id string
    • allegation_type_id string required
    • name string required
    • active boolean
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/allegation_subtypes

Create allegation subtype

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

AllegationSubtype

Allegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).
  • id string
  • allegation_type_id string required
  • name string required
  • active boolean
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

AllegationSubtype

Allegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).
  • id string
  • allegation_type_id string required
  • name string required
  • active boolean
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/allegation_subtypes/{id}

Get allegation subtype

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

AllegationSubtype

Allegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).
  • id string
  • allegation_type_id string required
  • name string required
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/allegation_subtypes/{id}

Delete allegation subtype

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/allegation_subtypes/{id}

Update allegation subtype

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

AllegationSubtype

Allegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).
  • id string
  • allegation_type_id string required
  • name string required
  • active boolean
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

AllegationSubtype

Allegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).
  • id string
  • allegation_type_id string required
  • name string required
  • active boolean
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/allegations

List allegations

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    Allegation

    One allegation filed on an ER case (SN sn_hr_er_allegation).
    • id string
    • employee_relation_id string required
    • allegation_type_id string required
    • allegation_subtype_id string required
    • description string
    • subjects_of_allegation stringDerived: names of the case's 'respondent' involved parties.
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/allegations

Create allegation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Allegation

One allegation filed on an ER case (SN sn_hr_er_allegation).
  • id string
  • employee_relation_id string required
  • allegation_type_id string required
  • allegation_subtype_id string required
  • description string
  • subjects_of_allegation stringDerived: names of the case's 'respondent' involved parties.
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Allegation

One allegation filed on an ER case (SN sn_hr_er_allegation).
  • id string
  • employee_relation_id string required
  • allegation_type_id string required
  • allegation_subtype_id string required
  • description string
  • subjects_of_allegation stringDerived: names of the case's 'respondent' involved parties.
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/allegations/{id}

Get allegation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Allegation

One allegation filed on an ER case (SN sn_hr_er_allegation).
  • id string
  • employee_relation_id string required
  • allegation_type_id string required
  • allegation_subtype_id string required
  • description string
  • subjects_of_allegation stringDerived: names of the case's 'respondent' involved parties.
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/allegations/{id}

Delete allegation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/allegations/{id}

Update allegation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Allegation

One allegation filed on an ER case (SN sn_hr_er_allegation).
  • id string
  • employee_relation_id string required
  • allegation_type_id string required
  • allegation_subtype_id string required
  • description string
  • subjects_of_allegation stringDerived: names of the case's 'respondent' involved parties.
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Allegation

One allegation filed on an ER case (SN sn_hr_er_allegation).
  • id string
  • employee_relation_id string required
  • allegation_type_id string required
  • allegation_subtype_id string required
  • description string
  • subjects_of_allegation stringDerived: names of the case's 'respondent' involved parties.
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/hrbp/involved_parties

List involved parties

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
limitqueryintegernoLegacy page size (default 50). Prefer $top. Ignored when $top/$skip are used.
cursorquerystringnoLegacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top.
$filterquerystringnoOData filter expression. Comparison operators: eq, ne, gt, ge, lt, le. Logical: and, or, not, with parentheses for grouping. String functions: contains(field,'x'), startswith(field,'x'), endswith(field,'x'). Membership: field in ('a','b'). Case-insensitive matching via tolower(field) / toupper(field). Nested fields use a slash, e.g. pto_balance/vacation_days. String literals use single quotes; dates are ISO-8601. Examples: "status eq 'active'"; "salary gt 50000 and department eq 'Engineering'"; "contains(tolower(name),'acme')"; "closeDate gt 2026-01-01".
$selectquerystringnoComma-separated list of fields to return, e.g. "id,firstName,email". Nested fields via slash ("pto_balance/vacation_days"). The id field is always included.
$orderbyquerystringnoSort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last.
$searchquerystringnoFree-text, case-insensitive substring match across the resource's searchable fields.
$topqueryintegernoMaximum number of items to return (page size).
$skipqueryintegernoNumber of matching items to skip before returning results (offset paging). Combine with $top.
$countquerybooleannoWhen true, include @odata.count (total matches after $filter/$search, before paging) in the response.

Responses

200
Paginated list

application/json

  • data array

    array of:

    InvolvedParty

    A complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).
    • id string
    • employee_relation_id string required
    • employee_id stringEmployee ID, if the party has a User record.
    • not_in_system booleanInvolved party does not have a User record.
    • name stringName/description, used when not_in_system (or no employee_id).
    • display_name stringDerived: the linked employee's name, else name.
    • type string required
    • correlation_id string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/hrbp/involved_parties

Create involved party

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

InvolvedParty

A complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).
  • id string
  • employee_relation_id string required
  • employee_id stringEmployee ID, if the party has a User record.
  • not_in_system booleanInvolved party does not have a User record.
  • name stringName/description, used when not_in_system (or no employee_id).
  • display_name stringDerived: the linked employee's name, else name.
  • type string required
  • correlation_id string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

InvolvedParty

A complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).
  • id string
  • employee_relation_id string required
  • employee_id stringEmployee ID, if the party has a User record.
  • not_in_system booleanInvolved party does not have a User record.
  • name stringName/description, used when not_in_system (or no employee_id).
  • display_name stringDerived: the linked employee's name, else name.
  • type string required
  • correlation_id string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/hrbp/involved_parties/{id}

Get involved party

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

InvolvedParty

A complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).
  • id string
  • employee_relation_id string required
  • employee_id stringEmployee ID, if the party has a User record.
  • not_in_system booleanInvolved party does not have a User record.
  • name stringName/description, used when not_in_system (or no employee_id).
  • display_name stringDerived: the linked employee's name, else name.
  • type string required
  • correlation_id string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/hrbp/involved_parties/{id}

Delete involved party

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/hrbp/involved_parties/{id}

Update involved party

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

InvolvedParty

A complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).
  • id string
  • employee_relation_id string required
  • employee_id stringEmployee ID, if the party has a User record.
  • not_in_system booleanInvolved party does not have a User record.
  • name stringName/description, used when not_in_system (or no employee_id).
  • display_name stringDerived: the linked employee's name, else name.
  • type string required
  • correlation_id string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

InvolvedParty

A complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).
  • id string
  • employee_relation_id string required
  • employee_id stringEmployee ID, if the party has a User record.
  • not_in_system booleanInvolved party does not have a User record.
  • name stringName/description, used when not_in_system (or no employee_id).
  • display_name stringDerived: the linked employee's name, else name.
  • type string required
  • correlation_id string
  • createdAt string
  • updatedAt string
404
Not found