Purple Pages API Documentation

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

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

Overview

--- **Acting as a user (`X-PS-Impersonate-User`).** Every endpoint accepts an optional `X-PS-Impersonate-User` request header whose value is the email of the instance user to act as. The effective user resolves in this order: the header if present, else the instance's configured default MCP user, else none. User-scoped paths additionally accept the literal `me` in place of an email, and Graph-style apps also serve `/me/…` twins of their `/users/{email}/…` paths that resolve the same way. This header is honored by all operations but is intentionally omitted from each operation's parameter list so it is not surfaced as a per-tool argument by MCP clients; see the `ImpersonateUser` entry under `components.parameters`.

Endpoints

GET /api/purple-suite/pages/pages

List wiki pages in the Purple Pages workspace

Purple Pages is the Notion-style knowledge workspace: a Page is a rich-text document (title, emoji, block content, sharing) that can nest under a parent_id. Use this to find documentation, meeting notes or specs; structured tabular data lives in pages__list__databases / pages__list__db_records instead. Supports server-side OData querying — $filter, $search, $orderby, $select, $top, $skip, $count (MCP clients see these as _filter, _search, _orderby, _select, _top, _skip, _count because $ is not a legal tool-input key). Example: $filter=parent_id eq null for top-level pages, or $search=onboarding.

Parameters

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

Responses

200
Paginated list

application/json

  • data array

    array of:

    Page

    • id string
    • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
    • title string
    • emoji string
    • createdBy string
    • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
    • shared boolean
    • sharedWith array

      array of:

      string

    • permissions string
    • content arrayRich-text block content of the page
      Rich-text block content of the page

      array of:

      PageBlock

      • id stringBlock UUID
      • type string
      • props object
        • textColor string
        • backgroundColor string
        • textAlignment string
        • level integerHeading level (1–3), present only on heading blocks
      • content array

        array of:

        • type string
        • text string
        • styles object
      • children arrayNested child blocks
        Nested child blocks

        array of:

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

POST /api/purple-suite/pages/pages

Create a wiki page

Creates a new document in the Purple Pages workspace with a title and optional emoji, block content, parent_id (to nest it under another page) and sharing settings. Create a Database instead if the user wants rows and columns rather than prose.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string

GET /api/purple-suite/pages/pages/{id}

Get one wiki page with its content

Fetches a single Page by id, including its full block content array — this is how you read what a page actually says. List operations return the same shape, so use this when you already have the page id.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/pages/pages/{id}

Delete a wiki page

DESTRUCTIVE and irreversible: permanently deletes the page and its content (there is no trash or undo). Child pages that reference it as parent_id are orphaned and its comments are left dangling. Confirm with the user before calling.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/pages/pages/{id}

Edit a wiki page's title, content or sharing

Partially updates a Page: title, emoji, block content, lastEditedAt, shared/sharedWith and permissions. This is the tool for editing what a page SAYS. To change where a page sits in the hierarchy, use pages__move__pages rather than patching parent_id.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/pages/databases

List structured databases in Purple Pages

A Database is a Notion-style structured table in the workspace (name, viewType table/board/gallery/list/calendar, and a schema listing its column names) — for example a Project Tracker or Vendor Directory. This returns the table definitions only; the rows inside them come from pages__list__db_records. Supports server-side OData querying — $filter, $search, $orderby, $select, $top, $skip, $count (MCP clients see these as _filter, _search, _orderby, _select, _top, _skip, _count because $ is not a legal tool-input key).

Parameters

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

Responses

200
Paginated list

application/json

  • data array

    array of:

    Database

    • id string
    • name string
    • createdBy string
    • viewType string
    • schema arrayOrdered list of column/property names
      Ordered list of column/property names

      array of:

      string

    • shared boolean
    • sharedWith array

      array of:

      string

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

POST /api/purple-suite/pages/databases

Create a structured database

Creates a new Notion-style table in the workspace: name, viewType and a schema array of column names. Creates the container only — add rows afterwards with pages__create__db_records.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Database

  • id string
  • name string
  • createdBy string
  • viewType string
  • schema arrayOrdered list of column/property names
    Ordered list of column/property names

    array of:

    string

  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Database

  • id string
  • name string
  • createdBy string
  • viewType string
  • schema arrayOrdered list of column/property names
    Ordered list of column/property names

    array of:

    string

  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/pages/databases/{id}

Get one database definition

