Purple Suite Manager Experience API OpenAPI

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`.

This reference is readable without JavaScript. Download the OpenAPI document.

Runtime

/api/purple-suite/manager-experience

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`.

Servers

[
  {
    "url": "https://marketplace.moveworks.com/api/purple-suite/manager-experience"
  }
]

Authentication schemes

{
  "patAuth": {
    "type": "http",
    "scheme": "bearer"
  }
}

Each operation lists its security requirements. An empty security array permits an unauthenticated request. Use the scheme and headers declared for the selected contract.

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"
    }
  }
}

Schemas and reusable components

securitySchemes

patAuth

{
  "type": "http",
  "scheme": "bearer"
}

parameters

InstanceId

{
  "in": "header",
  "name": "X-Instance-ID",
  "required": true,
  "schema": {
    "type": "string"
  }
}

ImpersonateUser

{
  "in": "header",
  "name": "X-PS-Impersonate-User",
  "required": false,
  "schema": {
    "type": "string",
    "format": "email"
  },
  "description": "Optional. Act as a specific user in the target instance — the value is that user's email (must exist in the instance). Resolution order for the effective user: (1) this header, if set; (2) the instance's configured default MCP user; (3) otherwise no user is bound. User-scoped paths (e.g. /users/{email}/…) also accept the literal \"me\", and Graph-style apps serve /me/… twins of those paths (Graph: /me ≡ /users/{signed-in-user}) — both resolve to whatever this header (or the default MCP user) points at. An explicit path email always wins over the header. The unified MCP server does not send this header — it relies on the per-instance default — so it is primarily for direct REST/HTTP callers."
}

schemas

TeamMembership

{
  "type": "object",
  "description": "MEA-local team overlay. When present, the ServiceNow/Workday/SFSF directReports+reportees endpoints derive the manager→reports relationship from these rows instead of the shared roster's roster-wide `managerEmail` — so this app can present 2 realistic-sized teams even though the shared roster's random assignments would give sparser results. Not read by other Purple Suite apps.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "TEAM-A"
    },
    "team_name": {
      "type": "string",
      "example": "Engineering"
    },
    "manager_email": {
      "type": "string",
      "format": "email"
    },
    "depth": {
      "type": "integer",
      "description": "The manager's level from the org root (root = 1). Backs manager_context /resolve depth.",
      "example": 3
    },
    "member_emails": {
      "type": "array",
      "description": "Direct reports of this manager.",
      "items": {
        "type": "string",
        "format": "email"
      }
    },
    "skip_level_emails": {
      "type": "array",
      "description": "Skip-level reports (report to this manager's direct reports).",
      "items": {
        "type": "string",
        "format": "email"
      }
    },
    "secondary_member_emails": {
      "type": "array",
      "description": "Secondary / dotted-line reports for whom this manager is the secondary manager.",
      "items": {
        "type": "string",
        "format": "email"
      }
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Chat

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "CHAT-0001"
    },
    "chatType": {
      "type": "string",
      "enum": [
        "oneOnOne",
        "group"
      ],
      "example": "oneOnOne"
    },
    "topic": {
      "type": "string",
      "nullable": true,
      "example": "Q3 roadmap sync"
    },
    "member_emails": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "email"
      },
      "example": [
        "alice.smith0@acme.com",
        "bob.jones1@acme.com"
      ]
    },
    "createdDateTime": {
      "type": "string",
      "format": "date-time"
    },
    "lastUpdatedDateTime": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

ChatMessage

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "CMSG-0001"
    },
    "chat_id": {
      "type": "string",
      "example": "CHAT-0001"
    },
    "from_email": {
      "type": "string",
      "format": "email"
    },
    "from_name": {
      "type": "string"
    },
    "body_content": {
      "type": "string"
    },
    "body_content_type": {
      "type": "string",
      "enum": [
        "text",
        "html"
      ],
      "example": "text"
    },
    "createdDateTime": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Team

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "TEAM-0001"
    },
    "displayName": {
      "type": "string",
      "example": "Engineering"
    },
    "description": {
      "type": "string",
      "nullable": true
    },
    "member_emails": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "email"
      }
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Channel

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "CHAN-0001"
    },
    "team_id": {
      "type": "string",
      "example": "TEAM-0001"
    },
    "displayName": {
      "type": "string",
      "example": "General"
    },
    "description": {
      "type": "string",
      "nullable": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

ChannelMessage

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "CHMSG-0001"
    },
    "team_id": {
      "type": "string"
    },
    "channel_id": {
      "type": "string"
    },
    "from_email": {
      "type": "string",
      "format": "email"
    },
    "from_name": {
      "type": "string"
    },
    "body_content": {
      "type": "string"
    },
    "body_content_type": {
      "type": "string",
      "enum": [
        "text",
        "html"
      ]
    },
    "createdDateTime": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

