Purple Grid API Documentation

Machine-readable OpenAPI 3.0 specification: https://marketplace.moveworks.com/api/purple-suite/grid/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=grid, or combined with other apps comma-separated (e.g. ?apps=grid,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/grid/bases

List Grid bases

A base is a Grid workspace (Airtable-style) that owns a set of tables; it sits at the top of the bases → tables → fields/records/views hierarchy, so start here when you don't yet have a baseId. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, … 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:

    Base

    • id string
    • seqId integerClient-supplied display sequence number
    • name string
    • tableCount integer
    • 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/grid/bases

Create a Grid base

Creates an empty base (workspace) that tables can then be added to. Only `name` is meaningful on input — id, tableCount and timestamps are server-assigned.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Base

  • id string
  • seqId integerClient-supplied display sequence number
  • name string
  • tableCount integer
  • createdBy string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Base

  • id string
  • seqId integerClient-supplied display sequence number
  • name string
  • tableCount integer
  • createdBy string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/grid/bases/{id}

Get a Grid base by id

Returns one base's metadata (name, tableCount, creator). Use when you already have a base id; use the list operation to find one by name.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Base

  • id string
  • seqId integerClient-supplied display sequence number
  • name string
  • tableCount integer
  • createdBy string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/grid/bases/{id}

Delete a Grid base

DESTRUCTIVE and irreversible: removes the base record. Its tables/records are not cleaned up, so they are orphaned rather than restored. 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/grid/bases/{id}

Rename or edit a Grid base

Partial update of base-level metadata such as `name`. Does not change the tables or records inside the base.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Base

  • id string
  • seqId integerClient-supplied display sequence number
  • name string
  • tableCount integer
  • createdBy string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Base

  • id string
  • seqId integerClient-supplied display sequence number
  • name string
  • tableCount integer
  • createdBy string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/grid/tables

List Grid tables

A table is a spreadsheet-like grid of records inside one base, and owns its own fields (columns) and views. Pass `baseId` to scope the list to a single base — that is the normal second step after listing bases. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, … 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.
baseIdquerystringnoFilter tables by parent base ID

Responses

200
Paginated list

application/json

  • data array

    array of:

    Table

    • id string
    • seqId integerClient-supplied display sequence number
    • baseId stringID of the parent base
    • name string
    • fieldCount integer
    • recordCount integer
    • 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/grid/tables

Create a Grid table

Adds a table to an existing base. Requires `name` and the parent `baseId`; fieldCount/recordCount are maintained by the server. Create the table before creating its fields or records.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Table

  • id string
  • seqId integerClient-supplied display sequence number
  • baseId stringID of the parent base
  • name string
  • fieldCount integer
  • recordCount integer
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Table

  • id string
  • seqId integerClient-supplied display sequence number
  • baseId stringID of the parent base
  • name string
  • fieldCount integer
  • recordCount integer
  • createdAt string
  • updatedAt string

GET /api/purple-suite/grid/tables/{id}

Get a Grid table by id

Returns one table's metadata (name, parent baseId, field/record counts). Does NOT return the table's rows — use the records list filtered by `tableId` for data.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Table

  • id string
  • seqId integerClient-supplied display sequence number
  • baseId stringID of the parent base
  • name string
  • fieldCount integer
  • recordCount integer
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/grid/tables/{id}

Delete a Grid table

DESTRUCTIVE and irreversible: removes the table definition. Its fields, records and views are left orphaned, not restored. 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/grid/tables/{id}

Rename or edit a Grid table

Partial update of table metadata such as `name` or the parent `baseId`. Does not alter rows or columns.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Table

  • id string
  • seqId integerClient-supplied display sequence number
  • baseId stringID of the parent base
  • name string
  • fieldCount integer
  • recordCount integer
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Table

  • id string
  • seqId integerClient-supplied display sequence number
  • baseId stringID of the parent base
  • name string
  • fieldCount integer
  • recordCount integer
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/grid/fields

List Grid field (column) definitions

A field is a column definition on a table — its name, its type (singleSelect, date, formula, rollup, …) and type-specific `options` such as select choices. Fields describe the SHAPE of a table; the cell values live on records. Pass `tableId` to get one table's columns, e.g. before writing a record. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, … 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.
tableIdquerystringnoFilter fields by parent table ID

Responses

200
Paginated list

