Purple ITSM API Documentation
Machine-readable OpenAPI 3.0 specification: https://marketplace.moveworks.com/api/purple-suite/itsm/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=itsm, or combined with other apps comma-separated (e.g. ?apps=itsm,itsm).
Overview
Endpoints
GET /api/purple-suite/itsm/incidents
List IT incidents (unplanned break/fix tickets)
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:
Incidentidstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
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/itsm/incidents
Open a new IT incident ticket
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Incident
idstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonIncidentidstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/incidents/{id}
Get one IT incident by ticket number
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonIncidentidstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/incidents/{id}
Delete an IT incident record
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/itsm/incidents/{id}
Update an IT incident (reassign, reprioritise, resolve)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Incident
idstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonIncidentidstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
404- Not found
POST /api/purple-suite/itsm/incidents/{id}/escalate
Escalate an incident to the next support tier
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
escalation_notesstring
Responses
200- Updated incident after escalation
application/jsonIncidentidstringtitlestringstatusstringprioritystringcategorystringassigneestringreporterstringescalation_tierintegerescalated_atstringescalation_notesstringreopen_reasonstringcreatedAtstringupdatedAtstring
400- Incident already at maximum escalation tier (3)
404- Not found
422- Cannot escalate a resolved or closed incident
GET /api/purple-suite/itsm/changes
List change requests (planned IT changes)
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:
ChangeidstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
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/itsm/changes
Raise a change request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Change
idstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
Responses
201- Created
application/jsonChangeidstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
GET /api/purple-suite/itsm/changes/{id}
Get one change request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonChangeidstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/changes/{id}
Delete a change request
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/itsm/changes/{id}
Update a change request's details or status
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Change
idstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
Responses
200- Updated
application/jsonChangeidstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
404- Not found
POST /api/purple-suite/itsm/changes/{id}/cab-approve
Approve a change at the Change Advisory Board
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json — required
approved_bystring required
Responses
200- Updated change after CAB approval
application/jsonChangeidstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
404- Not found
422- Change cannot be approved in its current state
POST /api/purple-suite/itsm/changes/{id}/cab-reject
Reject a change at the Change Advisory Board
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json — required
rejected_bystring requiredreasonstring required
Responses
200- Updated change after CAB rejection
application/jsonChangeidstringtitlestringstatusstringriskLevelstringscheduledDatestringapproverstringcab_approvalobjectapproved_bystringapproved_atstringrejected_bystringreasonstring
createdAtstringupdatedAtstring
404- Not found
422- Change cannot be rejected in its current state
GET /api/purple-suite/itsm/sla_policies
List SLA policies (response/resolution targets)
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:
SlaPolicyidstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
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/itsm/sla_policies
Create an SLA policy
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
SlaPolicy
idstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonSlaPolicyidstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/sla_policies/{id}
Get one SLA policy
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonSlaPolicyidstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/sla_policies/{id}
Delete an SLA policy
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/itsm/sla_policies/{id}
Update an SLA policy's targets
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
SlaPolicy
idstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonSlaPolicyidstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
404- Not found
POST /api/purple-suite/itsm/sla-policies/{id}/pause
Pause an SLA policy (stop the clock)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Updated SLA policy after pause
application/jsonSlaPolicyidstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
404- Not found
422- SLA policy is already paused
POST /api/purple-suite/itsm/sla-policies/{id}/resume
Resume a paused SLA policy (restart the clock)
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Updated SLA policy after resume
application/jsonSlaPolicyidstringnamestringresponseTimeHoursnumberresolutionTimeHoursnumberprioritystringactivebooleanpausedbooleancreatedAtstringupdatedAtstring
404- Not found
422- SLA policy is not paused and cannot be resumed
GET /api/purple-suite/itsm/problems
List problems (root causes behind repeat incidents)
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:
ProblemidstringtitlestringstatusstringrootCausestringcreatedAtstringupdatedAtstring
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/itsm/problems
Open a problem investigation
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Problem
idstringtitlestringstatusstringrootCausestringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonProblemidstringtitlestringstatusstringrootCausestringcreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/problems/{id}
Get one problem record
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonProblemidstringtitlestringstatusstringrootCausestringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/problems/{id}
Delete a problem record
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/itsm/problems/{id}
Update a problem investigation
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Problem
idstringtitlestringstatusstringrootCausestringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonProblemidstringtitlestringstatusstringrootCausestringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/itsm/service_requests
List service requests (asks from the service catalog)
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:
ServiceRequestidstringtitlestringstatusstringrequestedBystringfulfillmentGroupstringcreatedAtstringupdatedAtstring
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/itsm/service_requests
Submit a service request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
ServiceRequest
idstringtitlestringstatusstringrequestedBystringfulfillmentGroupstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonServiceRequestidstringtitlestringstatusstringrequestedBystringfulfillmentGroupstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/service_requests/{id}
Get one service request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonServiceRequestidstringtitlestringstatusstringrequestedBystringfulfillmentGroupstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/service_requests/{id}
Delete a service request
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/itsm/service_requests/{id}
Update or progress a service request
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
ServiceRequest
idstringtitlestringstatusstringrequestedBystringfulfillmentGroupstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonServiceRequestidstringtitlestringstatusstringrequestedBystringfulfillmentGroupstringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/itsm/cis
List CMDB configuration items (IT assets)
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:
ConfigurationItemidstringnamestringtypestringstatusstringenvironmentstringownerstringcreatedAtstringupdatedAtstring
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/itsm/cis
Add a configuration item to the CMDB
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
ConfigurationItem
idstringnamestringtypestringstatusstringenvironmentstringownerstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonConfigurationItemidstringnamestringtypestringstatusstringenvironmentstringownerstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/cis/{id}
Get one CMDB configuration item
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonConfigurationItemidstringnamestringtypestringstatusstringenvironmentstringownerstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/cis/{id}
Delete a CMDB configuration item
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/itsm/cis/{id}
Update a CMDB configuration item
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
ConfigurationItem
idstringnamestringtypestringstatusstringenvironmentstringownerstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonConfigurationItemidstringnamestringtypestringstatusstringenvironmentstringownerstringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/itsm/kb_articles
Search the IT knowledge base
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:
KbArticleidstringtitlestringcategorystringviewsintegerhelpfulintegerauthorstringpublishedAtstringcreatedAtstringupdatedAtstring
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/itsm/kb_articles
Publish a knowledge base article
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
KbArticle
idstringtitlestringcategorystringviewsintegerhelpfulintegerauthorstringpublishedAtstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonKbArticleidstringtitlestringcategorystringviewsintegerhelpfulintegerauthorstringpublishedAtstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/kb_articles/{id}
Get one knowledge base article
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonKbArticleidstringtitlestringcategorystringviewsintegerhelpfulintegerauthorstringpublishedAtstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/kb_articles/{id}
Delete a knowledge base article
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/itsm/kb_articles/{id}
Update a knowledge base article
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
KbArticle
idstringtitlestringcategorystringviewsintegerhelpfulintegerauthorstringpublishedAtstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonKbArticleidstringtitlestringcategorystringviewsintegerhelpfulintegerauthorstringpublishedAtstringcreatedAtstringupdatedAtstring
404- Not found
GET /api/purple-suite/itsm/alerts
List monitoring alerts from observability tools
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:
AlertidstringtitlestringseveritystringsourcestringstatusstringtriggeredAtstringresolvedAtstringcreatedAtstringupdatedAtstring
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/itsm/alerts
Record a monitoring alert
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes |
Request body
application/json — required
Alert
idstringtitlestringseveritystringsourcestringstatusstringtriggeredAtstringresolvedAtstringcreatedAtstringupdatedAtstring
Responses
201- Created
application/jsonAlertidstringtitlestringseveritystringsourcestringstatusstringtriggeredAtstringresolvedAtstringcreatedAtstringupdatedAtstring
GET /api/purple-suite/itsm/alerts/{id}
Get one monitoring alert
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Responses
200- Found
application/jsonAlertidstringtitlestringseveritystringsourcestringstatusstringtriggeredAtstringresolvedAtstringcreatedAtstringupdatedAtstring
404- Not found
DELETE /api/purple-suite/itsm/alerts/{id}
Delete a monitoring alert
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/itsm/alerts/{id}
Acknowledge or resolve a monitoring alert
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
X-Instance-ID | header | string | yes | |
id | path | string | yes |
Request body
application/json
Alert
idstringtitlestringseveritystringsourcestringstatusstringtriggeredAtstringresolvedAtstringcreatedAtstringupdatedAtstring
Responses
200- Updated
application/jsonAlertidstringtitlestringseveritystringsourcestringstatusstringtriggeredAtstringresolvedAtstringcreatedAtstringupdatedAtstring
404- Not found