MailMessage

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "MAIL-0001"
    },
    "owner_email": {
      "type": "string",
      "format": "email",
      "description": "Mailbox owner (the caller of GET /v1.0/me/messages)."
    },
    "from_email": {
      "type": "string",
      "format": "email"
    },
    "from_name": {
      "type": "string"
    },
    "to_emails": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "email"
      }
    },
    "subject": {
      "type": "string"
    },
    "body_content": {
      "type": "string"
    },
    "body_content_type": {
      "type": "string",
      "enum": [
        "text",
        "html"
      ]
    },
    "importance": {
      "type": "string",
      "enum": [
        "low",
        "normal",
        "high"
      ],
      "default": "normal"
    },
    "receivedDateTime": {
      "type": "string",
      "format": "date-time"
    },
    "isRead": {
      "type": "boolean"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

JiraProject

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "JPROJ-0001"
    },
    "key": {
      "type": "string",
      "example": "ENG"
    },
    "name": {
      "type": "string",
      "example": "Engineering"
    },
    "lead_email": {
      "type": "string",
      "format": "email"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

JiraSprint

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "SPR-0001"
    },
    "name": {
      "type": "string",
      "example": "Sprint 24"
    },
    "state": {
      "type": "string",
      "enum": [
        "active",
        "closed",
        "future"
      ]
    },
    "project_key": {
      "type": "string",
      "example": "ENG"
    },
    "startDate": {
      "type": "string",
      "format": "date"
    },
    "endDate": {
      "type": "string",
      "format": "date"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

JiraIssue

{
  "type": "object",
  "description": "Data-layer storage shape. The /rest/api/3/search/jql contract response re-shapes this into real Jira issue JSON (fields.customfield_10020 for sprint, fields.assignee without emailAddress, etc.) — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "JISS-0001"
    },
    "key": {
      "type": "string",
      "example": "ENG-142"
    },
    "project_key": {
      "type": "string",
      "example": "ENG"
    },
    "project_name": {
      "type": "string",
      "example": "Engineering"
    },
    "sprint_id": {
      "type": "string",
      "nullable": true,
      "example": "SPR-0001"
    },
    "summary": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "To Do",
        "In Progress",
        "Done"
      ]
    },
    "assignee": {
      "type": "string",
      "format": "email",
      "nullable": true,
      "description": "Internal only — the real Jira response omits assignee email (privacy masking)."
    },
    "assignee_display_name": {
      "type": "string",
      "nullable": true
    },
    "issuetype": {
      "type": "string",
      "enum": [
        "Story",
        "Bug",
        "Task"
      ]
    },
    "priority": {
      "type": "string",
      "enum": [
        "Highest",
        "High",
        "Medium",
        "Low"
      ]
    },
    "duedate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "backend"
      ]
    },
    "updated": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Story

