Source system for the Manager Hub plugins: a manager's Teams chats/channels, Outlook mail, Jira sprint health & issues, Workday learning & certifications, SAP SuccessFactors certifications, and ServiceNow HR profile/org lookups for their direct reports. The data layer (chats, messages, issues, enrollments, certifications) is Purple-native CRUD+OData; the contract layer reproduces each real vendor's exact wire format so an agent built against Manager Experience works unchanged against the live vendor.
---
**Acting as a user (`X-PS-Impersonate-User`).** Every endpoint accepts an optional `X-PS-Impersonate-User` request header whose value is the email of the instance user to act as. The effective user resolves in this order: the header if present, else the instance's configured default MCP user, else none. User-scoped paths additionally accept the literal `me` in place of an email, and Graph-style apps also serve `/me/…` twins of their `/users/{email}/…` paths that resolve the same way. This header is honored by all operations but is intentionally omitted from each operation's parameter list so it is not surfaced as a per-tool argument by MCP clients; see the `ImpersonateUser` entry under `components.parameters`.
Source system for the Manager Hub plugins: a manager's Teams chats/channels, Outlook mail, Jira sprint health & issues, Workday learning & certifications, SAP SuccessFactors certifications, and ServiceNow HR profile/org lookups for their direct reports. The data layer (chats, messages, issues, enrollments, certifications) is Purple-native CRUD+OData; the contract layer reproduces each real vendor's exact wire format so an agent built against Manager Experience works unchanged against the live vendor.
---
**Acting as a user (`X-PS-Impersonate-User`).** Every endpoint accepts an optional `X-PS-Impersonate-User` request header whose value is the email of the instance user to act as. The effective user resolves in this order: the header if present, else the instance's configured default MCP user, else none. User-scoped paths additionally accept the literal `me` in place of an email, and Graph-style apps also serve `/me/…` twins of their `/users/{email}/…` paths that resolve the same way. This header is honored by all operations but is intentionally omitted from each operation's parameter list so it is not surfaced as a per-tool argument by MCP clients; see the `ImpersonateUser` entry under `components.parameters`.
Operations
GET /team_memberships
List team_memberships
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List team_memberships",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TeamMembership"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /team_memberships
Create team_membership
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create team_membership",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamMembership"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamMembership"
}
}
}
}
}
}
GET /team_memberships/{id}
Get team_membership
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get team_membership",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TeamMembership"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /chats
List chats
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List chats",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Chat"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /chats
Create chat
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create chat",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Chat"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Chat"
}
}
}
}
}
}
GET /chats/{id}
Get chat
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get chat",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Chat"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /chat_messages
List chat_messages
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List chat_messages",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChatMessage"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /chat_messages
Create chat_message
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create chat_message",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChatMessage"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChatMessage"
}
}
}
}
}
}
GET /chat_messages/{id}
Get chat_message
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get chat_message",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChatMessage"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /teams
List teams
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List teams",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Team"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /teams
Create team
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create team",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
}
}
}
}
GET /teams/{id}
Get team
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get team",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Team"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /channels
List channels
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List channels",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Channel"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /channels
Create channel
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create channel",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Channel"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Channel"
}
}
}
}
}
}
GET /channels/{id}
Get channel
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get channel",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Channel"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /channel_messages
List channel_messages
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List channel_messages",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ChannelMessage"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /channel_messages
Create channel_message
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create channel_message",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChannelMessage"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChannelMessage"
}
}
}
}
}
}
GET /channel_messages/{id}
Get channel_message
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get channel_message",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ChannelMessage"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /mail_messages
List mail_messages
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List mail_messages",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MailMessage"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /mail_messages
Create mail_message
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create mail_message",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MailMessage"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MailMessage"
}
}
}
}
}
}
GET /mail_messages/{id}
Get mail_message
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get mail_message",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MailMessage"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /jira_projects
List jira_projects
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List jira_projects",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/JiraProject"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /jira_projects
Create jira_project
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create jira_project",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraProject"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraProject"
}
}
}
}
}
}
GET /jira_projects/{id}
Get jira_project
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get jira_project",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraProject"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /jira_sprints
List jira_sprints
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List jira_sprints",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/JiraSprint"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /jira_sprints
Create jira_sprint
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create jira_sprint",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraSprint"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraSprint"
}
}
}
}
}
}
GET /jira_sprints/{id}
Get jira_sprint
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get jira_sprint",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraSprint"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /jira_issues
List jira_issues
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List jira_issues",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/JiraIssue"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /jira_issues
Create jira_issue
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create jira_issue",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraIssue"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraIssue"
}
}
}
}
}
}
GET /jira_issues/{id}
Get jira_issue
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get jira_issue",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JiraIssue"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /stories
List stories
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List stories",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Story"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /stories
Create story
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create story",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Story"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Story"
}
}
}
}
}
}
GET /stories/{id}
Get story
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get story",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Story"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /defects
List defects
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List defects",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Defect"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /defects
Create defect
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create defect",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Defect"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Defect"
}
}
}
}
}
}
GET /defects/{id}
Get defect
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get defect",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Defect"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /resource_allocations
List resource_allocations
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List resource_allocations",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ResourceAllocation"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /resource_allocations
Create resource_allocation
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create resource_allocation",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResourceAllocation"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResourceAllocation"
}
}
}
}
}
}
GET /resource_allocations/{id}
Get resource_allocation
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get resource_allocation",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ResourceAllocation"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /workday_learning_enrollments
List workday_learning_enrollments
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List workday_learning_enrollments",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/WorkdayLearningEnrollment"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /workday_learning_enrollments
Create workday_learning_enrollment
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create workday_learning_enrollment",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLearningEnrollment"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLearningEnrollment"
}
}
}
}
}
}
GET /workday_learning_enrollments/{id}
Get workday_learning_enrollment
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get workday_learning_enrollment",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLearningEnrollment"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /workday_learning_assignments
List workday_learning_assignments
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List workday_learning_assignments",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/WorkdayLearningAssignment"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /workday_learning_assignments
Create workday_learning_assignment
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create workday_learning_assignment",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLearningAssignment"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLearningAssignment"
}
}
}
}
}
}
GET /workday_learning_assignments/{id}
Get workday_learning_assignment
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get workday_learning_assignment",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLearningAssignment"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /workday_certifications
List workday_certifications
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List workday_certifications",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/WorkdayCertification"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /workday_certifications
Create workday_certification
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create workday_certification",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayCertification"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayCertification"
}
}
}
}
}
}
GET /workday_certifications/{id}
Get workday_certification
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get workday_certification",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayCertification"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /workday_loa
List workday_loa
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List workday_loa",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/WorkdayLoa"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /workday_loa
Create workday_loa
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create workday_loa",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLoa"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLoa"
}
}
}
}
}
}
GET /workday_loa/{id}
Get workday_loa
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get workday_loa",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayLoa"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /workday_time_off
List workday_time_off
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List workday_time_off",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/WorkdayTimeOff"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /workday_time_off
Create workday_time_off
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create workday_time_off",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayTimeOff"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayTimeOff"
}
}
}
}
}
}
GET /workday_time_off/{id}
Get workday_time_off
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get workday_time_off",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/WorkdayTimeOff"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /sfsf_certifications
List sfsf_certifications
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List sfsf_certifications",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/SfsfCertification"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /sfsf_certifications
Create sfsf_certification
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create sfsf_certification",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SfsfCertification"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SfsfCertification"
}
}
}
}
}
}
GET /sfsf_certifications/{id}
Get sfsf_certification
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get sfsf_certification",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SfsfCertification"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /hr_profiles
List hr_profiles
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List hr_profiles",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/HrProfileOverride"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /hr_profiles
Create hr_profile_override
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create hr_profile_override",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HrProfileOverride"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HrProfileOverride"
}
}
}
}
}
}
GET /hr_profiles/{id}
Get hr_profile_override
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get hr_profile_override",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HrProfileOverride"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /journeys
List journeys
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List journeys",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Journey"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /journeys
Create journey
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create journey",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Journey"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Journey"
}
}
}
}
}
}
GET /journeys/{id}
Get journey
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get journey",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Journey"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /discussion_records
List discussion_records
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List discussion_records",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DiscussionRecord"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /discussion_records
Create discussion_record
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create discussion_record",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DiscussionRecord"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DiscussionRecord"
}
}
}
}
}
}
GET /discussion_records/{id}
Get discussion_record
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get discussion_record",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DiscussionRecord"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /talking_points
List talking_points
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List talking_points",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/TalkingPoint"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /talking_points
Create talking_point
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create talking_point",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TalkingPoint"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TalkingPoint"
}
}
}
}
}
}
GET /talking_points/{id}
Get talking_point
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get talking_point",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TalkingPoint"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /microsoft_ooo
List microsoft_ooo
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List microsoft_ooo",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MicrosoftOoO"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /microsoft_ooo
Create microsoft_ooo
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create microsoft_ooo",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MicrosoftOoO"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MicrosoftOoO"
}
}
}
}
}
}
GET /microsoft_ooo/{id}
Get microsoft_ooo
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get microsoft_ooo",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/MicrosoftOoO"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /kb_articles
List kb_articles
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List kb_articles",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/KbArticle"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /kb_articles
Create kb_article
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create kb_article",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/KbArticle"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/KbArticle"
}
}
}
}
}
}
GET /kb_articles/{id}
Get kb_article
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get kb_article",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/KbArticle"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /employees
List employees
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List employees",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Employee"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /employees
Create employee
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create employee",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Employee"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Employee"
}
}
}
}
}
}
GET /employees/{id}
Get employee
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get employee",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Employee"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /holidays
List holidays
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "List holidays",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer",
"default": 50
},
"description": "Legacy page size (default 50). Prefer $top. Ignored when $top/$skip are used."
},
{
"in": "query",
"name": "cursor",
"schema": {
"type": "string"
},
"description": "Legacy keyset cursor — pass the previous response's nextCursor. Prefer $skip/$top."
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"description": "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\"."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "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."
},
{
"in": "query",
"name": "$orderby",
"schema": {
"type": "string"
},
"description": "Sort clause(s), comma-separated, each \"field [asc|desc]\" (asc is the default). Example: \"createdAt desc, lastName asc\". Null values sort last."
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"description": "Free-text, case-insensitive substring match across the resource's searchable fields."
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
},
"description": "Maximum number of items to return (page size)."
},
{
"in": "query",
"name": "$skip",
"schema": {
"type": "integer"
},
"description": "Number of matching items to skip before returning results (offset paging). Combine with $top."
},
{
"in": "query",
"name": "$count",
"schema": {
"type": "boolean"
},
"description": "When true, include @odata.count (total matches after $filter/$search, before paging) in the response."
}
],
"responses": {
"200": {
"description": "Paginated list",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Holiday"
}
},
"nextCursor": {
"type": "string",
"nullable": true,
"description": "Cursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor."
},
"total": {
"type": "integer",
"description": "Total documents in the collection."
},
"@odata.count": {
"type": "integer",
"description": "Present only when $count=true: total matches after $filter/$search."
},
"@odata.truncated": {
"type": "boolean",
"description": "Present and true only when the collection exceeded the in-memory query cap and results may be incomplete."
}
}
}
}
}
},
"400": {
"description": "Invalid OData query (e.g. malformed $filter)"
}
}
}
POST /holidays
Create holiday
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Create holiday",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Holiday"
}
}
}
},
"responses": {
"201": {
"description": "Created",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Holiday"
}
}
}
}
}
}
GET /holidays/{id}
Get holiday
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"summary": "Get holiday",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "id",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Holiday"
}
}
}
},
"404": {
"description": "Not found"
}
}
}
GET /v1.0/me/chats
MS Graph — list the caller's Teams chats
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — list the caller's Teams chats",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"responses": {
"200": {
"description": "{value:[...]}"
}
}
}
POST /v1.0/chats
MS Graph — create or return the existing 1:1 Teams chat (idempotent)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — create or return the existing 1:1 Teams chat (idempotent)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"chatType": {
"type": "string",
"enum": [
"oneOnOne",
"group"
]
},
"members": {
"type": "array",
"items": {
"type": "object"
}
}
}
}
}
}
},
"responses": {
"200": {
"description": "Existing chat returned"
},
"201": {
"description": "New chat created"
}
}
}
GET /v1.0/chats/{chatId}/messages
MS Graph — list messages in a Teams chat
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — list messages in a Teams chat",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "chatId",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "{value:[...]}"
}
}
}
POST /v1.0/chats/{chatId}/messages
MS Graph — post a message to a Teams chat (stores in chat_messages)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — post a message to a Teams chat (stores in chat_messages)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "chatId",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"body": {
"type": "object",
"properties": {
"content": {
"type": "string"
},
"contentType": {
"type": "string",
"enum": [
"text",
"html"
]
}
}
}
}
}
}
}
},
"responses": {
"201": {
"description": "Message posted; retrievable via GET /v1.0/chats/{chatId}/messages"
}
}
}
GET /v1.0/me/joinedTeams
MS Graph — list the caller's joined Teams
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — list the caller's joined Teams",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"responses": {
"200": {
"description": "{value:[...]}"
}
}
}
GET /v1.0/teams/{teamId}/channels
MS Graph — list a team's channels
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — list a team's channels",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "teamId",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "{value:[...]}"
}
}
}
GET /v1.0/teams/{teamId}/channels/{channelId}/messages
MS Graph — list messages in a Teams channel
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — list messages in a Teams channel",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "teamId",
"required": true,
"schema": {
"type": "string"
}
},
{
"in": "path",
"name": "channelId",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "{value:[...]}"
}
}
}
GET /v1.0/me/messages
MS Graph — list the caller's Outlook mail
Supports `$search="participants:<email>"` to narrow to messages the given address sent or received within the mailbox being listed.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — list the caller's Outlook mail",
"description": "Supports `$search=\"participants:<email>\"` to narrow to messages the given address sent or received within the mailbox being listed.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "$top",
"schema": {
"type": "integer"
}
},
{
"in": "query",
"name": "$search",
"schema": {
"type": "string"
},
"example": "\"participants:alice.chen@acme.com\"",
"description": "Only `participants:<email>` is recognized; other values are ignored."
},
{
"in": "query",
"name": "$select",
"schema": {
"type": "string"
},
"description": "Accepted for Graph parity; the response always includes id, subject, from, toRecipients, receivedDateTime, bodyPreview, body, importance, isRead, hasAttachments, webLink."
}
],
"responses": {
"200": {
"description": "{value:[...]}"
}
}
}
POST /v1.0/users/{email}/sendMail
MS Graph — send mail from a user's mailbox (stores sent item in mail_messages)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — send mail from a user's mailbox (stores sent item in mail_messages)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "email",
"required": true,
"schema": {
"type": "string",
"format": "email"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "object",
"required": [
"subject",
"body",
"toRecipients"
],
"properties": {
"subject": {
"type": "string"
},
"body": {
"type": "object",
"properties": {
"contentType": {
"type": "string",
"enum": [
"Text",
"HTML"
]
},
"content": {
"type": "string"
}
}
},
"toRecipients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emailAddress": {
"type": "object",
"properties": {
"address": {
"type": "string",
"format": "email"
}
}
}
}
}
}
}
},
"saveToSentItems": {
"type": "string",
"enum": [
"true",
"false"
]
}
}
}
}
}
},
"responses": {
"202": {
"description": "Accepted — sent item stored in mail_messages; retrievable via GET /v1.0/me/messages"
}
}
}
GET /v1.0/users/{identifier}
MS Graph — look up a user by email or GUID (ms_graph_get_user_by_email)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — look up a user by email or GUID (ms_graph_get_user_by_email)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "identifier",
"required": true,
"schema": {
"type": "string"
},
"example": "alice.smith0@acme.com"
}
],
"responses": {
"200": {
"description": "{id, displayName, mail, userPrincipalName, givenName, surname, jobTitle, department}"
},
"404": {
"description": "User not found"
}
}
}
GET /v1.0/users/{userId}/presence
MS Graph — real-time presence + OOO settings (MS_Graph_Get_User_Presence). State from microsoft_ooo; default → Available.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — real-time presence + OOO settings (MS_Graph_Get_User_Presence). State from microsoft_ooo; default → Available.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "userId",
"required": true,
"schema": {
"type": "string"
},
"example": "d567639d-2a18-4c48-a7ce-442438c1732e"
}
],
"responses": {
"200": {
"description": "{id, availability, activity, outOfOfficeSettings, statusMessage}"
}
}
}
GET /v1.0/users/{email}/mailboxSettings/automaticRepliesSetting
MS Graph — mailbox automatic-reply settings (MS_Graph_Get_Automatic_Replies). State from microsoft_ooo; default → Disabled.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — mailbox automatic-reply settings (MS_Graph_Get_Automatic_Replies). State from microsoft_ooo; default → Disabled.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "email",
"required": true,
"schema": {
"type": "string",
"format": "email"
}
}
],
"responses": {
"200": {
"description": "{status, scheduledStartDateTime, scheduledEndDateTime, internalReplyMessage}"
}
}
}
GET /v1.0/users/{email}/calendarView
MS Graph — that user's Out-of-Office calendar block in a date range (Get_Employee_OOO_Status, Get_Reportees_OOO_Status). Synthesized entirely from microsoft_ooo (is_ooo + calendar_start/calendar_end, falling back to scheduled_start/scheduled_end + internal_reply_message) — no dependency on the Calendar app.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "MS Graph — that user's Out-of-Office calendar block in a date range (Get_Employee_OOO_Status, Get_Reportees_OOO_Status). Synthesized entirely from microsoft_ooo (is_ooo + calendar_start/calendar_end, falling back to scheduled_start/scheduled_end + internal_reply_message) — no dependency on the Calendar app.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "email",
"required": true,
"schema": {
"type": "string",
"format": "email"
}
},
{
"in": "query",
"name": "startDateTime",
"required": true,
"schema": {
"type": "string",
"format": "date-time"
}
},
{
"in": "query",
"name": "endDateTime",
"required": true,
"schema": {
"type": "string",
"format": "date-time"
}
}
],
"responses": {
"200": {
"description": "{value:[...]}"
},
"400": {
"description": "startDateTime/endDateTime missing"
}
}
}
GET /rest/api/3/search/jql
Jira Cloud — search issues by JQL
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Jira Cloud — search issues by JQL",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "jql",
"required": true,
"schema": {
"type": "string"
},
"example": "sprint ~ 'Sprint 24' AND project = 'ENG'"
}
],
"responses": {
"200": {
"description": "{issues:[...], nextPageToken, isLast}"
},
"400": {
"description": "Unsupported JQL clause for this mock"
}
}
}
POST /rest/api/3/search/jql
Jira Cloud — search issues by JQL (POST body)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Jira Cloud — search issues by JQL (POST body)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"jql": {
"type": "string"
}
}
}
}
}
},
"responses": {
"200": {
"description": "{issues:[...], nextPageToken, isLast}"
}
}
}
GET /api/now/table/sn_hr_core_profile
ServiceNow Table API — HR profile lookup
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — HR profile lookup",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "user.emailIN{{{user_email}}}"
}
],
"responses": {
"200": {
"description": "{result:[...]}"
}
}
}
GET /api/now/table/sys_user
ServiceNow Table API — sys_user lookup by email or manager.email
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — sys_user lookup by email or manager.email",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "manager.email={{{manager_email}}}^active=true"
}
],
"responses": {
"200": {
"description": "{result:[...]}"
}
}
}
GET /api/now/table/rm_story
ServiceNow Table API — rm_story lookup for a manager's direct reports (Snow_Get_Reportee_Stories, Servicenow_get_work_items_of_my_reportees)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — rm_story lookup for a manager's direct reports (Snow_Get_Reportee_Stories, Servicenow_get_work_items_of_my_reportees)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "assigned_to.manager.email=alice.smith0@acme.com^state=2"
},
{
"in": "query",
"name": "sysparm_fields",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_display_value",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_limit",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "{result:[{number, short_description, description, acceptance_criteria, assigned_to:{display_value,link}, assignment_group:{display_value,link}, project:{display_value,link}, state, blocked, blocked_reason, priority, story_points, end_date, epic, sprint, \"sprint.start_date\", \"sprint.end_date\", \"sprint.committed_points\", \"sprint.story_points\", \"sprint.actual_points\", sys_id, sys_updated_on}]}"
}
}
}
GET /api/now/table/rm_defect
ServiceNow Table API — rm_defect lookup for a manager's direct reports (Snow_Get_Reportee_Defects, Servicenow_get_work_items_of_my_reportees)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — rm_defect lookup for a manager's direct reports (Snow_Get_Reportee_Defects, Servicenow_get_work_items_of_my_reportees)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "assigned_to.manager.email=alice.smith0@acme.com^end_date<2026-08-11^stateNOT IN3,4,7"
},
{
"in": "query",
"name": "sysparm_fields",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_display_value",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_limit",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "{result:[{number, short_description, description, assigned_to:{display_value,link}, assignment_group:{display_value,link}, state, priority, end_date, sprint, \"sprint.start_date\", \"sprint.end_date\", \"sprint.committed_points\", sys_id, sys_updated_on}]}"
}
}
}
GET /api/now/stats/resource_aggregate_weekly
ServiceNow Stats API — per-person, per-project resource allocation aggregates for a manager's direct reports (Servicenow_Get_Team_Project_Allocations, plugin Team_Project_Allocations)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Stats API — per-person, per-project resource allocation aggregates for a manager's direct reports (Servicenow_Get_Team_Project_Allocations, plugin Team_Project_Allocations)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "user.manager.email=alice.smith0@acme.com^taskISNOTEMPTY^task.active=true"
},
{
"in": "query",
"name": "sysparm_group_by",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_sum_fields",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_avg_fields",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_min_fields",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_max_fields",
"schema": {
"type": "string"
}
},
{
"in": "query",
"name": "sysparm_display_value",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "{result:[{stats:{max:{week_starts_on}, avg:{fte, utilization}, min:{week_starts_on}, sum:{hours, man_days}}, groupby_fields:[{field:'category',value}, {field:'task',value}, {field:'task.percent_complete', value?}, {field:'task.short_description',value}, {field:'task.state',value}, {field:'task.sys_class_name',value}, {field:'user',value}]}]} — this is ServiceNow's aggregate Stats API (/api/now/stats/{table}), NOT the Table API rm_story/rm_defect use — a different real envelope, grouped rows with sum/avg/min/max, not raw records. 'category' and 'utilization' are returned by the real endpoint even though sysparm_group_by/sysparm_avg_fields don't request them. A dot-walked groupby field (e.g. task.percent_complete) omits its 'value' key entirely when null, rather than returning value:'' — only the non-dot-walked 'task' field gets an explicit empty string."
}
}
}
GET /api/snc/manager_hub/reportees/{email}
ServiceNow Custom API — a manager's direct reports
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — a manager's direct reports",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "email",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "{result:[...]}"
}
}
}
GET /api/sn_mgr_exp/manager_view_as/users
ServiceNow Custom API — resolve a reportee by name (direct + skip-level + matrix) (Resolve_Reportee)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — resolve a reportee by name (direct + skip-level + matrix) (Resolve_Reportee)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "mwUserEmail",
"required": true,
"schema": {
"type": "string"
},
"example": "alice.smith0@acme.com"
},
{
"in": "query",
"name": "name",
"required": true,
"schema": {
"type": "string"
},
"example": "Bob"
}
],
"responses": {
"200": {
"description": "{result:{success, count, users:[{user_name, display_name, title, department, email, sys_id, location}]}}"
}
}
}
GET /api/sn_mgr_exp/manager_context/resolve
ServiceNow Custom API — the caller's depth, persona and direct/skip/total + secondary report counts (resolve)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — the caller's depth, persona and direct/skip/total + secondary report counts (resolve)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"responses": {
"200": {
"description": "{result:{depth, persona, primary_count:{direct, skip, total}, secondary_manager, secondary_count:{total}}}"
}
}
}
GET /api/sn_mgr_exp/manager_context/lookupTeam
ServiceNow Custom API — paginated direct or secondary (dotted-line) reportees of a manager (lookupTeam)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — paginated direct or secondary (dotted-line) reportees of a manager (lookupTeam)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "manager_email",
"required": true,
"schema": {
"type": "string"
},
"example": "alice.smith0@acme.com"
},
{
"in": "query",
"name": "team_type",
"required": false,
"schema": {
"type": "string",
"enum": [
"direct",
"secondary"
],
"default": "direct"
}
},
{
"in": "query",
"name": "page_num",
"required": false,
"schema": {
"type": "integer",
"default": 1
}
}
],
"responses": {
"200": {
"description": "{result:{users:[{name, email}], page, total_pages}}"
}
}
}
GET /api/sn_mgr_exp/manager_context/lookupReportee
ServiceNow Custom API — search the caller's team by name; each match tagged direct/skip/secondary (lookupReportee)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — search the caller's team by name; each match tagged direct/skip/secondary (lookupReportee)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "employee_name",
"required": true,
"schema": {
"type": "string"
},
"example": "Bob"
}
],
"responses": {
"200": {
"description": "{result:{users:[{sys_id, name, email, type}]}}"
}
}
}
POST /api/sn_mgr_exp/manager_view_as/search
ServiceNow Custom API — search knowledge articles as a reportee (Manager_View_As_Reportee)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — search knowledge articles as a reportee (Manager_View_As_Reportee)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"mwUserEmail": {
"type": "string"
},
"view_as_user_id": {
"type": "string"
},
"query": {
"type": "string"
}
}
},
"example": {
"mwUserEmail": "alice.smith0@acme.com",
"view_as_user_id": "3f9c2a1e8b7d4650a1c2e3f4a5b6c7d8",
"query": "remote work"
}
}
}
},
"responses": {
"200": {
"description": "{result:{total_count, view_as_user_id, view_as_user_name, articles_markdown, articles:[...]}}"
}
}
}
POST /api/sn_mgr_exp/mw_holiday_api/holiday_list
ServiceNow Custom API — a reportee's or team's upcoming public holidays (View_Holiday_List)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Custom API — a reportee's or team's upcoming public holidays (View_Holiday_List)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"moveworks_user_email": {
"type": "string"
},
"employee_sys_id": {
"type": "string"
},
"lookahead_days": {
"type": "string"
},
"filter_country": {
"type": "string"
},
"team_view": {
"type": "string"
},
"current_date": {
"type": "string",
"description": "Optional. Unix epoch seconds (the expected form — e.g. Bender's TIME()) or an ISO date/datetime the caller considers 'today', used instead of the server's own clock. The calendar day is extracted in UTC — a datetime with a non-UTC offset near midnight can land on a different day than intended; prefer epoch seconds or a date-only string (YYYY-MM-DD). Falls back to the real current time if omitted, empty, or unparseable."
}
}
},
"example": {
"moveworks_user_email": "alice.smith0@acme.com",
"employee_sys_id": "9a3f2b1c4d5e6f708192a3b4c5d6e7f8",
"lookahead_days": "365",
"filter_country": "US",
"team_view": "false"
}
}
}
},
"responses": {
"200": {
"description": "{result:{success, team_size, count, searched_as, error, error_code, results:{holiday:[...]}}}"
}
}
}
POST /ccx/api/wql/v1/{tenant}/data
Workday WQL — allWorkers / allActiveAndTerminatedWorkers / learningEnrollments / indexedLearningAssignmentRecords
A `WHERE` clause may AND multiple conditions (`field = '...'`, `field IN (...)`, `field >= "..."`) — e.g. `learner IN (...) AND cf_LearningRegistrationDate >= "2026-01-01"`.
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Workday WQL — allWorkers / allActiveAndTerminatedWorkers / learningEnrollments / indexedLearningAssignmentRecords",
"description": "A `WHERE` clause may AND multiple conditions (`field = '...'`, `field IN (...)`, `field >= \"...\"`) — e.g. `learner IN (...) AND cf_LearningRegistrationDate >= \"2026-01-01\"`.",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "tenant",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"query": {
"type": "string"
}
},
"example": {
"query": "SELECT workdayID, fullName, email_PrimaryWork, employeeID, supervisoryOrganization FROM allWorkers WHERE email_PrimaryWork = 'alice.smith0@acme.com'"
}
}
}
}
},
"responses": {
"200": {
"description": "{data:[...], total}"
},
"400": {
"description": "Unsupported WQL query for this mock"
}
}
}
GET /api/v1/{tenant}/workers/{workerId}/directReports
Workday REST — a worker's direct reports
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Workday REST — a worker's direct reports",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "tenant",
"required": true,
"schema": {
"type": "string"
}
},
{
"in": "path",
"name": "workerId",
"required": true,
"schema": {
"type": "string"
},
"example": "WD-0001"
}
],
"responses": {
"200": {
"description": "{total, directReports:[...]}"
}
}
}
GET /api/absenceManagement/v5/{tenant}/workers/{workerId}/leavesOfAbsence
Workday Absence Management REST — a worker's in-progress (active or upcoming) leaves of absence (Workday_Get_Worker_LOA)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Workday Absence Management REST — a worker's in-progress (active or upcoming) leaves of absence (Workday_Get_Worker_LOA)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "tenant",
"required": true,
"schema": {
"type": "string"
},
"example": "bcone_gms1"
},
{
"in": "path",
"name": "workerId",
"required": true,
"schema": {
"type": "string"
},
"example": "WD-0004"
},
{
"in": "query",
"name": "status",
"schema": {
"type": "string"
},
"example": "e2d08afc53614c37b32b31270bb8bee3"
},
{
"in": "query",
"name": "fromDate",
"schema": {
"type": "string",
"format": "date"
},
"example": "2026-01-01"
},
{
"in": "query",
"name": "toDate",
"schema": {
"type": "string",
"format": "date"
},
"example": "2026-06-06"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer"
}
},
{
"in": "query",
"name": "offset",
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "{total, data:[{id, worker:{id,descriptor}, leaveType:{id,descriptor}, status:{id,descriptor}, firstDayOfLeave, lastDayOfWork, estimatedLastDayOfLeave, leaveImpactFields, additionalFields, ...}]}"
},
"404": {
"description": "No worker found for id"
}
}
}
GET /ccx/api/absenceManagement/v1/{tenant}/workers/{workerId}/timeOffDetails
Workday Absence Management REST — a worker's individual time-off (PTO) entries (Workday_Get_Worker_PTO)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Workday Absence Management REST — a worker's individual time-off (PTO) entries (Workday_Get_Worker_PTO)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "tenant",
"required": true,
"schema": {
"type": "string"
},
"example": "bcone_gms1"
},
{
"in": "path",
"name": "workerId",
"required": true,
"schema": {
"type": "string"
},
"example": "WD-0001"
},
{
"in": "query",
"name": "fromDate",
"schema": {
"type": "string",
"format": "date"
},
"example": "2026-01-01"
},
{
"in": "query",
"name": "toDate",
"schema": {
"type": "string",
"format": "date"
},
"example": "2026-01-08"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer"
},
"example": 50
}
],
"responses": {
"200": {
"description": "{total, data:[{id, date, quantity, unitOfTime, timeOffType:{id,descriptor}, status:{id,descriptor}, worker:{id,descriptor}}]}"
},
"404": {
"description": "No worker found for id"
}
}
}
GET /odata/v2/User
SAP SuccessFactors OData v2 — User entity
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "SAP SuccessFactors OData v2 — User entity",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"example": "manager eq 'alice.smith0@acme.com'"
}
],
"responses": {
"200": {
"description": "{d:{results:[...]}}"
}
}
}
GET /odata/v2/Background_Certificates
SAP SuccessFactors OData v2 — Background_Certificates entity
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "SAP SuccessFactors OData v2 — Background_Certificates entity",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "$filter",
"schema": {
"type": "string"
},
"example": "userId eq 'SF0001'"
}
],
"responses": {
"200": {
"description": "{d:{results:[...]}}"
}
}
}
GET /api/now/table/sn_egd_act_discussion
ServiceNow Table API — find the active 1:1 discussion record for an employee (Fetch_sys_id_of_the_Discussion_record)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — find the active 1:1 discussion record for an employee (Fetch_sys_id_of_the_Discussion_record)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "discussion_series.employee.user.sys_id={{{employee_sysid}}}^active=true"
},
{
"in": "query",
"name": "sysparm_fields",
"schema": {
"type": "string"
},
"example": "sys_id"
},
{
"in": "query",
"name": "sysparm_limit",
"schema": {
"type": "string"
},
"example": "1"
},
{
"in": "query",
"name": "sysparm_display_value",
"schema": {
"type": "string"
},
"example": "true"
}
],
"responses": {
"200": {
"description": "{result:[...]}"
},
"400": {
"description": "sysparm_query missing the required employee sys_id clause"
}
}
}
PATCH /api/now/table/sn_egd_act_discussion/{sys_id}
ServiceNow Table API — save a generated brief onto a discussion record's u_agenda field (Servicenow_Save_Brief_on_Conversation_Record)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — save a generated brief onto a discussion record's u_agenda field (Servicenow_Save_Brief_on_Conversation_Record)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "sys_id",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"u_agenda": {
"type": "string"
}
}
},
"example": {
"u_agenda": "Discussed Q3 goals and career growth plan."
}
}
}
},
"responses": {
"200": {
"description": "{result:{...full DiscussionRecord wire shape}}"
},
"404": {
"description": "No record with that sys_id"
}
}
}
GET /api/now/table/sn_employee_profile
ServiceNow Table API — resolve a user's Employee Profile sys_id (get_employee_profile_details)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — resolve a user's Employee Profile sys_id (get_employee_profile_details)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "user={{{user_id}}}"
},
{
"in": "query",
"name": "sysparm_limit",
"schema": {
"type": "string"
},
"example": "1"
},
{
"in": "query",
"name": "sysparm_fields",
"schema": {
"type": "string"
},
"example": "number, sys_id, hr_profile"
}
],
"responses": {
"200": {
"description": "{result:[{number, sys_id, hr_profile}]}"
},
"400": {
"description": "sysparm_query missing the required user=<sys_id> clause"
}
}
}
GET /api/now/table/sn_egd_act_talking_point
ServiceNow Table API — list a manager's open talking points for a reportee (list_talking_points)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — list a manager's open talking points for a reportee (list_talking_points)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "sysparm_query",
"required": true,
"schema": {
"type": "string"
},
"example": "added_by={{{added_by}}}^u_added_for={{{u_added_for}}}^active=true"
},
{
"in": "query",
"name": "sysparm_fields",
"schema": {
"type": "string"
},
"example": "sys_id,title,sys_created_on"
},
{
"in": "query",
"name": "sysparm_limit",
"schema": {
"type": "string"
},
"example": "100"
}
],
"responses": {
"200": {
"description": "{result:[...]}"
},
"400": {
"description": "sysparm_query missing added_by=<x>^u_added_for=<y>"
}
}
}
POST /api/now/table/sn_egd_act_talking_point
ServiceNow Table API — create a new talking point (create_talking_point)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — create a new talking point (create_talking_point)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"title",
"added_by",
"u_added_for"
],
"properties": {
"title": {
"type": "string"
},
"added_by": {
"type": "string"
},
"u_added_for": {
"type": "string"
},
"active": {
"type": "string"
}
}
},
"example": {
"title": "Discuss sprint velocity dip in Sprint 24",
"added_by": "976865a397ff095020dbbdc3f153af78",
"u_added_for": "f714756f97ff095020dbbdc3f153afb4",
"active": "true"
}
}
}
},
"responses": {
"201": {
"description": "{result:{...full TalkingPoint wire shape}}"
}
}
}
PATCH /api/now/table/sn_egd_act_talking_point/{sys_id}
ServiceNow Table API — edit a talking point's title, or soft-delete it via active=false (update_talking_point / delete_talking_point share this route)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Table API — edit a talking point's title, or soft-delete it via active=false (update_talking_point / delete_talking_point share this route)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "sys_id",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"active": {
"type": "string"
}
}
},
"example": {
"title": "Discuss updated sprint plan"
}
}
}
},
"responses": {
"200": {
"description": "{result:{...full TalkingPoint wire shape}}"
},
"404": {
"description": "No record with that sys_id"
}
}
}
GET /api/sn_jny/unified_journey/sn_mx/users/{user_id}/journeys
ServiceNow Unified Journey (sn_jny) — a user's onboarding/career journeys (Fetch_Journey_Details)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "ServiceNow Unified Journey (sn_jny) — a user's onboarding/career journeys (Fetch_Journey_Details)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "path",
"name": "user_id",
"required": true,
"schema": {
"type": "string"
},
"description": "ServiceNow sys_id of the employee."
}
],
"responses": {
"200": {
"description": "{result:{status, journeys:[...]}}"
}
}
}
GET /retrieve_contents
Galileo_Manager_Coaching_Server MCP tool — retrieve Josh Bersin Company manager-coaching research chunks by natural-language query (retrieve_contents)
Authentication
[
{
"patAuth": []
}
]
Request, responses and operation details
{
"x-odata": {
"enabled": false,
"reason": "Vendor-parity fixed contract (mirrors the real MS Graph / Jira Cloud / ServiceNow Table API / Workday WQL / SFSF OData v2 wire format) — not Purple's own OData dialect. See platform/purple-suite/README.md's MS-Graph-list exception."
},
"summary": "Galileo_Manager_Coaching_Server MCP tool — retrieve Josh Bersin Company manager-coaching research chunks by natural-language query (retrieve_contents)",
"parameters": [
{
"$ref": "#/components/parameters/InstanceId"
},
{
"in": "query",
"name": "search",
"required": true,
"schema": {
"type": "string"
},
"example": "how to give feedback about missed deadlines"
},
{
"in": "query",
"name": "limit",
"schema": {
"type": "integer"
},
"example": 5,
"description": "Max chunks to return (default 5, capped at 20)."
}
],
"responses": {
"200": {
"description": "{chunks:[{id, doc_id, chunk_id, text, title, doc_title, year, relevance, arm, matched_question, citation_ref, parent_id, labels, secondary_concepts, expressed_relations}], citations:[{ref, doc_id, source, title, year, url, file_type, file_name, concept, label}], count, concept} — shape grounded in a captured real retrieve_contents response, not invented; the JSON-RPC envelope + content[].text double-encoding are added by the shared MCP transport, not this handler.",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
},
"example": {
"chunks": [
{
"id": "giving_effective_feedback_managers_guide#c_0001",
"doc_id": "giving_effective_feedback_managers_guide",
"chunk_id": "c_0001",
"text": "Effective feedback is specific, timely, and behavior-focused...",
"title": "Giving Effective Feedback: A Manager's Guide",
"doc_title": "Giving Effective Feedback: A Manager's Guide",
"year": null,
"relevance": 0.82,
"arm": "hyqe",
"matched_question": {
"question_id": "giving_effective_feedback_managers_guide#c_0001#q1",
"text": "How should a manager approach specific and timely feedback delivery?"
},
"citation_ref": 1,
"parent_id": null,
"labels": {
"content_type": "recommendation",
"evidence_type": "expert_consensus",
"semantic_role": "recommendation_directive",
"domains": [
"dom_03",
"dom_05"
],
"domain_names": [
"Performance Management",
"Employee Experience"
],
"applies_to": {
"company_size": [
"any"
],
"role": [
"line_manager",
"hrbp"
],
"industry": [
"any"
],
"maturity_stage": [
"any"
]
},
"primary_concept": "specific and timely feedback delivery",
"confidence": 0.86,
"needs_review": false,
"schema_version": "arc-label-v3-backfill"
},
"secondary_concepts": [
"behavior-focused feedback",
"feedback timing"
],
"expressed_relations": [
[
"effective feedback",
"requires",
"specific and timely delivery"
]
]
}
],
"citations": [
{
"ref": 1,
"doc_id": "giving_effective_feedback_managers_guide",
"source": "Josh Bersin Company",
"title": "Giving Effective Feedback: A Manager's Guide",
"year": null,
"url": "https://galileo-mcp-v1.azurewebsites.net/source/giving_effective_feedback_managers_guide?exp=1789489750&sig=deadbeef41c6ce57deadbeef41c6ce57",
"file_type": "html",
"file_name": "giving_effective_feedback_managers_guide.html",
"concept": null,
"label": "[1] [Josh Bersin Company] [Giving Effective Feedback: A Manager's Guide]"
}
],
"count": 1,
"concept": "concept.jbc.specific_and_timely_feedback_delivery"
}
}
}
},
"400": {
"description": "search is required"
}
}
}