application/json

  • data array

    array of:

    Field

    • id string
    • tableId stringID of the parent table
    • name string
    • type string
    • options objectField-type-specific configuration (e.g. choices for singleSelect)
    • 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/grid/fields

Add a column to a Grid table

Defines a new field (column) on the table given by `tableId`: `name`, `type`, and for choice/lookup types an `options` object. Adding a field does not backfill values on existing records.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Field

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • options objectField-type-specific configuration (e.g. choices for singleSelect)
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Field

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • options objectField-type-specific configuration (e.g. choices for singleSelect)
  • createdAt string
  • updatedAt string

GET /api/purple-suite/grid/fields/{id}

Get a Grid field definition by id

Returns one column definition (name, type, options). Use it to learn the legal values of a singleSelect before setting that cell on a record.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Field

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • options objectField-type-specific configuration (e.g. choices for singleSelect)
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/grid/fields/{id}

Delete a Grid field definition

DESTRUCTIVE and irreversible: removes the column definition. Values previously written under that field name stay on the records but become undescribed. 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/grid/fields/{id}

Edit a Grid field definition

Partial update of a column's name, type or `options` (e.g. adding a select choice). Changing `type` does not convert values already stored on records.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Field

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • options objectField-type-specific configuration (e.g. choices for singleSelect)
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Field

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • options objectField-type-specific configuration (e.g. choices for singleSelect)
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/grid/records

List Grid records (table rows)

A record is one row of user data in a Grid table: the built-in name/status/assignee columns plus a free-form `fields` map of cell values keyed by field name. This is the actual content of the Grid app — use fields for column definitions and views for saved layouts. Pass `tableId` to scope to one table. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, … 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.
tableIdquerystringnoFilter records by parent table ID

Responses

200
Paginated list

application/json

  • data array

    array of:

    Record

    • id string
    • seqId integerClient-supplied display sequence number
    • tableId stringID of the parent table
    • name string
    • status string
    • assignee string
    • fields objectArbitrary key-value cell data keyed by field name
    • 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/grid/records

Create a Grid record (row)

Inserts a row into the table given by `tableId`. Set the built-in name/status/assignee columns directly and any custom columns inside `fields`, keyed by the field name from the fields collection.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Record

  • id string
  • seqId integerClient-supplied display sequence number
  • tableId stringID of the parent table
  • name string
  • status string
  • assignee string
  • fields objectArbitrary key-value cell data keyed by field name
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Record

  • id string
  • seqId integerClient-supplied display sequence number
  • tableId stringID of the parent table
  • name string
  • status string
  • assignee string
  • fields objectArbitrary key-value cell data keyed by field name
  • createdAt string
  • updatedAt string

GET /api/purple-suite/grid/records/{id}

Get a Grid record (row) by id

Returns one row with all of its cell values. Use the records list with `tableId` when you don't have the row id.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Record

  • id string
  • seqId integerClient-supplied display sequence number
  • tableId stringID of the parent table
  • name string
  • status string
  • assignee string
  • fields objectArbitrary key-value cell data keyed by field name
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/grid/records/{id}

Delete a Grid record (row)

DESTRUCTIVE and irreversible: permanently removes the row and its cell values. There is no trash or undo. 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/grid/records/{id}

Edit cell values on a Grid record