Fetches a single Database by id with its schema (column names), viewType and sharing. Call this before writing records so the field names you send match the table's schema.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Database

  • id string
  • name string
  • createdBy string
  • viewType string
  • schema arrayOrdered list of column/property names
    Ordered list of column/property names

    array of:

    string

  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/pages/databases/{id}

Delete a structured database

DESTRUCTIVE and irreversible: removes the table definition. Its records are not deleted with it and become orphaned rows pointing at a missing databaseId, so confirm with the user first.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/pages/databases/{id}

Update a database's name, view or schema

Partially updates the table definition (name, viewType, schema columns, sharing). Editing the schema does not rewrite existing rows — change row values with pages__update__db_records.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Database

  • id string
  • name string
  • createdBy string
  • viewType string
  • schema arrayOrdered list of column/property names
    Ordered list of column/property names

    array of:

    string

  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Database

  • id string
  • name string
  • createdBy string
  • viewType string
  • schema arrayOrdered list of column/property names
    Ordered list of column/property names

    array of:

    string

  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/pages/db-records

List rows inside Purple Pages databases

Returns the actual rows of the workspace's Notion-style tables — each DbRecord belongs to a databaseId and carries that table's user-defined fields (title, status, owner, priority, severity, dueDate, …). Almost always scope it with the databaseId query param, or you get rows from every table at once. Supports server-side OData querying — $filter, $search, $orderby, $select, $top, $skip, $count (MCP clients see these as _filter, _search, _orderby, _select, _top, _skip, _count because $ is not a legal tool-input key). Example: databaseId=<id> with $filter=status eq 'In Progress'.

Parameters

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

Responses

200
Paginated list

application/json

  • data array

    array of:

    DbRecord

    A single row/record inside a Purple Pages database. The shape of user-defined fields (e.g. status, owner, priority) mirrors the database schema and varies per database type.
    • id string
    • databaseId stringID of the parent Database document
    • title stringPrimary title / name of the record
    • status string
    • owner stringOwner email or name (present on Project Tracker records)
    • dueDate string
    • priority stringPriority flag (present on Project Tracker records)
    • severity stringSeverity level (present on Bug Tracker records)
    • assignee stringAssignee email (present on Bug Tracker records)
    • component stringAffected component (present on Bug Tracker records)
    • author stringContent author email (present on Content Calendar records)
    • publishDate stringScheduled publish date (present on Content Calendar records)
    • channel stringDistribution channel (present on Content Calendar records)
    • category stringVendor category (present on Vendor Directory records)
    • contact stringVendor contact email (present on Vendor Directory records)
    • contractStatus stringContract status (present on Vendor Directory records)
    • annualValue stringAnnual contract value string (present on Vendor Directory records)
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/pages/db-records

Add a row to a Purple Pages database

Creates a record inside an existing database — set databaseId to the parent table and supply fields matching that table's schema (check it with pages__get__databases first). Use this for tracker rows; use pages__create__pages for a prose document.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

DbRecord

A single row/record inside a Purple Pages database. The shape of user-defined fields (e.g. status, owner, priority) mirrors the database schema and varies per database type.
  • id string
  • databaseId stringID of the parent Database document
  • title stringPrimary title / name of the record
  • status string
  • owner stringOwner email or name (present on Project Tracker records)
  • dueDate string
  • priority stringPriority flag (present on Project Tracker records)
  • severity stringSeverity level (present on Bug Tracker records)
  • assignee stringAssignee email (present on Bug Tracker records)
  • component stringAffected component (present on Bug Tracker records)
  • author stringContent author email (present on Content Calendar records)
  • publishDate stringScheduled publish date (present on Content Calendar records)
  • channel stringDistribution channel (present on Content Calendar records)
  • category stringVendor category (present on Vendor Directory records)
  • contact stringVendor contact email (present on Vendor Directory records)
  • contractStatus stringContract status (present on Vendor Directory records)
  • annualValue stringAnnual contract value string (present on Vendor Directory records)
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

DbRecord

A single row/record inside a Purple Pages database. The shape of user-defined fields (e.g. status, owner, priority) mirrors the database schema and varies per database type.
  • id string
  • databaseId stringID of the parent Database document
  • title stringPrimary title / name of the record
  • status string
  • owner stringOwner email or name (present on Project Tracker records)
  • dueDate string
  • priority stringPriority flag (present on Project Tracker records)
  • severity stringSeverity level (present on Bug Tracker records)
  • assignee stringAssignee email (present on Bug Tracker records)
  • component stringAffected component (present on Bug Tracker records)
  • author stringContent author email (present on Content Calendar records)
  • publishDate stringScheduled publish date (present on Content Calendar records)
  • channel stringDistribution channel (present on Content Calendar records)
  • category stringVendor category (present on Vendor Directory records)
  • contact stringVendor contact email (present on Vendor Directory records)
  • contractStatus stringContract status (present on Vendor Directory records)
  • annualValue stringAnnual contract value string (present on Vendor Directory records)
  • createdAt string
  • updatedAt string