{
  "type": "object",
  "description": "Data-layer storage shape for a ServiceNow Agile Development (rm_story) record. The /api/now/table/rm_story contract response re-shapes this into the real captured field set — reference fields (assigned_to, assignment_group) as {display_value, link}, and sprint fields dot-walked as flat literal keys (sprint.start_date, sprint.committed_points, …), matching this app's existing sys_user org-chain convention — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "STORY-0001"
    },
    "number": {
      "type": "string",
      "example": "STRY0010021"
    },
    "short_description": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "acceptance_criteria": {
      "type": "string"
    },
    "assigned_to": {
      "type": "string",
      "format": "email",
      "description": "Internal only — the contract response resolves this to the real Table API {display_value, link} reference shape."
    },
    "assignment_group": {
      "type": "string",
      "example": "Engineering"
    },
    "state_id": {
      "type": "string",
      "enum": [
        "1",
        "2",
        "3",
        "4"
      ],
      "description": "Raw rm_story choice-list value the real sysparm_query filters on (1=Draft, 2=Work in Progress, 3=Complete, 4=Cancelled)."
    },
    "state": {
      "type": "string",
      "example": "Work in Progress"
    },
    "blocked": {
      "type": "boolean",
      "example": false,
      "description": "Whether the story is currently blocked (e.g. waiting on a dependency). stories-only, not on Defect."
    },
    "blocked_reason": {
      "type": "string",
      "nullable": true,
      "example": null,
      "description": "Why the story is blocked. null when blocked is false. stories-only, not on Defect."
    },
    "priority": {
      "type": "string",
      "example": "2 - High"
    },
    "story_points": {
      "type": "number",
      "example": 8
    },
    "end_date": {
      "type": "string",
      "format": "date"
    },
    "project": {
      "type": "string",
      "nullable": true,
      "description": "Internal only — the SPM (pm_project) project this story rolls up to. The contract response resolves this to a {display_value, link} reference, matching assigned_to/assignment_group's convention."
    },
    "epic": {
      "type": "string",
      "nullable": true
    },
    "sprint_name": {
      "type": "string",
      "nullable": true
    },
    "sprint_start_date": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "sprint_end_date": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "sprint_committed_points": {
      "type": "number",
      "nullable": true
    },
    "sprint_story_points": {
      "type": "number",
      "nullable": true
    },
    "sprint_actual_points": {
      "type": "number",
      "nullable": true
    },
    "sys_updated_on": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Defect

{
  "type": "object",
  "description": "Data-layer storage shape for a ServiceNow Agile Development (rm_defect) record. The /api/now/table/rm_defect contract response re-shapes this the same way as Story — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "DEFECT-0001"
    },
    "number": {
      "type": "string",
      "example": "DFCT0010041"
    },
    "short_description": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "assigned_to": {
      "type": "string",
      "format": "email",
      "description": "Internal only — see Story.assigned_to."
    },
    "assignment_group": {
      "type": "string",
      "example": "Engineering"
    },
    "state_id": {
      "type": "string",
      "enum": [
        "1",
        "2",
        "3",
        "4",
        "7"
      ],
      "description": "Raw rm_defect choice-list value (1=Draft, 2=Work in Progress, 3=Complete, 4=Cancelled, 7=Deferred — defects carry this extra terminal state stories don't)."
    },
    "state": {
      "type": "string",
      "example": "Work in Progress"
    },
    "priority": {
      "type": "string",
      "example": "1 - Critical"
    },
    "end_date": {
      "type": "string",
      "format": "date"
    },
    "sprint_name": {
      "type": "string",
      "nullable": true
    },
    "sprint_start_date": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "sprint_end_date": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "sprint_committed_points": {
      "type": "number",
      "nullable": true
    },
    "sys_updated_on": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

ResourceAllocation

