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
Endpoints
POST /api/purple-suite/hrbp/resolve_filters
Resolve & validate HRBP scope filters (tp_resolve_scope)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Responses
200- List predefined talent metrics (tp_list_metrics)
400- Bad request
GET /api/purple-suite/hrbp/available_metric_categories
List metric categories
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Responses
200- List metric categories
400- Bad request
POST /api/purple-suite/hrbp/execute_known_metric
Compute one predefined metric (tp_execute_metric)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
method | query | string | no | fullPipeline needs {utterance, channelId}; insightsOnly needs {channelId} plus dataConfigurations or dataResponses; custom needs {featureFlags}; getAsyncResults needs {logId}. |
seed | query | string | no | Pin the simulated model output so a run is reproducible. Omit for fresh phrasing on every call (the underlying numbers never change). |
readyDelayMs | query | integer | no | How 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
logIds | query | string | no | Comma-separated log ids. |
logId | query | string | no | A 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
tableName | query | string | yes | |
columnName | query | string | yes | |
rawValue | query | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sys_id_csv | path | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
start_date | query | string | no | |
end_date | query | string | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sys_id | path | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sys_id | path | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sys_id | path | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sys_id | path | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sysparm_query | query | string | no | |
sysparm_fields | query | string | no | |
sysparm_limit | query | integer | no | |
sysparm_offset | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
sysparm_query | query | string | no | |
sysparm_fields | query | string | no | |
sysparm_limit | query | integer | no | |
sysparm_offset | query | integer | no |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
manager_sys_id | query | string | no | |
page_number | query | integer | no |
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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
TalentReviewidstringnumberstringnamestring requiredstatestring — Lifecycle (forward-only; SN label 'In Progress' → 'in_progress').period_startstringperiod_endstringleadersarray — Employee IDs leading this review (SN leaders→sys_user).Employee IDs leading this review (SN leaders→sys_user).array of:
string
departmentsarray — Department names in scope.Department names in scope.array of:
string
locationsarray — Locations in scope.Locations in scope.array of:
string
template_idstringobjectivesstring — Review objective(s) (e.g. 'Identify retention risks in high-growth hubs').metricsarray — Metrics attached to the review.Metrics attached to the review.array of:
metric_idstringgroup_bystringaggregationstringorderintegerinsightsstring
activebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
TalentReview
idstringnumberstringnamestring requiredstatestring — Lifecycle (forward-only; SN label 'In Progress' → 'in_progress').period_startstringperiod_endstringleadersarray — Employee IDs leading this review (SN leaders→sys_user).Employee IDs leading this review (SN leaders→sys_user).array of:
string
departmentsarray — Department names in scope.Department names in scope.array of:
string
locationsarray — Locations in scope.Locations in scope.array of:
string
template_idstringobjectivesstring — Review objective(s) (e.g. 'Identify retention risks in high-growth hubs').metricsarray — Metrics attached to the review.Metrics attached to the review.array of:
metric_idstringgroup_bystringaggregationstringorderintegerinsightsstring
activebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonTalentReviewidstringnumberstringnamestring requiredstatestring — Lifecycle (forward-only; SN label 'In Progress' → 'in_progress').period_startstringperiod_endstringleadersarray — Employee IDs leading this review (SN leaders→sys_user).Employee IDs leading this review (SN leaders→sys_user).array of:
string
departmentsarray — Department names in scope.Department names in scope.array of:
string
locationsarray — Locations in scope.Locations in scope.array of:
string
template_idstringobjectivesstring — Review objective(s) (e.g. 'Identify retention risks in high-growth hubs').metricsarray — Metrics attached to the review.Metrics attached to the review.array of:
metric_idstringgroup_bystringaggregationstringorderintegerinsightsstring
activebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/talent_reviews/{id}
Get a talent review by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonTalentReviewidstringnumberstringnamestring requiredstatestring — Lifecycle (forward-only; SN label 'In Progress' → 'in_progress').period_startstringperiod_endstringleadersarray — Employee IDs leading this review (SN leaders→sys_user).Employee IDs leading this review (SN leaders→sys_user).array of:
string
departmentsarray — Department names in scope.Department names in scope.array of:
string
locationsarray — Locations in scope.Locations in scope.array of:
string
template_idstringobjectivesstring — Review objective(s) (e.g. 'Identify retention risks in high-growth hubs').metricsarray — Metrics attached to the review.Metrics attached to the review.array of:
metric_idstringgroup_bystringaggregationstringorderintegerinsightsstring
activebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/talent_reviews/{id}
Delete a talent review
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/talent_reviews/{id}
Edit a talent review record
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
TalentReview
idstringnumberstringnamestring requiredstatestring — Lifecycle (forward-only; SN label 'In Progress' → 'in_progress').period_startstringperiod_endstringleadersarray — Employee IDs leading this review (SN leaders→sys_user).Employee IDs leading this review (SN leaders→sys_user).array of:
string
departmentsarray — Department names in scope.Department names in scope.array of:
string
locationsarray — Locations in scope.Locations in scope.array of:
string
template_idstringobjectivesstring — Review objective(s) (e.g. 'Identify retention risks in high-growth hubs').metricsarray — Metrics attached to the review.Metrics attached to the review.array of:
metric_idstringgroup_bystringaggregationstringorderintegerinsightsstring
activebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonTalentReviewidstringnumberstringnamestring requiredstatestring — Lifecycle (forward-only; SN label 'In Progress' → 'in_progress').period_startstringperiod_endstringleadersarray — Employee IDs leading this review (SN leaders→sys_user).Employee IDs leading this review (SN leaders→sys_user).array of:
string
departmentsarray — Department names in scope.Department names in scope.array of:
string
locationsarray — Locations in scope.Locations in scope.array of:
string
template_idstringobjectivesstring — Review objective(s) (e.g. 'Identify retention risks in high-growth hubs').metricsarray — Metrics attached to the review.Metrics attached to the review.array of:
metric_idstringgroup_bystringaggregationstringorderintegerinsightsstring
activebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/employee_assessments
List 9-box employee assessments
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
EmployeeAssessmentidstringemployee_idstring requiredtalent_review_idstringassessment_datestringcyclestringperformance_ratinginteger — 1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).performance_bandstring — Derived band (excellent/good/average/needs_improvement/poor).potentialstring — SN 10/20/30 or High/Medium/Low.achievable_levelstring — SN 10/20/30 or '1/2/3 Levels'.flight_riskstring — Stored (not derived) per SN assessment.replacement_readinessstring — SN 0/3/6/12.boxinteger — Derived 9-box cell (potential × performance).core_competenciesstringdevelopment_needsstringcreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
EmployeeAssessment
idstringemployee_idstring requiredtalent_review_idstringassessment_datestringcyclestringperformance_ratinginteger — 1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).performance_bandstring — Derived band (excellent/good/average/needs_improvement/poor).potentialstring — SN 10/20/30 or High/Medium/Low.achievable_levelstring — SN 10/20/30 or '1/2/3 Levels'.flight_riskstring — Stored (not derived) per SN assessment.replacement_readinessstring — SN 0/3/6/12.boxinteger — Derived 9-box cell (potential × performance).core_competenciesstringdevelopment_needsstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonEmployeeAssessmentidstringemployee_idstring requiredtalent_review_idstringassessment_datestringcyclestringperformance_ratinginteger — 1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).performance_bandstring — Derived band (excellent/good/average/needs_improvement/poor).potentialstring — SN 10/20/30 or High/Medium/Low.achievable_levelstring — SN 10/20/30 or '1/2/3 Levels'.flight_riskstring — Stored (not derived) per SN assessment.replacement_readinessstring — SN 0/3/6/12.boxinteger — Derived 9-box cell (potential × performance).core_competenciesstringdevelopment_needsstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/employee_assessments/{id}
Get an employee assessment by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonEmployeeAssessmentidstringemployee_idstring requiredtalent_review_idstringassessment_datestringcyclestringperformance_ratinginteger — 1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).performance_bandstring — Derived band (excellent/good/average/needs_improvement/poor).potentialstring — SN 10/20/30 or High/Medium/Low.achievable_levelstring — SN 10/20/30 or '1/2/3 Levels'.flight_riskstring — Stored (not derived) per SN assessment.replacement_readinessstring — SN 0/3/6/12.boxinteger — Derived 9-box cell (potential × performance).core_competenciesstringdevelopment_needsstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/employee_assessments/{id}
Delete an employee assessment
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/employee_assessments/{id}
Edit an employee assessment
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
EmployeeAssessment
idstringemployee_idstring requiredtalent_review_idstringassessment_datestringcyclestringperformance_ratinginteger — 1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).performance_bandstring — Derived band (excellent/good/average/needs_improvement/poor).potentialstring — SN 10/20/30 or High/Medium/Low.achievable_levelstring — SN 10/20/30 or '1/2/3 Levels'.flight_riskstring — Stored (not derived) per SN assessment.replacement_readinessstring — SN 0/3/6/12.boxinteger — Derived 9-box cell (potential × performance).core_competenciesstringdevelopment_needsstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonEmployeeAssessmentidstringemployee_idstring requiredtalent_review_idstringassessment_datestringcyclestringperformance_ratinginteger — 1–5 (SN current_performance_level 10–50 / current_rating 30/40/50).performance_bandstring — Derived band (excellent/good/average/needs_improvement/poor).potentialstring — SN 10/20/30 or High/Medium/Low.achievable_levelstring — SN 10/20/30 or '1/2/3 Levels'.flight_riskstring — Stored (not derived) per SN assessment.replacement_readinessstring — SN 0/3/6/12.boxinteger — Derived 9-box cell (potential × performance).core_competenciesstringdevelopment_needsstringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/performance_reviews
List performance review ratings
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
PerformanceReviewidstringemployee_idstring requiredreview_start_datestringreview_end_datestringrating_managernumberrating_employeenumberassessed_onstringcreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
PerformanceReview
idstringemployee_idstring requiredreview_start_datestringreview_end_datestringrating_managernumberrating_employeenumberassessed_onstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonPerformanceReviewidstringemployee_idstring requiredreview_start_datestringreview_end_datestringrating_managernumberrating_employeenumberassessed_onstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/performance_reviews/{id}
Get a performance review rating by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonPerformanceReviewidstringemployee_idstring requiredreview_start_datestringreview_end_datestringrating_managernumberrating_employeenumberassessed_onstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/performance_reviews/{id}
Delete a performance review rating
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/performance_reviews/{id}
Edit a performance review rating
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
PerformanceReview
idstringemployee_idstring requiredreview_start_datestringreview_end_datestringrating_managernumberrating_employeenumberassessed_onstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonPerformanceReviewidstringemployee_idstring requiredreview_start_datestringreview_end_datestringrating_managernumberrating_employeenumberassessed_onstringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/succession_plans
List succession plans for critical roles
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
SuccessionPlanidstringnumberstringtitlestring requiredincumbent_employee_idstringjob_titlestringdepartmentstringplanned_retirement_datestringcriticalitystring — SN demo low/medium/high.loss_impactstring — SN High/Intermediate→medium/Low.retention_riskstringsuccess_profileobject — Role mission/skills/qualifications (SN JSON).successor_countintegerexternal_idstringactivebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
SuccessionPlan
idstringnumberstringtitlestring requiredincumbent_employee_idstringjob_titlestringdepartmentstringplanned_retirement_datestringcriticalitystring — SN demo low/medium/high.loss_impactstring — SN High/Intermediate→medium/Low.retention_riskstringsuccess_profileobject — Role mission/skills/qualifications (SN JSON).successor_countintegerexternal_idstringactivebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonSuccessionPlanidstringnumberstringtitlestring requiredincumbent_employee_idstringjob_titlestringdepartmentstringplanned_retirement_datestringcriticalitystring — SN demo low/medium/high.loss_impactstring — SN High/Intermediate→medium/Low.retention_riskstringsuccess_profileobject — Role mission/skills/qualifications (SN JSON).successor_countintegerexternal_idstringactivebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/succession_plans/{id}
Get a succession plan by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonSuccessionPlanidstringnumberstringtitlestring requiredincumbent_employee_idstringjob_titlestringdepartmentstringplanned_retirement_datestringcriticalitystring — SN demo low/medium/high.loss_impactstring — SN High/Intermediate→medium/Low.retention_riskstringsuccess_profileobject — Role mission/skills/qualifications (SN JSON).successor_countintegerexternal_idstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/succession_plans/{id}
Delete a succession plan
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/succession_plans/{id}
Edit a succession plan
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
SuccessionPlan
idstringnumberstringtitlestring requiredincumbent_employee_idstringjob_titlestringdepartmentstringplanned_retirement_datestringcriticalitystring — SN demo low/medium/high.loss_impactstring — SN High/Intermediate→medium/Low.retention_riskstringsuccess_profileobject — Role mission/skills/qualifications (SN JSON).successor_countintegerexternal_idstringactivebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonSuccessionPlanidstringnumberstringtitlestring requiredincumbent_employee_idstringjob_titlestringdepartmentstringplanned_retirement_datestringcriticalitystring — SN demo low/medium/high.loss_impactstring — SN High/Intermediate→medium/Low.retention_riskstringsuccess_profileobject — Role mission/skills/qualifications (SN JSON).successor_countintegerexternal_idstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/successors
List succession candidates
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
Successoridstringsuccession_plan_idstring requiredcandidate_employee_idstring requiredtop_candidatebooleanreadinessstring — SN 0/3/6/12 or 'Ready in …' (9 months→6m).potentialstringachievable_levelstringcurrent_ratingstring — Banded (SN '4 - Exceeds Expectations').educationstringskillsstring — Comma-separated.job_history_companiesstringpromotion_readinessstringdevelopment_areasstringmatching_scoreintegercandidate_profileobject — Per-dimension match scores (SN JSON).temporary_fillbooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Successor
idstringsuccession_plan_idstring requiredcandidate_employee_idstring requiredtop_candidatebooleanreadinessstring — SN 0/3/6/12 or 'Ready in …' (9 months→6m).potentialstringachievable_levelstringcurrent_ratingstring — Banded (SN '4 - Exceeds Expectations').educationstringskillsstring — Comma-separated.job_history_companiesstringpromotion_readinessstringdevelopment_areasstringmatching_scoreintegercandidate_profileobject — Per-dimension match scores (SN JSON).temporary_fillbooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonSuccessoridstringsuccession_plan_idstring requiredcandidate_employee_idstring requiredtop_candidatebooleanreadinessstring — SN 0/3/6/12 or 'Ready in …' (9 months→6m).potentialstringachievable_levelstringcurrent_ratingstring — Banded (SN '4 - Exceeds Expectations').educationstringskillsstring — Comma-separated.job_history_companiesstringpromotion_readinessstringdevelopment_areasstringmatching_scoreintegercandidate_profileobject — Per-dimension match scores (SN JSON).temporary_fillbooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/successors/{id}
Get a succession candidate by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonSuccessoridstringsuccession_plan_idstring requiredcandidate_employee_idstring requiredtop_candidatebooleanreadinessstring — SN 0/3/6/12 or 'Ready in …' (9 months→6m).potentialstringachievable_levelstringcurrent_ratingstring — Banded (SN '4 - Exceeds Expectations').educationstringskillsstring — Comma-separated.job_history_companiesstringpromotion_readinessstringdevelopment_areasstringmatching_scoreintegercandidate_profileobject — Per-dimension match scores (SN JSON).temporary_fillbooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/successors/{id}
Remove a candidate from a succession plan
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/successors/{id}
Edit a succession candidate
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Successor
idstringsuccession_plan_idstring requiredcandidate_employee_idstring requiredtop_candidatebooleanreadinessstring — SN 0/3/6/12 or 'Ready in …' (9 months→6m).potentialstringachievable_levelstringcurrent_ratingstring — Banded (SN '4 - Exceeds Expectations').educationstringskillsstring — Comma-separated.job_history_companiesstringpromotion_readinessstringdevelopment_areasstringmatching_scoreintegercandidate_profileobject — Per-dimension match scores (SN JSON).temporary_fillbooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonSuccessoridstringsuccession_plan_idstring requiredcandidate_employee_idstring requiredtop_candidatebooleanreadinessstring — SN 0/3/6/12 or 'Ready in …' (9 months→6m).potentialstringachievable_levelstringcurrent_ratingstring — Banded (SN '4 - Exceeds Expectations').educationstringskillsstring — Comma-separated.job_history_companiesstringpromotion_readinessstringdevelopment_areasstringmatching_scoreintegercandidate_profileobject — Per-dimension match scores (SN JSON).temporary_fillbooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/snapshots
List captured metric snapshots
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
Snapshotidstringmetric_idstring requiredgroup_idstring — Batch grouping key.sourcestringvalueobject required — Computed metric value as JSON (per group).timestampstringcreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Snapshot
idstringmetric_idstring requiredgroup_idstring — Batch grouping key.sourcestringvalueobject required — Computed metric value as JSON (per group).timestampstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonSnapshotidstringmetric_idstring requiredgroup_idstring — Batch grouping key.sourcestringvalueobject required — Computed metric value as JSON (per group).timestampstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/snapshots/{id}
Get a metric snapshot by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonSnapshotidstringmetric_idstring requiredgroup_idstring — Batch grouping key.sourcestringvalueobject required — Computed metric value as JSON (per group).timestampstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/snapshots/{id}
Delete a metric snapshot
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/snapshots/{id}
Edit a metric snapshot
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Snapshot
idstringmetric_idstring requiredgroup_idstring — Batch grouping key.sourcestringvalueobject required — Computed metric value as JSON (per group).timestampstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonSnapshotidstringmetric_idstring requiredgroup_idstring — Batch grouping key.sourcestringvalueobject required — Computed metric value as JSON (per group).timestampstringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/metric_goals
List metric goals (targets and thresholds)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
MetricGoalidstringnamestringtalent_review_idstringmetric_idstring requiredperiod_startstringperiod_endstringthreshold_valuenumbercomparison_typestringactivebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
MetricGoal
idstringnamestringtalent_review_idstringmetric_idstring requiredperiod_startstringperiod_endstringthreshold_valuenumbercomparison_typestringactivebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonMetricGoalidstringnamestringtalent_review_idstringmetric_idstring requiredperiod_startstringperiod_endstringthreshold_valuenumbercomparison_typestringactivebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/metric_goals/{id}
Get a metric goal by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonMetricGoalidstringnamestringtalent_review_idstringmetric_idstring requiredperiod_startstringperiod_endstringthreshold_valuenumbercomparison_typestringactivebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/metric_goals/{id}
Delete a metric goal
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/metric_goals/{id}
Edit a metric goal
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
MetricGoal
idstringnamestringtalent_review_idstringmetric_idstring requiredperiod_startstringperiod_endstringthreshold_valuenumbercomparison_typestringactivebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonMetricGoalidstringnamestringtalent_review_idstringmetric_idstring requiredperiod_startstringperiod_endstringthreshold_valuenumbercomparison_typestringactivebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/hrbp_scope_assignments
List HRBP scope assignments (who can see what)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
HrbpScopeAssignmentidstringuserstring required — User (email/employee id) this scope grants visibility to.scope_typestringscope_idstring — Optional link to an HrbpScope (normalized scope definition).all_accessboolean — Unrestricted (admin-equivalent) scope — request passes through verbatim.leadersarray — Leader employee IDs in scope.Leader employee IDs in scope.array of:
string
departmentsarray — Departments in scope.Departments in scope.array of:
string
locationsarray — Hierarchical 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
activebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
HrbpScopeAssignment
idstringuserstring required — User (email/employee id) this scope grants visibility to.scope_typestringscope_idstring — Optional link to an HrbpScope (normalized scope definition).all_accessboolean — Unrestricted (admin-equivalent) scope — request passes through verbatim.leadersarray — Leader employee IDs in scope.Leader employee IDs in scope.array of:
string
departmentsarray — Departments in scope.Departments in scope.array of:
string
locationsarray — Hierarchical 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
activebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonHrbpScopeAssignmentidstringuserstring required — User (email/employee id) this scope grants visibility to.scope_typestringscope_idstring — Optional link to an HrbpScope (normalized scope definition).all_accessboolean — Unrestricted (admin-equivalent) scope — request passes through verbatim.leadersarray — Leader employee IDs in scope.Leader employee IDs in scope.array of:
string
departmentsarray — Departments in scope.Departments in scope.array of:
string
locationsarray — Hierarchical 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
activebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/hrbp_scope_assignments/{id}
Get an HRBP scope assignment by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonHrbpScopeAssignmentidstringuserstring required — User (email/employee id) this scope grants visibility to.scope_typestringscope_idstring — Optional link to an HrbpScope (normalized scope definition).all_accessboolean — Unrestricted (admin-equivalent) scope — request passes through verbatim.leadersarray — Leader employee IDs in scope.Leader employee IDs in scope.array of:
string
departmentsarray — Departments in scope.Departments in scope.array of:
string
locationsarray — Hierarchical 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
activebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/hrbp_scope_assignments/{id}
Revoke an HRBP scope assignment
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/hrbp_scope_assignments/{id}
Edit an HRBP scope assignment
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
HrbpScopeAssignment
idstringuserstring required — User (email/employee id) this scope grants visibility to.scope_typestringscope_idstring — Optional link to an HrbpScope (normalized scope definition).all_accessboolean — Unrestricted (admin-equivalent) scope — request passes through verbatim.leadersarray — Leader employee IDs in scope.Leader employee IDs in scope.array of:
string
departmentsarray — Departments in scope.Departments in scope.array of:
string
locationsarray — Hierarchical 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
activebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonHrbpScopeAssignmentidstringuserstring required — User (email/employee id) this scope grants visibility to.scope_typestringscope_idstring — Optional link to an HrbpScope (normalized scope definition).all_accessboolean — Unrestricted (admin-equivalent) scope — request passes through verbatim.leadersarray — Leader employee IDs in scope.Leader employee IDs in scope.array of:
string
departmentsarray — Departments in scope.Departments in scope.array of:
string
locationsarray — Hierarchical 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
activebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/hrbp_scopes
List HRBP scopes (named population definitions)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
HrbpScopeNamed HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
HrbpScope
idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonHrbpScopeNamed HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/hrbp_scopes/{id}
Get an HRBP scope by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonHrbpScopeNamed HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/hrbp_scopes/{id}
Delete an HRBP scope
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/hrbp_scopes/{id}
Edit an HRBP scope
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
HrbpScope
idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonHrbpScopeNamed HRBP scope (SN sn_talent_pulse_hrbp_scope). Composed of HrbpScopeRule rows; assignments reference it by scope_id.idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/hrbp_scope_rules
List HRBP scope membership rules
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
HrbpScopeRuleA single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).idstringscope_idstring required — Parent HrbpScope id.dimensionstring required — Geo dimensions (location/region/country/city) all feed the hierarchical location scope.valuestring — The in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).activebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
HrbpScopeRule
idstringscope_idstring required — Parent HrbpScope id.dimensionstring required — Geo dimensions (location/region/country/city) all feed the hierarchical location scope.valuestring — The in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).activebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonHrbpScopeRuleA single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).idstringscope_idstring required — Parent HrbpScope id.dimensionstring required — Geo dimensions (location/region/country/city) all feed the hierarchical location scope.valuestring — The in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).activebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/hrbp_scope_rules/{id}
Get an HRBP scope rule by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonHrbpScopeRuleA single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).idstringscope_idstring required — Parent HrbpScope id.dimensionstring required — Geo dimensions (location/region/country/city) all feed the hierarchical location scope.valuestring — The in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).activebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/hrbp_scope_rules/{id}
Delete an HRBP scope rule
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/hrbp_scope_rules/{id}
Edit an HRBP scope rule
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
HrbpScopeRule
idstringscope_idstring required — Parent HrbpScope id.dimensionstring required — Geo dimensions (location/region/country/city) all feed the hierarchical location scope.valuestring — The in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).activebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonHrbpScopeRuleA single dimension rule within an HrbpScope (SN sn_talent_pulse_hrbp_scope_rule).idstringscope_idstring required — Parent HrbpScope id.dimensionstring required — Geo dimensions (location/region/country/city) all feed the hierarchical location scope.valuestring — The in-scope value for the dimension (null for all_access). Geo values may be a region (AMS), country (USA), or city (New York, NY).activebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/snapshot_groups
List snapshot capture batches
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
SnapshotGroupGroups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).idstringnamestring requiredcaptured_atstringsourcestringnotestringcreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
SnapshotGroup
idstringnamestring requiredcaptured_atstringsourcestringnotestringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonSnapshotGroupGroups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).idstringnamestring requiredcaptured_atstringsourcestringnotestringcreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/snapshot_groups/{id}
Get a snapshot capture batch by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonSnapshotGroupGroups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).idstringnamestring requiredcaptured_atstringsourcestringnotestringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/snapshot_groups/{id}
Delete a snapshot capture batch
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/snapshot_groups/{id}
Edit a snapshot capture batch
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
SnapshotGroup
idstringnamestring requiredcaptured_atstringsourcestringnotestringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonSnapshotGroupGroups related metric snapshots captured in one run (SN sn_talent_pulse_snapshot_group).idstringnamestring requiredcaptured_atstringsourcestringnotestringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/metric_sources
List metric data sources
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
MetricSourceA system a metric value can originate from (SN sn_talent_pulse_metric_source).idstringkeystring requirednamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
MetricSource
idstringkeystring requirednamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonMetricSourceA system a metric value can originate from (SN sn_talent_pulse_metric_source).idstringkeystring requirednamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/metric_sources/{id}
Get a metric data source by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonMetricSourceA system a metric value can originate from (SN sn_talent_pulse_metric_source).idstringkeystring requirednamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/metric_sources/{id}
Delete a metric data source
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/metric_sources/{id}
Edit a metric data source
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
MetricSource
idstringkeystring requirednamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonMetricSourceA system a metric value can originate from (SN sn_talent_pulse_metric_source).idstringkeystring requirednamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/employee_relations
List employee relations (ER) cases
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
EmployeeRelationEmployee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).idstringnumberstringsubject_personstring required — Employee ID the case concerns.short_descriptionstring requireddescriptionstringstatestringprioritystring — SN 1-Critical/2-High/3-Moderate/4-Low.opened_bystring — Employee ID of the HR rep who opened the case.assigned_tostring — Employee ID of the assigned HR investigator.hr_servicestringopened_atstringdue_datestringclosed_atstringactivebooleanincident_datestring — Date of most recent incident.external_opened_forboolean — Opened for is not a User.lockedboolean — Restricting access limits who can view/edit the case.preferred_contact_methodstringreported_datestringpip_start_datestringpip_end_datestringpip_improvement_areasstringpip_rationalestringpip_successfulstringpip_extendedstringpip_extension_datestringcreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
EmployeeRelation
idstringnumberstringsubject_personstring required — Employee ID the case concerns.short_descriptionstring requireddescriptionstringstatestringprioritystring — SN 1-Critical/2-High/3-Moderate/4-Low.opened_bystring — Employee ID of the HR rep who opened the case.assigned_tostring — Employee ID of the assigned HR investigator.hr_servicestringopened_atstringdue_datestringclosed_atstringactivebooleanincident_datestring — Date of most recent incident.external_opened_forboolean — Opened for is not a User.lockedboolean — Restricting access limits who can view/edit the case.preferred_contact_methodstringreported_datestringpip_start_datestringpip_end_datestringpip_improvement_areasstringpip_rationalestringpip_successfulstringpip_extendedstringpip_extension_datestringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonEmployeeRelationEmployee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).idstringnumberstringsubject_personstring required — Employee ID the case concerns.short_descriptionstring requireddescriptionstringstatestringprioritystring — SN 1-Critical/2-High/3-Moderate/4-Low.opened_bystring — Employee ID of the HR rep who opened the case.assigned_tostring — Employee ID of the assigned HR investigator.hr_servicestringopened_atstringdue_datestringclosed_atstringactivebooleanincident_datestring — Date of most recent incident.external_opened_forboolean — Opened for is not a User.lockedboolean — Restricting access limits who can view/edit the case.preferred_contact_methodstringreported_datestringpip_start_datestringpip_end_datestringpip_improvement_areasstringpip_rationalestringpip_successfulstringpip_extendedstringpip_extension_datestringcreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/employee_relations/{id}
Get an employee relations (ER) case by id
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonEmployeeRelationEmployee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).idstringnumberstringsubject_personstring required — Employee ID the case concerns.short_descriptionstring requireddescriptionstringstatestringprioritystring — SN 1-Critical/2-High/3-Moderate/4-Low.opened_bystring — Employee ID of the HR rep who opened the case.assigned_tostring — Employee ID of the assigned HR investigator.hr_servicestringopened_atstringdue_datestringclosed_atstringactivebooleanincident_datestring — Date of most recent incident.external_opened_forboolean — Opened for is not a User.lockedboolean — Restricting access limits who can view/edit the case.preferred_contact_methodstringreported_datestringpip_start_datestringpip_end_datestringpip_improvement_areasstringpip_rationalestringpip_successfulstringpip_extendedstringpip_extension_datestringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/employee_relations/{id}
Delete an employee relations (ER) case
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/employee_relations/{id}
Edit an employee relations (ER) case
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
EmployeeRelation
idstringnumberstringsubject_personstring required — Employee ID the case concerns.short_descriptionstring requireddescriptionstringstatestringprioritystring — SN 1-Critical/2-High/3-Moderate/4-Low.opened_bystring — Employee ID of the HR rep who opened the case.assigned_tostring — Employee ID of the assigned HR investigator.hr_servicestringopened_atstringdue_datestringclosed_atstringactivebooleanincident_datestring — Date of most recent incident.external_opened_forboolean — Opened for is not a User.lockedboolean — Restricting access limits who can view/edit the case.preferred_contact_methodstringreported_datestringpip_start_datestringpip_end_datestringpip_improvement_areasstringpip_rationalestringpip_successfulstringpip_extendedstringpip_extension_datestringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonEmployeeRelationEmployee Relations case (SN sn_hr_er_case, extends sn_hr_core_case).idstringnumberstringsubject_personstring required — Employee ID the case concerns.short_descriptionstring requireddescriptionstringstatestringprioritystring — SN 1-Critical/2-High/3-Moderate/4-Low.opened_bystring — Employee ID of the HR rep who opened the case.assigned_tostring — Employee ID of the assigned HR investigator.hr_servicestringopened_atstringdue_datestringclosed_atstringactivebooleanincident_datestring — Date of most recent incident.external_opened_forboolean — Opened for is not a User.lockedboolean — Restricting access limits who can view/edit the case.preferred_contact_methodstringreported_datestringpip_start_datestringpip_end_datestringpip_improvement_areasstringpip_rationalestringpip_successfulstringpip_extendedstringpip_extension_datestringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/allegation_types
List allegation types
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
AllegationTypeAllegation type reference catalog (SN sn_hr_er_allegation_type).idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
AllegationType
idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonAllegationTypeAllegation type reference catalog (SN sn_hr_er_allegation_type).idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/allegation_types/{id}
Get allegation type
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonAllegationTypeAllegation type reference catalog (SN sn_hr_er_allegation_type).idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/allegation_types/{id}
Delete allegation type
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/allegation_types/{id}
Update allegation type
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
AllegationType
idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonAllegationTypeAllegation type reference catalog (SN sn_hr_er_allegation_type).idstringnamestring requireddescriptionstringactivebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/allegation_subtypes
List allegation subtypes
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
AllegationSubtypeAllegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).idstringallegation_type_idstring requirednamestring requiredactivebooleancreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
AllegationSubtype
idstringallegation_type_idstring requirednamestring requiredactivebooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonAllegationSubtypeAllegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).idstringallegation_type_idstring requirednamestring requiredactivebooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/allegation_subtypes/{id}
Get allegation subtype
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonAllegationSubtypeAllegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).idstringallegation_type_idstring requirednamestring requiredactivebooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/allegation_subtypes/{id}
Delete allegation subtype
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/allegation_subtypes/{id}
Update allegation subtype
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
AllegationSubtype
idstringallegation_type_idstring requirednamestring requiredactivebooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonAllegationSubtypeAllegation subtype, dependent on allegation_type (SN sn_hr_er_allegation_subtype).idstringallegation_type_idstring requirednamestring requiredactivebooleancreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/allegations
List allegations
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
AllegationOne allegation filed on an ER case (SN sn_hr_er_allegation).idstringemployee_relation_idstring requiredallegation_type_idstring requiredallegation_subtype_idstring requireddescriptionstringsubjects_of_allegationstring — Derived: names of the case's 'respondent' involved parties.createdAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Allegation
idstringemployee_relation_idstring requiredallegation_type_idstring requiredallegation_subtype_idstring requireddescriptionstringsubjects_of_allegationstring — Derived: names of the case's 'respondent' involved parties.createdAtstringupdatedAtstring
Responses
201- Created
application/jsonAllegationOne allegation filed on an ER case (SN sn_hr_er_allegation).idstringemployee_relation_idstring requiredallegation_type_idstring requiredallegation_subtype_idstring requireddescriptionstringsubjects_of_allegationstring — Derived: names of the case's 'respondent' involved parties.createdAtstringupdatedAtstring
GET /api/purple-suite/hrbp/allegations/{id}
Get allegation
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonAllegationOne allegation filed on an ER case (SN sn_hr_er_allegation).idstringemployee_relation_idstring requiredallegation_type_idstring requiredallegation_subtype_idstring requireddescriptionstringsubjects_of_allegationstring — Derived: names of the case's 'respondent' involved parties.createdAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/allegations/{id}
Delete allegation
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/allegations/{id}
Update allegation
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Allegation
idstringemployee_relation_idstring requiredallegation_type_idstring requiredallegation_subtype_idstring requireddescriptionstringsubjects_of_allegationstring — Derived: names of the case's 'respondent' involved parties.createdAtstringupdatedAtstring
Responses
200- Updated
application/jsonAllegationOne allegation filed on an ER case (SN sn_hr_er_allegation).idstringemployee_relation_idstring requiredallegation_type_idstring requiredallegation_subtype_idstring requireddescriptionstringsubjects_of_allegationstring — Derived: names of the case's 'respondent' involved parties.createdAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/hrbp/involved_parties
List involved parties
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
limit | query | integer | no | Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used. |
cursor | query | string | no | Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top. |
$filter | query | string | no | OData 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". |
$select | query | string | no | Comma-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. |
$orderby | query | string | no | Sort clause(s), comma-separated, each "field [asc|desc]" (asc is the default). Example: "createdAt desc, lastName asc". Null values sort last. |
$search | query | string | no | Free-text, case-insensitive substring match across the resource's searchable fields. |
$top | query | integer | no | Maximum number of items to return (page size). |
$skip | query | integer | no | Number of matching items to skip before returning results (offset paging). Combine with $top. |
$count | query | boolean | no | When true, include @odata.count (total matches after $filter/$search, before paging) in the response. |
Responses
200- Paginated list
application/jsondataarrayarray of:
InvolvedPartyA complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).idstringemployee_relation_idstring requiredemployee_idstring — Employee ID, if the party has a User record.not_in_systemboolean — Involved party does not have a User record.namestring — Name/description, used when not_in_system (or no employee_id).display_namestring — Derived: the linked employee's name, else name.typestring requiredcorrelation_idstringcreatedAtstringupdatedAtstring
nextCursorstring — Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.totalinteger — Total documents in the collection.@odata.countinteger — Present only when $count=true: total matches after $filter/$search.@odata.truncatedboolean — Present 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
InvolvedParty
idstringemployee_relation_idstring requiredemployee_idstring — Employee ID, if the party has a User record.not_in_systemboolean — Involved party does not have a User record.namestring — Name/description, used when not_in_system (or no employee_id).display_namestring — Derived: the linked employee's name, else name.typestring requiredcorrelation_idstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonInvolvedPartyA complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).idstringemployee_relation_idstring requiredemployee_idstring — Employee ID, if the party has a User record.not_in_systemboolean — Involved party does not have a User record.namestring — Name/description, used when not_in_system (or no employee_id).display_namestring — Derived: the linked employee's name, else name.typestring requiredcorrelation_idstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/hrbp/involved_parties/{id}
Get involved party
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonInvolvedPartyA complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).idstringemployee_relation_idstring requiredemployee_idstring — Employee ID, if the party has a User record.not_in_systemboolean — Involved party does not have a User record.namestring — Name/description, used when not_in_system (or no employee_id).display_namestring — Derived: the linked employee's name, else name.typestring requiredcorrelation_idstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/hrbp/involved_parties/{id}
Delete involved party
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Deleted
application/jsonsuccessboolean
404- Not found
PATCH /api/purple-suite/hrbp/involved_parties/{id}
Update involved party
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
InvolvedParty
idstringemployee_relation_idstring requiredemployee_idstring — Employee ID, if the party has a User record.not_in_systemboolean — Involved party does not have a User record.namestring — Name/description, used when not_in_system (or no employee_id).display_namestring — Derived: the linked employee's name, else name.typestring requiredcorrelation_idstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonInvolvedPartyA complainant, respondent, witness, or other party on an ER case (SN sn_hr_er_involved_party).idstringemployee_relation_idstring requiredemployee_idstring — Employee ID, if the party has a User record.not_in_systemboolean — Involved party does not have a User record.namestring — Name/description, used when not_in_system (or no employee_id).display_namestring — Derived: the linked employee's name, else name.typestring requiredcorrelation_idstringcreatedAtstringupdatedAtstring
404- Not found