GET /api/purple-suite/pages/db-records/{id}

Get one database row

Fetches a single DbRecord by id with all of its field values. Use it after locating the row with pages__list__db_records.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

DbRecord

A single row/record inside a Purple Pages database. The shape of user-defined fields (e.g. status, owner, priority) mirrors the database schema and varies per database type.
  • id string
  • databaseId stringID of the parent Database document
  • title stringPrimary title / name of the record
  • status string
  • owner stringOwner email or name (present on Project Tracker records)
  • dueDate string
  • priority stringPriority flag (present on Project Tracker records)
  • severity stringSeverity level (present on Bug Tracker records)
  • assignee stringAssignee email (present on Bug Tracker records)
  • component stringAffected component (present on Bug Tracker records)
  • author stringContent author email (present on Content Calendar records)
  • publishDate stringScheduled publish date (present on Content Calendar records)
  • channel stringDistribution channel (present on Content Calendar records)
  • category stringVendor category (present on Vendor Directory records)
  • contact stringVendor contact email (present on Vendor Directory records)
  • contractStatus stringContract status (present on Vendor Directory records)
  • annualValue stringAnnual contract value string (present on Vendor Directory records)
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/pages/db-records/{id}

Delete a database row

DESTRUCTIVE and irreversible: permanently removes the row from its database, with no trash or undo. If the intent is to mark work finished, patch its status field instead.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/pages/db-records/{id}

Update fields on a database row

Partially updates one row in a Purple Pages database — this is how you change a tracker item's status, owner, priority or due date. Send only the fields you want to change; unspecified fields are preserved.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

DbRecord

A single row/record inside a Purple Pages database. The shape of user-defined fields (e.g. status, owner, priority) mirrors the database schema and varies per database type.
  • id string
  • databaseId stringID of the parent Database document
  • title stringPrimary title / name of the record
  • status string
  • owner stringOwner email or name (present on Project Tracker records)
  • dueDate string
  • priority stringPriority flag (present on Project Tracker records)
  • severity stringSeverity level (present on Bug Tracker records)
  • assignee stringAssignee email (present on Bug Tracker records)
  • component stringAffected component (present on Bug Tracker records)
  • author stringContent author email (present on Content Calendar records)
  • publishDate stringScheduled publish date (present on Content Calendar records)
  • channel stringDistribution channel (present on Content Calendar records)
  • category stringVendor category (present on Vendor Directory records)
  • contact stringVendor contact email (present on Vendor Directory records)
  • contractStatus stringContract status (present on Vendor Directory records)
  • annualValue stringAnnual contract value string (present on Vendor Directory records)
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

DbRecord

A single row/record inside a Purple Pages database. The shape of user-defined fields (e.g. status, owner, priority) mirrors the database schema and varies per database type.
  • id string
  • databaseId stringID of the parent Database document
  • title stringPrimary title / name of the record
  • status string
  • owner stringOwner email or name (present on Project Tracker records)
  • dueDate string
  • priority stringPriority flag (present on Project Tracker records)
  • severity stringSeverity level (present on Bug Tracker records)
  • assignee stringAssignee email (present on Bug Tracker records)
  • component stringAffected component (present on Bug Tracker records)
  • author stringContent author email (present on Content Calendar records)
  • publishDate stringScheduled publish date (present on Content Calendar records)
  • channel stringDistribution channel (present on Content Calendar records)
  • category stringVendor category (present on Vendor Directory records)
  • contact stringVendor contact email (present on Vendor Directory records)
  • contractStatus stringContract status (present on Vendor Directory records)
  • annualValue stringAnnual contract value string (present on Vendor Directory records)
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/pages/comments

List comments left on wiki pages

Returns Notion-style page comments — body, author (createdBy), the page_id they hang off and an optional discussion_id thread. Scope with the page_id query param to read one page's discussion; without it you get comments across the whole workspace. Supports server-side OData querying — $filter, $search, $orderby, $select, $top, $skip, $count (MCP clients see these as _filter, _search, _orderby, _select, _top, _skip, _count because $ is not a legal tool-input key).