Partial update of one row — the normal way to change a cell (e.g. move a row's `status`, reassign it, or set a custom column inside `fields`). Only the keys you send are changed.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Record

  • id string
  • seqId integerClient-supplied display sequence number
  • tableId stringID of the parent table
  • name string
  • status string
  • assignee string
  • fields objectArbitrary key-value cell data keyed by field name
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Record

  • id string
  • seqId integerClient-supplied display sequence number
  • tableId stringID of the parent table
  • name string
  • status string
  • assignee string
  • fields objectArbitrary key-value cell data keyed by field name
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/grid/views

List Grid saved views

A view is a saved presentation of one table — its layout (grid, kanban, calendar, gantt, gallery, form), its `filterByFormula` and its sort. Views hold no data of their own; read records for rows. Pass `tableId` to list one table's views. Server-side query: $filter/$select/$orderby/$search/$top/$skip/$count (MCP clients pass these as _filter, _top, … 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.
tableIdquerystringnoFilter views by parent table ID

Responses

200
Paginated list

application/json

  • data array

    array of:

    View

    • id string
    • tableId stringID of the parent table
    • name string
    • type string
    • filterByFormula stringGrid formula used to filter rows in this view
    • sortField string
    • sortDirection 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/grid/views

Create a Grid saved view

Saves a new layout over the table given by `tableId`: a `type` (grid/kanban/calendar/…), an optional `filterByFormula` and a sort field/direction. Creating a view never changes the underlying rows.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

View

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • filterByFormula stringGrid formula used to filter rows in this view
  • sortField string
  • sortDirection string
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

View

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • filterByFormula stringGrid formula used to filter rows in this view
  • sortField string
  • sortDirection string
  • createdAt string
  • updatedAt string

GET /api/purple-suite/grid/views/{id}

Get a Grid saved view by id

Returns one view's configuration (type, filter formula, sort). It does not evaluate the view or return matching rows.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

View

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • filterByFormula stringGrid formula used to filter rows in this view
  • sortField string
  • sortDirection string
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/grid/views/{id}

Delete a Grid saved view

DESTRUCTIVE and irreversible: removes the saved layout. The table's records are unaffected. 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/grid/views/{id}

Edit a Grid saved view

Partial update of a view's name, layout type, `filterByFormula` or sort. Affects presentation only, never record data.

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

View

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • filterByFormula stringGrid formula used to filter rows in this view
  • sortField string
  • sortDirection string
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

View

  • id string
  • tableId stringID of the parent table
  • name string
  • type string
  • filterByFormula stringGrid formula used to filter rows in this view
  • sortField string
  • sortDirection string
  • createdAt string
  • updatedAt string
404
Not found

GET /api/purple-suite/grid/automations

List automations

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:

    Automation

    • id string
    • name string
    • enabled boolean
    • triggerType string
    • triggerField stringField name that triggers the automation (for recordUpdated triggers)
    • actionType string
    • actionConfig objectAction-specific configuration payload
    • runCount integerNumber of times this automation has run
    • lastRunAt stringISO timestamp of the most recent execution
    • 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/grid/automations

Create automation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes

Request body

application/json — required

Automation

  • id string
  • name string
  • enabled boolean
  • triggerType string
  • triggerField stringField name that triggers the automation (for recordUpdated triggers)
  • actionType string
  • actionConfig objectAction-specific configuration payload
  • runCount integerNumber of times this automation has run
  • lastRunAt stringISO timestamp of the most recent execution
  • createdAt string
  • updatedAt string

Responses

201
Created

application/json

Automation

  • id string
  • name string
  • enabled boolean
  • triggerType string
  • triggerField stringField name that triggers the automation (for recordUpdated triggers)
  • actionType string
  • actionConfig objectAction-specific configuration payload
  • runCount integerNumber of times this automation has run
  • lastRunAt stringISO timestamp of the most recent execution
  • createdAt string
  • updatedAt string

GET /api/purple-suite/grid/automations/{id}

Get automation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Found

application/json

Automation

  • id string
  • name string
  • enabled boolean
  • triggerType string
  • triggerField stringField name that triggers the automation (for recordUpdated triggers)
  • actionType string
  • actionConfig objectAction-specific configuration payload
  • runCount integerNumber of times this automation has run
  • lastRunAt stringISO timestamp of the most recent execution
  • createdAt string
  • updatedAt string
404
Not found

DELETE /api/purple-suite/grid/automations/{id}

Delete automation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Responses

200
Deleted

application/json

  • success boolean
404
Not found

PATCH /api/purple-suite/grid/automations/{id}

Update automation

Parameters

NameInTypeRequiredDescription
X-Instance-IDheaderstringyes
idpathstringyes

Request body

Fields to update (partial)

application/json

Automation

  • id string
  • name string
  • enabled boolean
  • triggerType string
  • triggerField stringField name that triggers the automation (for recordUpdated triggers)
  • actionType string
  • actionConfig objectAction-specific configuration payload
  • runCount integerNumber of times this automation has run
  • lastRunAt stringISO timestamp of the most recent execution
  • createdAt string
  • updatedAt string

Responses

200
Updated

application/json

Automation

  • id string
  • name string
  • enabled boolean
  • triggerType string
  • triggerField stringField name that triggers the automation (for recordUpdated triggers)
  • actionType string
  • actionConfig objectAction-specific configuration payload
  • runCount integerNumber of times this automation has run
  • lastRunAt stringISO timestamp of the most recent execution
  • createdAt string
  • updatedAt string
404
Not found