{
  "type": "object",
  "description": "Data-layer storage shape for one ServiceNow SPM resource_aggregate_weekly stats bucket (Servicenow_Get_Team_Project_Allocations, plugin Team_Project_Allocations). Every worker has an Availability and a Capacity row (no task); an allocated worker additionally has one Project/Demand Allocated row per active allocation. The /api/now/stats/resource_aggregate_weekly contract response re-shapes this into ServiceNow's real Stats API {stats, groupby_fields} envelope — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "RALLOC-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email",
      "description": "Internal only — the contract response resolves this to the groupby 'user' field's display name (full name, not email)."
    },
    "category": {
      "type": "string",
      "enum": [
        "Availability",
        "Capacity",
        "Project Allocated",
        "Demand Allocated"
      ]
    },
    "task_number": {
      "type": "string",
      "nullable": true,
      "example": "PRJ0010012",
      "description": "The project/demand number. null for Availability/Capacity rows."
    },
    "task_short_description": {
      "type": "string",
      "nullable": true
    },
    "task_state": {
      "type": "string",
      "nullable": true,
      "example": "Work in Progress"
    },
    "task_sys_class_name": {
      "type": "string",
      "nullable": true,
      "enum": [
        "Project",
        "Demand"
      ]
    },
    "task_percent_complete": {
      "type": "number",
      "nullable": true,
      "example": 25
    },
    "sum_hours": {
      "type": "number",
      "example": 120
    },
    "sum_man_days": {
      "type": "number",
      "example": 15
    },
    "avg_fte": {
      "type": "number",
      "example": 0.057692
    },
    "avg_utilization": {
      "type": "number",
      "nullable": true,
      "description": "Only meaningful on the Availability row; null on every other category."
    },
    "week_starts_on_min": {
      "type": "string",
      "format": "date"
    },
    "week_starts_on_max": {
      "type": "string",
      "format": "date"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

WorkdayLearningEnrollment

{
  "type": "object",
  "description": "Data-layer storage shape. The WQL contract response projects `contentURL` as `courseURL`, `course` as `Course`, `cf_LearningRegistrationDate` as `LearningRegistrationDate`, and `learningRecord` as `learningRecordlist` (Workday's own custom-report column-alias convention) — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "WLE-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "course": {
      "type": "string",
      "example": "Foundations of People Management"
    },
    "contentURL": {
      "type": "string",
      "nullable": true,
      "example": "https://learning.example.com/courses/foundations-of-people-management"
    },
    "registrationStatus": {
      "type": "string",
      "enum": [
        "Registered",
        "Waitlisted",
        "Cancelled"
      ]
    },
    "completionStatus": {
      "type": "string",
      "enum": [
        "Not Started",
        "In Progress",
        "Complete"
      ]
    },
    "dueDate1": {
      "type": "string",
      "format": "date"
    },
    "requiredLearningEnrollment": {
      "type": "boolean",
      "nullable": true
    },
    "cf_LearningRegistrationDate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "completionDate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "expirationDate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "learningRecord": {
      "type": "array",
      "nullable": true,
      "items": {
        "type": "object",
        "properties": {
          "retrainingCompletionType": {
            "type": "string",
            "nullable": true
          },
          "learningRecordContentType": {
            "type": "string",
            "nullable": true
          }
        }
      }
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

WorkdayLearningAssignment

{
  "type": "object",
  "description": "Data-layer storage shape for a Workday LMS learning *assignment* (what a worker was told to take), distinct from WorkdayLearningEnrollment (what a worker actually registered for). The WQL `indexedLearningAssignmentRecords` contract response projects `contentURL` as `courseURL`, `course` as `Course`, `worker_email`'s workdayID as `workdayID`, and the worker's workdayID + full name as the `learner` reference object — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "WLA-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "course": {
      "type": "string",
      "example": "Workplace Security Fundamentals"
    },
    "contentURL": {
      "type": "string",
      "nullable": true,
      "example": "https://learning.example.com/courses/workplace-security-fundamentals"
    },
    "assignmentStatus": {
      "type": "string",
      "enum": [
        "Assigned",
        "In Progress",
        "Complete"
      ]
    },
    "completionStatus": {
      "type": "string",
      "nullable": true
    },
    "dueDate": {
      "type": "string",
      "format": "date"
    },
    "required": {
      "type": "boolean",
      "nullable": true
    },
    "assignedDate": {
      "type": "string",
      "format": "date"
    },
    "assignedBy": {
      "type": "string",
      "nullable": true,
      "example": "Learning Administration"
    },
    "overdue": {
      "type": "boolean",
      "nullable": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

WorkdayCertification

{
  "type": "object",
  "description": "Data-layer storage shape. The WQL contract response re-shapes `certification`/`certification_id` into Workday's real {id,descriptor} reference object — see contract.ts. The real capture has no certificationNumber field; the contract response returns it as null for callers that project it anyway.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "WCERT-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "certification": {
      "type": "string",
      "example": "PMP",
      "description": "Short code — becomes the reference object's `descriptor`."
    },
    "certification_id": {
      "type": "string",
      "example": "CERT-PMP",
      "description": "Becomes the reference object's `id`."
    },
    "certificationName": {
      "type": "string",
      "example": "Project Management Professional"
    },
    "certifierOrIssuer": {
      "type": "string",
      "example": "PMI"
    },
    "certificationNumber": {
      "type": "string",
      "nullable": true,
      "description": "Not in the real Workday entity — always null. Present only so a WQL projection asking for it doesn't fail."
    },
    "expirationDate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "examDate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "issuedDate": {
      "type": "string",
      "format": "date"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

WorkdayLoa

{
  "type": "object",
  "description": "Data-layer storage shape for a Workday leave of absence. The Absence Management REST contract response (contract.ts) wraps `worker`/`status_id`+`status`/`leaveType_id`+`leaveType` into Workday's real {id,descriptor} reference objects.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "WLOA-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "leaveType_id": {
      "type": "string",
      "example": "MEDICAL_LOA",
      "description": "Becomes the leaveType reference object's `id`."
    },
    "leaveType": {
      "type": "string",
      "example": "Medical Leave of Absence",
      "description": "Becomes the leaveType reference object's `descriptor`."
    },
    "status_id": {
      "type": "string",
      "example": "e2d08afc53614c37b32b31270bb8bee3",
      "description": "Becomes the status reference object's `id`; the In-Progress id the real action filters on."
    },
    "status": {
      "type": "string",
      "example": "In Progress",
      "description": "Becomes the status reference object's `descriptor`."
    },
    "businessProcessStepStatus": {
      "type": "string",
      "example": "In Progress"
    },
    "firstDayOfLeave": {
      "type": "string",
      "format": "date",
      "example": "2026-06-01"
    },
    "lastDayOfWork": {
      "type": "string",
      "format": "date",
      "example": "2026-05-31"
    },
    "estimatedLastDayOfLeave": {
      "type": "string",
      "format": "date",
      "example": "2026-08-30"
    },
    "latestLeaveComment": {
      "type": "string",
      "example": "Medical leave approved; return date is an estimate pending clearance."
    },
    "leaveImpactFields": {
      "type": "object",
      "additionalProperties": {
        "type": "boolean"
      },
      "description": "Flat boolean map (schedulingEffect, absenceAccrualEffect, benefitEffect, payrollEffect, …)."
    },
    "additionalFields": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "descriptor": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      }
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

WorkdayTimeOff

{
  "type": "object",
  "description": "Data-layer storage shape for a Workday time-off (PTO) entry. The Absence Management REST contract response (contract.ts) wraps `worker`/`status_id`+`status`/`timeOffType_id`+`timeOffType` into Workday's real {id,descriptor} reference objects.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "PTO-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "date": {
      "type": "string",
      "format": "date",
      "example": "2026-08-10"
    },
    "quantity": {
      "type": "number",
      "example": 8
    },
    "unitOfTime": {
      "type": "string",
      "example": "HOURS"
    },
    "timeOffType_id": {
      "type": "string",
      "example": "VACATION",
      "description": "Becomes the timeOffType reference object's `id`."
    },
    "timeOffType": {
      "type": "string",
      "example": "Vacation",
      "description": "Becomes the timeOffType reference object's `descriptor`."
    },
    "status_id": {
      "type": "string",
      "example": "APPROVED",
      "description": "Becomes the status reference object's `id`."
    },
    "status": {
      "type": "string",
      "example": "Approved",
      "description": "Becomes the status reference object's `descriptor`; either 'Approved' or 'Submitted'."
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

SfsfCertification

{
  "type": "object",
  "description": "Data-layer storage shape, field names matching the real Background_Certificates OData entity (licenseName/institution/licenseNumber — not certification/issuingOrg/certificationNumber).",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "SFCERT-0001"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "backgroundElementId": {
      "type": "integer",
      "example": 90000
    },
    "name": {
      "type": "string",
      "example": "Certified ScrumMaster"
    },
    "description": {
      "type": "string"
    },
    "licenseName": {
      "type": "string",
      "example": "Certified ScrumMaster"
    },
    "institution": {
      "type": "string",
      "example": "Scrum Alliance"
    },
    "licenseNumber": {
      "type": "string",
      "example": "CSM-5000"
    },
    "licenseCountry": {
      "type": "string",
      "example": "USA"
    },
    "licenseState": {
      "type": "string"
    },
    "bgOrderPos": {
      "type": "string",
      "example": "1"
    },
    "lastModifiedDate": {
      "type": "string",
      "format": "date"
    },
    "startDate": {
      "type": "string",
      "format": "date"
    },
    "endDate": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

HrProfileOverride

{
  "type": "object",
  "description": "MEA-local overlay for the sn_hr_core_profile contract, seeded with one row per roster member (default date_of_birth = employment_start_date - 28y, employment_start_date = the roster's startDate) when the instance is created. Edit a row's date_of_birth/employment_start_date (e.g. via export → edit → import) to pin a specific birthday/anniversary for an eval — sn_hr_core_profile returns whatever is in this collection, falling back to the live-computed default only if a worker_email has no row at all (e.g. an instance created before this collection existed).",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "HRP-alice.smith0"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "date_of_birth": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "employment_start_date": {
      "type": "string",
      "format": "date",
      "nullable": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

JourneyTask

{
  "type": "object",
  "description": "Data-layer storage shape for one employee_tasks/manager_tasks row. The sn_jny contract response re-shapes this into ServiceNow's real task object ({task_type, ja_stage, journey_title, due_date_display_value, ...}) — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "JNY-0001-T001"
    },
    "task_type": {
      "type": "string",
      "enum": [
        "Task",
        "Approval"
      ]
    },
    "ja_stage": {
      "type": "string",
      "example": "Week 1"
    },
    "short_description": {
      "type": "string"
    },
    "due_date": {
      "type": "string",
      "format": "date"
    },
    "is_over_due": {
      "type": "boolean"
    },
    "is_optional": {
      "type": "boolean"
    },
    "order": {
      "type": "string",
      "example": "10"
    }
  }
}

DiscussionRecord

{
  "type": "object",
  "description": "Data-layer storage shape for one ServiceNow EGD Conversation Discussion (sn_egd_act_discussion) row — a manager-employee 1:1 discussion record that a saved meeting brief gets written onto. The sn_egd_act_discussion contract response re-shapes this into ServiceNow's real field set (discussion_series as a {value,link} reference, active as a string, etc.) — see contract.ts. Not every employee has one (sparse, like Journey) — that's what drives Update_1_1_Brief_on_Conversation_Record's 'no active discussion record found' branch.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "DISC-0001"
    },
    "employee_email": {
      "type": "string",
      "format": "email"
    },
    "manager_email": {
      "type": "string",
      "format": "email"
    },
    "u_agenda": {
      "type": "string",
      "description": "The saved meeting brief/agenda text.",
      "example": "Discussed Q3 goals and career growth plan."
    },
    "active": {
      "type": "boolean",
      "example": true
    },
    "title": {
      "type": "string",
      "example": "1:1 with Alex Smith"
    },
    "summary": {
      "type": "string"
    },
    "additional_details": {
      "type": "string"
    },
    "state": {
      "type": "string",
      "example": "In Progress"
    },
    "calendar_provider": {
      "type": "string",
      "nullable": true
    },
    "calendar_event_table": {
      "type": "string",
      "nullable": true
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "start_time": {
      "type": "string",
      "format": "date-time"
    },
    "end_time": {
      "type": "string",
      "format": "date-time"
    },
    "sys_mod_count": {
      "type": "integer",
      "example": 0
    },
    "sys_created_by": {
      "type": "string",
      "example": "admin"
    },
    "sys_created_on": {
      "type": "string",
      "format": "date-time"
    },
    "sys_updated_by": {
      "type": "string",
      "example": "admin"
    },
    "sys_updated_on": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

TalkingPoint

{
  "type": "object",
  "description": "Data-layer storage shape for one ServiceNow EGD Act Talking Point (sn_egd_act_talking_point) row — a manager's running agenda item to raise with a direct report in an upcoming 1:1, backing Manage_Discussion_Topics_for_an_Employee (talking_points_handler). added_by/u_added_for are Employee Profile sys_ids (sn_employee_profile), NOT sys_user sys_ids — see contract.ts's employeeProfileSysIdFor. Soft-deleted via active=false, never removed, so list_talking_points' active=true filter is the only thing that hides it.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "TP-0001"
    },
    "title": {
      "type": "string",
      "example": "Discuss sprint velocity dip in Sprint 24"
    },
    "added_by": {
      "type": "string",
      "description": "The manager's Employee Profile sys_id."
    },
    "u_added_for": {
      "type": "string",
      "description": "The reportee's Employee Profile sys_id."
    },
    "active": {
      "type": "boolean",
      "example": true
    },
    "sys_created_on": {
      "type": "string",
      "format": "date-time"
    },
    "sys_updated_on": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Journey

{
  "type": "object",
  "description": "Data-layer storage shape for a ServiceNow Unified Journey (sn_jny) record — an employee's onboarding/career journey plan, backing Fetch_Journey_Details. The contract response re-shapes every scalar into ServiceNow's {value,displayValue} pair convention and nests employee_tasks/manager_tasks as managerTasks/employeeTasks — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "JNY-0001"
    },
    "employee_email": {
      "type": "string",
      "format": "email"
    },
    "manager_email": {
      "type": "string",
      "format": "email"
    },
    "mentor_name": {
      "type": "string",
      "nullable": true
    },
    "title": {
      "type": "string",
      "example": "Alex's Engineering Onboarding"
    },
    "type": {
      "type": "string",
      "enum": [
        "Onboarding",
        "Career Development"
      ]
    },
    "status": {
      "type": "string",
      "example": "In Progress"
    },
    "state": {
      "type": "string",
      "enum": [
        "active",
        "closed"
      ]
    },
    "config_type": {
      "type": "string",
      "enum": [
        "onboarding_plan",
        "career_plan"
      ]
    },
    "journey_config_name": {
      "type": "string",
      "example": "Standard Engineering Onboarding Plan"
    },
    "created_on": {
      "type": "string",
      "format": "date-time"
    },
    "published_on": {
      "type": "string",
      "format": "date-time"
    },
    "sys_updated_on": {
      "type": "string",
      "format": "date-time"
    },
    "progress_percentage": {
      "type": "integer",
      "example": 40
    },
    "employee_tasks": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/JourneyTask"
      }
    },
    "manager_tasks": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/JourneyTask"
      }
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

MicrosoftOoO

{
  "type": "object",
  "description": "Per-worker out-of-office state shared by Reportees_MicrosoftGraph_OOO_Status and Employee_OOO_Status — both plugins call the identical real MS Graph routes (presence, mailboxSettings/automaticRepliesSetting, calendarView) for the same users, so one collection backs all of them (resolveOooOverride, contract.ts). One row per worker_email; scheduled_start/scheduled_end back presence and automaticRepliesSetting. calendarView uses calendar_start/calendar_end when set, otherwise falls back to scheduled_start/scheduled_end — set them separately when a person's calendar OOO block and mailbox auto-reply window genuinely end at different times. Event subject (and presence's outOfOfficeSettings.message/statusMessage) is derived from internal_reply_message (HTML-stripped). No row for a worker → Available / Disabled / no calendar events. auto_reply_status is matched case-insensitively against the real MS Graph lowercase values (disabled/alwaysEnabled/scheduled) — this PascalCase enum is documentation only.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "MSOOO-alice.smith0"
    },
    "worker_email": {
      "type": "string",
      "format": "email"
    },
    "is_ooo": {
      "type": "boolean",
      "example": true
    },
    "availability": {
      "type": "string",
      "enum": [
        "Available",
        "Away",
        "Busy",
        "BeRightBack",
        "DoNotDisturb",
        "Offline",
        "OutOfOffice"
      ],
      "example": "Away"
    },
    "activity": {
      "type": "string",
      "enum": [
        "Available",
        "Away",
        "InACall",
        "OutOfOffice",
        "Presenting",
        "DoNotDisturb",
        "Busy",
        "Offline"
      ],
      "example": "OutOfOffice"
    },
    "auto_reply_status": {
      "type": "string",
      "enum": [
        "Disabled",
        "AlwaysEnabled",
        "Scheduled"
      ],
      "example": "Scheduled"
    },
    "scheduled_start": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "example": "2026-07-21T00:00:00"
    },
    "scheduled_end": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "example": "2026-07-28T23:59:59"
    },
    "calendar_start": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "example": "2026-07-21T08:00:00"
    },
    "calendar_end": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "example": "2026-07-21T12:00:00"
    },
    "internal_reply_message": {
      "type": "string",
      "example": "<html>I am out of office until July 28th. For urgent matters contact my manager.</html>"
    },
    "external_reply_message": {
      "type": "string",
      "example": "I'm currently out of office with limited access to email. I'll respond when I'm back."
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

KbArticle

{
  "type": "object",
  "description": "Data-layer storage shape for Manager_View_As_Reportee's search_articles_as_reportee action. The /api/sn_mgr_exp/manager_view_as/search contract response re-shapes this into the real captured field set (kbId, number, shortDescription, snippet, articles_markdown) — see contract.ts.",
  "properties": {
    "id": {
      "type": "string",
      "readOnly": true,
      "example": "KBART-0001"
    },
    "kbId": {
      "type": "string",
      "example": "3f9c2a1e8b7d4650a1c2e3f4a5b6c7d8"
    },
    "number": {
      "type": "string",
      "example": "KB1000001"
    },
    "title": {
      "type": "string",
      "example": "Remote Work Guidelines"
    },
    "shortDescription": {
      "type": "string"
    },
    "text": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "example": [
        "remote",
        "policy"
      ]
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Employee

{
  "type": "object",
  "description": "Eval-fixture roster override for Manager_View_As_Reportee / View_Holiday_List. Empty by default — when populated (via the generic bulk-import route), contract.ts's resolveEffectiveRoster (employeeOverride.ts) builds the effective roster from these rows instead of the random 20-person roster, so a scenario's exact named org chart (including a matrixManagerId dotted-line report) is what these 2 plugins answer against.",
  "properties": {
    "id": {
      "type": "string",
      "example": "EMP-101"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "managerId": {
      "type": "string",
      "nullable": true,
      "example": "EMP-100"
    },
    "matrixManagerId": {
      "type": "string",
      "nullable": true,
      "description": "Dotted-line manager id — counts as a direct report for orgDescendants alongside managerId."
    },
    "department": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "example": "San Diego"
    },
    "country": {
      "type": "string",
      "description": "Free text — not limited to the random roster's IN|AU|US.",
      "example": "India"
    },
    "region": {
      "type": "string"
    },
    "businessUnit": {
      "type": "string"
    },
    "team": {
      "type": "string"
    },
    "employment_type": {
      "type": "string",
      "description": "Free text (e.g. full_time, part_time, contractor, intern) — an eval fixture can set anything. Defaults to full_time if omitted.",
      "example": "full_time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Holiday

{
  "type": "object",
  "description": "Both this app's built-in recurring calendar rows (seeded by default: country/month/day, no year) AND any imported eval-fixture one-off rows (start_date/end_date) live in this one collection — holidays.ts's resolveEffectiveHolidays merges the two per country: a one-off row only overrides the recurring calendar on the specific date it lands on, so the rest of that country's recurring holidays still show. The /api/sn_mgr_exp/mw_holiday_api/holiday_list contract response expands either shape into concrete, lookahead-windowed dates with is_today.",
  "properties": {
    "id": {
      "type": "string",
      "example": "HOL-0001"
    },
    "name": {
      "type": "string",
      "example": "Diwali"
    },
    "country": {
      "type": "string",
      "description": "IN|AU|US for built-in rows; free text for imported fixture rows.",
      "example": "India"
    },
    "month": {
      "type": "integer",
      "minimum": 1,
      "maximum": 12,
      "nullable": true,
      "description": "Built-in recurring rows only."
    },
    "day": {
      "type": "integer",
      "minimum": 1,
      "maximum": 31,
      "nullable": true,
      "description": "Built-in recurring rows only."
    },
    "start_date": {
      "type": "string",
      "format": "date",
      "nullable": true,
      "description": "Imported one-off fixture rows only."
    },
    "end_date": {
      "type": "string",
      "format": "date",
      "nullable": true,
      "description": "Imported one-off fixture rows only."
    },
    "date_display": {
      "type": "string",
      "nullable": true,
      "example": "Sun, Nov 8 2026"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time",
      "readOnly": true
    }
  }
}

Document metadata and extensions

{
  "openapi": "3.0.0",
  "info": {
    "title": "Purple Suite Manager Experience API",
    "description": "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.\n\n---\n\n**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`.",
    "version": "1.0.0"
  },
  "security": [
    {
      "patAuth": []
    }
  ]
}
Interactive API explorer (requires JavaScript)