Parameters

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

Responses

200
Paginated list

application/json

  • data array

    array of:

    Comment

    A comment attached to a page (Notion-style page comment).
    • id string
    • page_id stringID of the page this comment is attached to
    • discussion_id stringDiscussion/thread this comment belongs to; null for a top-level page comment
    • body stringComment text
    • createdBy string
    • createdAt string
    • updatedAt string
  • nextCursor stringCursor for the next page, or null on the last page. With $top/$skip this is the next $skip value; otherwise a keyset cursor.
  • total integerTotal documents in the collection.
  • @odata.count integerPresent only when $count=true: total matches after $filter/$search.
  • @odata.truncated booleanPresent and true only when the collection exceeded the in-memory query cap and results may be incomplete.
400
Invalid OData query (e.g. malformed $filter)

POST /api/purple-suite/pages/comments

Comment on a wiki page

Adds a comment to a page: set page_id to the target page and body to the comment text (pass discussion_id to reply within an existing thread). This annotates the page without changing it — to edit the page body itself use pages__update__pages.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Comment

A comment attached to a page (Notion-style page comment).
  • id string
  • page_id stringID of the page this comment is attached to
  • discussion_id stringDiscussion/thread this comment belongs to; null for a top-level page comment
  • body stringComment text
  • createdBy string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Comment

A comment attached to a page (Notion-style page comment).
  • id string
  • page_id stringID of the page this comment is attached to
  • discussion_id stringDiscussion/thread this comment belongs to; null for a top-level page comment
  • body stringComment text
  • createdBy string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/pages/comments/{id}

Get one page comment

Fetches a single comment by id with its body, author and parent page_id. Use it after finding the comment via pages__list__comments.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Comment

A comment attached to a page (Notion-style page comment).
  • id string
  • page_id stringID of the page this comment is attached to
  • discussion_id stringDiscussion/thread this comment belongs to; null for a top-level page comment
  • body stringComment text
  • createdBy string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/pages/comments/{id}

Delete a page comment

DESTRUCTIVE and irreversible: permanently removes the comment from the page discussion. The page itself is unaffected.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/pages/comments/{id}

Edit a page comment

Partially updates an existing comment, normally its body text. Does not touch the page content the comment is attached to.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Comment

A comment attached to a page (Notion-style page comment).
  • id string
  • page_id stringID of the page this comment is attached to
  • discussion_id stringDiscussion/thread this comment belongs to; null for a top-level page comment
  • body stringComment text
  • createdBy string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Comment

A comment attached to a page (Notion-style page comment).
  • id string
  • page_id stringID of the page this comment is attached to
  • discussion_id stringDiscussion/thread this comment belongs to; null for a top-level page comment
  • body stringComment text
  • createdBy string
  • createdAt string
  • updatedAt string
404
Not found

POST /api/purple-suite/pages/pages/{id}/move

Move a page under a new parent

Changes only WHERE a page sits in the Purple Pages hierarchy — reparents it by setting parent_id (pass null to move it to the top level). Use this for 'move X under Y' or 'move X to the top level'; use pages__update__pages to change the page's title, content or sharing. The page's content and comments are unaffected.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

application/json — required

  • parent_id string requiredID of the new parent page, or null to move to the top level

Responses

200
Updated page after move

application/json

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string
400
parent_id is required
404
Page not found

POST /api/purple-suite/pages/pages/{id}/duplicate

Duplicate a page

Creates a brand-new page that copies the source page's content, emoji and other fields, titled "<title> (Copy)", and returns it with its new id. Handy for using an existing page as a template; the original is left untouched. Comments on the source page are not copied.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

201
The newly created duplicate page

application/json

Page

  • id string
  • parent_id stringID of the parent page for nested page hierarchy; null for a top-level page. Reparent via POST /pages/{id}/move.
  • title string
  • emoji string
  • createdBy string
  • lastEditedAt stringISO-8601 timestamp of the last edit; set by the client (not auto-managed by the server)
  • shared boolean
  • sharedWith array

    array of:

    string

  • permissions string
  • content arrayRich-text block content of the page
    Rich-text block content of the page

    array of:

    PageBlock

    • id stringBlock UUID
    • type string
    • props object
      • textColor string
      • backgroundColor string
      • textAlignment string
      • level integerHeading level (1–3), present only on heading blocks
    • content array

      array of:

      • type string
      • text string
      • styles object
    • children arrayNested child blocks
      Nested child blocks

      array of:

  • createdAt string
  • updatedAt string
404
Page not found